iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java String如何被设计成不可变对象
  • 530
分享到

java String如何被设计成不可变对象

2023-06-19 09:06:11 530人浏览 泡泡鱼
摘要

这篇文章主要介绍“java String如何被设计成不可变对象”,在日常操作中,相信很多人在java String如何被设计成不可变对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java String如何

这篇文章主要介绍“java String如何被设计成不可变对象”,在日常操作中,相信很多人在java String如何被设计成不可变对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java String如何被设计成不可变对象”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、什么是不可变对象

从字面意思也能够理解,也就是我们的创建的对象不可改变。那什么是不可变呢?为了实现创建的对象不可变,java语言要求我们需要遵守以下5条规则:

(1)类内部所有的字段都是final修饰的。

(2)类内部所有的字段都是私有的,也就是被private修饰。

(3)类不能够被集成和拓展。

(4)类不能够对外提供哪些能够修改内部状态的方法,setter方法也不行。

(5)类内部的字段如果是引用,也就是说可以指向可变对象,那我们程序员不能获取这个引用。

正是由于我们的String类型遵循了上面5条规则,所以才说String对象是不可变的。想要去了解他还是看看String类型内部长什么样子再来看上面5条规则吧。

二、String如何被设计成不可变对象的

疑惑一

在看之前,我们先给出一个疑惑问题,我们看下面的代码,

public class Test2 {
    public static void main(String[] args) {
        String a="张三";
        System.out.println(a);
        a="李四";
        System.out.println(a);
    }
}
//output:
//张三
//李四
 

在文章一开始我们就说了,String对象是不可变的,这里a=张三,然后a=李四,这符合String的不可变性嘛?答案是当然符合。

java String如何被设计成不可变对象

从上面这张图我们可以看到,在第一次String a="张三"的时候,在堆中创建了同一个对象“张三”。后来我们在执行a="李四"的时候再内存中又创建了一个对象“李四”。也就是说我们的a仅仅只是改变了引用a指向的地址而已。

源码解释疑惑

既然a指向的引用地址改变了,那么其String内部肯定有一个变量,能够指向不同的实际对象,想要进一步弄清楚我们就进入其String的内部来看看。

我们在这里主要通过String类的源码来分析,看一下Java语言是如何设计,能把String类型设计成不可变的。这里给出的是jdk1.8的一部分源码。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    private final char value[];

    
    private int hash; // Default to 0
    ......
}
 

上面最主要的是两个字段:value和hash。我们在这里主要是看value数组,hash和主题无关所以这里不再讲解了,我有专门的文章介绍hash。

我们的String对象其实在内部就是一个个字符然后存储在这个value数组里面的。但是value对外没有setValue的方法,所以整个String对象在外部看起来就是不可变的。我们画一张图解释一下上面的疑惑

java String如何被设计成不可变对象

现在明白了吧,也就是说真正改变引用的是value,因为value也是一个数组引用。这也可以很方便的解释下一个疑惑问题了。

疑惑二

既然我们的String是不可变的,好像内部还有很多substring, replace, replaceAll这些操作的方法。好像都是对String对象改变了,解释起来也很简单,我们每次的replace这些操作,其实就是在堆内存中创建了一个新的对象。然后我们的value指向不同的对象罢了。

面试的时候我们只是解释上面的原因其实不是那么尽善尽美,想要更好的去加薪去装逼,我们还需更进一步回答。

三、有什么办法能够改变String

既然有这个标题。那肯定就是有办法的,别忘了我们的反射机制,在通常情况下,他可以做出一些违反语言设计原则的事情。这也是一个技巧,每当面试官问一些违反语言设计原则的问题,你就可以拿反射来反驳他。下面我们来看一下:

