String那些事
2017-08-19 11:16
169 查看
先看一段代码
运行一下:
没错,一个true,一个是false,大家可能在想编译器肯定又调皮了,编译的时候是不是又偷偷加了些什么,迫不及待的打开class文件看一下:
除了删掉了空行以外和我的java源文件一致呀,那为什么会导致不同的结果呢?我们都知道,Java代码是运行在JVM里的,那是不是JVM在执行这段代码时给我们做了什么?
在JVM中,当代码执行到String s1 = “100” 时,会先看常量池里有没有字符串刚好是“100”这个对象,如果没有,在常量池里创建初始化该对象,并把引用指向它,如下图,绿色部分为常量池,存在于堆内存中。
当执行到String s2 = “100” 时,发现常量池已经有了100这个值,于是不再在常量池中创建这个对象,而是把引用直接指向了该对象,如下图:
这时候我们打印System.out.println(s1 == s2)时,由于==是判断两个对象是否指向同一个引用,所以这儿打印出来的就应该是true。
继续执行到Strings3 = new String(“100”) 这时候我们加了一个new关键字,这个关键字呢就是告诉JVM,你直接在堆内存里给我开辟一块新的内存,如下图所示:
继续执行String s4 = new String(“100”)
这时候再打印System.out.println(s3 == s4) 那一定便是false了,因为s3和s4不是指向对一个引用(对象)。
注:图中只是画出了main方法栈和相关对象在内存中的大致模拟,实际中JVM中内存管理比较复杂,大家有条件的话可以去找《Java虚拟机规范》这本书去深入研究。
我们在写代码过程中,为了避免重复的创建对象,尽量使用String s1 =”123” 而不是String s1 = new String(“123”),因为JVM对前者给做了优化。
结论:我们在比较两个String对象内容时,无论是怎么声明的,都一定要使用equals去比较,不能用==
运行一下:
没错,一个true,一个是false,大家可能在想编译器肯定又调皮了,编译的时候是不是又偷偷加了些什么,迫不及待的打开class文件看一下:
除了删掉了空行以外和我的java源文件一致呀,那为什么会导致不同的结果呢?我们都知道,Java代码是运行在JVM里的,那是不是JVM在执行这段代码时给我们做了什么?
在JVM中,当代码执行到String s1 = “100” 时,会先看常量池里有没有字符串刚好是“100”这个对象,如果没有,在常量池里创建初始化该对象,并把引用指向它,如下图,绿色部分为常量池,存在于堆内存中。
当执行到String s2 = “100” 时,发现常量池已经有了100这个值,于是不再在常量池中创建这个对象,而是把引用直接指向了该对象,如下图:
这时候我们打印System.out.println(s1 == s2)时,由于==是判断两个对象是否指向同一个引用,所以这儿打印出来的就应该是true。
继续执行到Strings3 = new String(“100”) 这时候我们加了一个new关键字,这个关键字呢就是告诉JVM,你直接在堆内存里给我开辟一块新的内存,如下图所示:
继续执行String s4 = new String(“100”)
这时候再打印System.out.println(s3 == s4) 那一定便是false了,因为s3和s4不是指向对一个引用(对象)。
注:图中只是画出了main方法栈和相关对象在内存中的大致模拟,实际中JVM中内存管理比较复杂,大家有条件的话可以去找《Java虚拟机规范》这本书去深入研究。
我们在写代码过程中,为了避免重复的创建对象,尽量使用String s1 =”123” 而不是String s1 = new String(“123”),因为JVM对前者给做了优化。
结论:我们在比较两个String对象内容时,无论是怎么声明的,都一定要使用equals去比较,不能用==
相关文章推荐
- C语言字符串的常见特殊操作(除了string.c实现的那些接口)
- 项目中那些事|string.xml 那些不为人知的事
- string.intern()那些事
- C语言字符串的常见特殊操作(除了string.c实现的那些接口)
- 关于导出String到Excel中的那些事
- C语言字符串的常见特殊操作(除了string.c实现的那些接口)
- string的那些坑
- c++中 有关自定义string的那些为什么
- 关于String的那些面试有可能被问到的函数。
- swift3.0遇到的那些坑之NSClassFromString
- String、StringBuilder和StringBuffer的那些事儿
- Groovy中那些神奇注解之ToString
- Android开发中的那些坑之-------------string.xml里面的通配符
- 项目实战:关于format(String)你不知道的那些事
- String.split("") 你不知道的那些事情
- (那些過時的) Python 字串格式化以及 f-string 字串格式化
- Groovy中那些神奇注解之ToString
- java中那些关于String的面试题
- java string replace 的那些事
- 那些开12+的大哥们,有没有不知道 如何给数字前面补0,如何用逗号把一个Liststring连接起来变成一个string,如何单纯的给Liststring连接起