原文地址:https://dwz.cn/zWeX9Z7k
作者:Hollis
文章来源:微信公众号

字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。

上面的箭头可以理解为“存储他的引用”。

当我们在代码中连续创建两个相同的字符串的时候,其实会指向同一个对象。因为当一个字符串被被创建的时候,首先会去这个字符串池中查找,如果找到,直接返回对该字符串的引用。

但是,如果在程序中明确声明要新创建一个字符串的话是可以在堆上重新创建一个对象的。如String s = new String("Hollis")

接着,我们来看两个字符串中常用的操作:截取和连接会发生什么,是在原来的字符串对象上修改还是重新创建字符串呢?

字符串的连接。String s1 = s.concat("Chuang");

字符串的截取。String s1 = s.substring(0,2);

从上图中我们可以得到一个结论,那就是——字符串是不可变的,无论发生什么操作,一个已经创建好的字符串的内容不会被改变,对它的任何类似修改的操作其实都是新生成了一个字符串对象。

那么,为什么要定义出不可变对象呢?

  • 缓存Hashcode

Java中经常会用到字符串的哈希码(hashcode)。例如,在HashMap中,字符串的不可变能保证其hashcode永远保持一致,这样就可以避免一些不必要的麻烦。这也就意味着每次在使用一个字符串的hashcode的时候不用重新计算一次,这样更加高效。

在String类中,有以下代码:private int hash;

以上代码中hash变量中就保存了一个String对象的hashcode,因为String类不可变,所以一旦对象被创建,该hash值也无法改变。所以,每次想要使用该对象的hashcode的时候,直接返回即可。

  • 使其他类的使用更加便利

在介绍这个内容之前,先看以下代码:

在上面的例子中,如果字符串可以被改变,那么以上用法将有可能违反Set的设计原则,因为Set要求其中的元素不可以重复。上面的代码只是为了简单说明该问题,其实String类中并没有value这个字段值。

  • 安全性

String被广泛的使用在其他Java类中充当参数。比如网络连接、打开文件等操作。如果字符串可变,那么类似操作可能导致安全问题。因为某个方法在调用连接操作的时候,他认为会连接到某台机器,但是实际上并没有(其他引用同一String对象的值修改会导致该连接中的字符串内容被修改)。可变的字符串也可能导致反射的安全问题,因为他的参数也是字符串。

  • 不可变对象天生就是线程安全的

因为不可变对象不能被改变,所以他们可以自由地在多个线程之间共享。不需要任何同步处理。

总之,String被设计成不可变的主要目的是为了安全和高效。所以,使String是一个不可变类是一个很好的设计。

同一个字符串hash值相同吗_图说:为什么Java中的字符串被定义为不可变的相关推荐

  1. java中如何检查字符串都是数字_如何在Java中检查字符串是否为数字?

    我们将检查字符串是否为数字-借助逻辑,我们将解决此问题,第一步,我们将使用一个名为str的字符串变量,并将任何值存储在其中. 在第二步中,我们将使用一个名为str_numeric的布尔变量,该变量存储 ...

  2. java中为按钮添加图片_如何在Java中为字符串添加双引号?

    java中为按钮添加图片 In Java, everything written in double-quotes is considered a string and the text writte ...

  3. java字符串字符排列组合_如何在Java中查找字符串的所有排列

    java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...

  4. c语言字符串与字符什么意思,C语言和Java中的字符串异同点是什么?

    2018-04-06 在Turbo C 语言和Java语言中字符串和字符串数组的异同点 1.Turbo C 语言 在C语言中字符串和字符数组基本上没有区别,都需要结束符:如:char s[4]={'a ...

  5. java字符串数组删除_如何从java中的字符串数组中删除特定的值?

    如果必须使用数组,System.arraycopy是最有效,可扩展的解决方案.但是,如果必须多次从数组中删除一个元素,则应使用List的实现而不是数组. 以下使用System.arraycopy以获得 ...

  6. python字符串前面去两位_在Python 3中删除字符串文字前面的'b'字符do

    I am new in python programming and i am a bit confused. I try to get the bytes from a string to hash ...

  7. mysql去除字符串首的非字母_如何从SQLServer中的字符串中删除所有非字母字符?...

    信不信由你,在我的系统中,这个丑陋的功能比G天象优雅的功能表现得更好.CREATE FUNCTION dbo.RemoveSpecialChar (@s VARCHAR(256)) RETURNS V ...

  8. java的包装类不可变_为什么像java中的布尔类包装类是不可变的?

    因为2是2.明天不会是3. 永久性首选是永久性的,特别是在多线程情况下,它使得更容易阅读和更易于维护的代码.例证:Java Date API,它充满了设计缺陷.如果Date是不可变的,API将非常简化 ...

  9. java输入一串字符串反转_反转Java中的字符串

    java输入一串字符串反转 Reverse a String in java is a good coding related interview question. I have seen inte ...

最新文章

  1. Keras中神经网络可视化模块keras.utils.vis_util 的安装
  2. android代码说明文档,android:label说明
  3. JSP page指令
  4. MDSF:在线查看【模型驱动软件工厂】文章汇总
  5. psycopg2 mysql_使用psycopg2操作PostgreSQL数据库之二
  6. system.img格式打包学习
  7. 太原学计算机的职高,山西太原职高学校排名
  8. camvid数据集使用方法_使用PyTorch处理CIFAR10数据集并显示
  9. (教学思路 C#之类五)类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)...
  10. http://www.shengshiyouxi.com
  11. SqlServer显示“正在还原...”
  12. python是什么东西
  13. PyTorch-Transformers:一款可处理最先进NLP的惊人模型库
  14. 【Android MyEclipse】no projects are found to import 如何解决
  15. bilibili怎么用用户名登录_bilibili账号安全中心 | 手游网游页游攻略大全
  16. HTTP防病毒网关(包括UTM)存在的问题
  17. php开发App接口
  18. jsp显示中文文件名的图片 详细出处参考:http://www.jb51.net/article/37149.htm
  19. 靠追热点出圈,网易传媒打造“爆款制造机2.0”
  20. 招商银行信用卡中心笔测

热门文章

  1. 几个与PPT相关的Blog
  2. c#中邮件收发处理(POP3,IMAP,SMTP)的实现方法
  3. 软件工程第二周阅读作业
  4. Windows下程序打包发布时的小技巧
  5. [Runtime]-交换方法
  6. 并发编程之对象的发布和逸出
  7. 正则表达式一些关键字使用
  8. Android数据存储——2.文件存储_B_资源文件
  9. java 跨域_springboot解决跨域CROS问题,用注解@CrossOrigin
  10. mysql利用存储过程批量插入数据