public class Test2 {
    public static void main(String[] args) {
        String str = "张三";
        System.out.println(str);
        try {
            //我们通过反射获取内部的value字符数组
            Field field = String.class.getDeclaredField("value");
            field.setAccessible(true);
            char[] value;
            value = (char[]) field.get(str);
            //把字符串第一个字符变成王
            value[0] = '王';
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//output:
//张三
//王三
 

我们可以通过反射来改变String。

现在我们知道它的原理以及用法,也知道可以通过反射来改变String,还有一个问题我们没有弄清楚,面试的时候你也可以反问他,来进一步提升自己的逼格。

四、JAVA语言为什么把String类型设计成不可变

这里有几个特点。

第一:在Java程序中String类型是使用最多的,这就牵扯到大量的增删改查,每次增删改差之前其实JVM需要检查一下这个String对象的安全性,就是通过hashcode,当设计成不可变对象时候,就保证了每次增删改查的hashcode的唯一性,也就可以放心的操作。

第二:网络连接地址URL,文件路径path通常情况下都是以String类型保存, 假若String不是固定不变的,将会引起各种安全隐患。就好比我们的密码不能以String的类型保存,,如果你将密码以明文的形式保存成字符串,那么它将一直留在内存中,直到垃圾收集器把它清除。而由于字符串被放在字符串缓冲池中以方便重复使用,所以它就可能在内存中被保留很长时间,而这将导致安全隐患

第三:字符串值是被保留在常量池中的,也就是说假若字符串对象允许改变,那么将会导致各种逻辑错误

到此,关于“java String如何被设计成不可变对象”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: java String如何被设计成不可变对象

本文链接: https://www.lsjlt.com/news/295249.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java String如何被设计成不可变对象
    这篇文章主要介绍“java String如何被设计成不可变对象”,在日常操作中,相信很多人在java String如何被设计成不可变对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java String如何...
    99+
    2023-06-19
  • 如何创建Java的不可变对象
    如何创建Java的不可变对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言:为什么 String 是 immutable 类(不可变对象)吗我想研究它,想知...
    99+
    2023-06-25
  • Java中的String对象不可改变的特性有哪些
    Java中的String对象不可改变的特性有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. String对象不可改变的特性下图显示了如下代码运行的过程:...
    99+
    2023-05-31
    java string ava
  • 创建一个Java的不可变对象
    目录01、什么是不可变类02、常见的不可变类1)常量池的需要2)hashCode 的需要3)线程安全03、手撸不可变类04、总结前言: 为什么 String 是 immutable ...
    99+
    2024-04-02
  • php 对象如何变成数组
    在PHP中,对象可以很方便地进行操作,但有时候需要将对象转换为数组或将对象的属性和方法以数组形式进行处理。本文将详细介绍如何将PHP对象转换为数组的方法。一般来说,对象转换为数组的方法有两种:一种是使用对象的内置方法进行转换,另一种是通过自...
    99+
    2023-05-24
  • Java如何将String转换成json对象或json数组
    目录将String转换成json对象或json数组字符串转json数组的解决首先导入 net.sf.json.JSONArray和net.sf.json.JSONObject 两个j...
    99+
    2024-04-02
  • Java中需要将字符串设计成不可变的原有是什么
    这篇文章给大家介绍Java中需要将字符串设计成不可变的原有是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。String是Java中一个不可变的类,所以他一旦被实例化就无法被修改。不可变类的实例一旦创建,其成员变量的...
    99+
    2023-05-31
    java 字符串 ava
  • linux如何设置成不可变的文件,不能被删除、修改、重命名或者链接
    ...
    99+
    2024-04-02
  • java如何生成可变表头的excel
    本文为大家分享了java生成可变表头excel的具体步骤,供大家参考,具体内容如下1、实现功能:  传入一个表头和数据,将数据导入到excel中。  为了便于项目的扩展,数据传入通过泛型集合传入,获取数据时,通过反射的方式获取,这样无论你的...
    99+
    2023-05-31
    java 可变表头 excel
  • java文件如何变成可执行文件
    要将Java文件转换为可执行文件,您需要将Java文件编译为字节码文件(.class文件),然后将其打包为JAR文件。以下是将Jav...
    99+
    2023-10-07
    java
  • JVM如何判断一个对象是否可以被回收
    这篇文章给大家分享的是有关JVM如何判断一个对象是否可以被回收的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.背景Java语言相比于C和C++,一个最大的特点就是不需要程序员自己手动去申请和释放内存,这一切交由...
    99+
    2023-06-14
  • 在Java项目中如何将对象转换为String
    在Java项目中如何将对象转换为String?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java中对象转换为String的常用方法:  方法一:String&...
    99+
    2023-05-31
    java string ava
  • java面向对象设计原则之合成复用原则示例详解
    目录概念示例拓展概念 尽量使用合成/聚合,而不是使用继承实现复用。所谓的合成/聚合是指一个对象里持有另外一个类的对象,通过调用这些对象的方法得到复用已有功能的目的。如:报文解译程序中...
    99+
    2024-04-02
  • Java对象是如何在Apache和NPM中演变的?
    随着计算机技术的不断进步,Java作为一种强大的编程语言,被广泛应用于软件开发中。在开发过程中,Java对象是非常重要的一部分,因为它们是构建Java程序的基本单位。但是,Java对象在Apache和NPM中的演变也是值得关注的。 Apa...
    99+
    2023-08-19
    对象 npm apache
  • 如何使用Go中的对象和函数来设计可扩展的框架?
    Go语言是一种非常流行的编程语言,它的简洁性和高效性使得它成为了很多人的首选语言。在Go中,对象和函数是两个非常重要的概念,我们可以使用它们来设计可扩展的框架。在本文中,我们将介绍如何使用Go中的对象和函数来设计可扩展的框架,并提供一些示...
    99+
    2023-11-02
    对象 函数 框架
  • 如何在Java中创建一个String字符串对象
    这篇文章将为大家详细讲解有关如何在Java中创建一个String字符串对象,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java中字符串对象创建有两种形式,一种为字面量形式,如String ...
    99+
    2023-05-31
    java string 字符串
  • java如何证明字符串是不可变的
    这篇文章主要介绍了java如何证明字符串是不可变的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何证明字符串是不可变的字符串不可变的这个事我曾写过两篇文章,写到最后我都要吐...
    99+
    2023-06-27
  • Android设计编辑器不可用如何解决
    如果Android设计编辑器不可用,可以尝试以下解决方法:1. 重启编辑器:关闭设计编辑器并重新打开,有时候这可以解决临时的问题。2...
    99+
    2023-10-12
    Android
  • python环境变量设置不成功如何解决
    如果在设置Python环境变量时遇到问题,可以尝试以下几种解决方法: 检查环境变量设置是否正确:确保已正确设置Python的安装...
    99+
    2024-04-02
  • 如何使用Python中的面向对象设计模式
    如何使用Python中的面向对象设计模式,需要具体代码示例概述:在Python编程中,面向对象设计模式是非常重要的一个概念。它提供了一种结构化的方法来解决问题,并使得代码更易于理解、维护和扩展。本文将介绍几种常见的面向对象设计模式,并提供具...
    99+
    2023-10-22
    Python 设计模式 面向对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作