Java字符串那些事儿
来源:互联网 发布:黑马程序员视频教程 编辑:程序博客网 时间:2024/05/16 11:57
我们再来看一段代码:
运行一下:
没错,一个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对象内容时,无论是怎么声明的,都一定要使用equals去比较,不能用==,在Java中没有重载操作符这一说,特别是从其它语言转到Java的童鞋们要注意。equals我会在后续专栏里已经做了详细解说。
作者:清浅池塘
链接:https://juejin.im/post/59c8996f6fb9a00a4746dff0
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- Java字符串那些事儿
- 【java解惑】java字符串比较那些事儿
- Java那些事儿之字符串和列表
- Java中字符串的那些事儿
- Java编程那些事儿
- Java编程那些事儿
- Java编译那些事儿
- Java this 那些事儿
- Java super 那些事儿
- Java数组那些事儿
- Java编译那些事儿
- Java正则那些事儿。。
- 曹胜欢,java那些事儿
- Java编程那些事儿
- Java 注解那些事儿
- Java 注解那些事儿
- JAVA的那些事儿
- java虚拟机那些事儿
- 10款值得收藏的网站数据实时分析工具
- easyui中移除combobox中的一条数据
- 独家 | 千亿交易额考验下的智慧物流
- 数据分析基础内容介绍 — 模型、工具、统计、挖掘与展现
- 数据驱动教育变革思享会 | 教育大数据企业平方创想走访活动回顾
- Java字符串那些事儿
- 进程、线程、轻量级进程(LWP)
- 巧用心理学,高效优化网站转化率
- 独家 | 清华黄民烈:人机对话的典型技术、面临挑战和发展方向
- numpy diff函数
- js中setTimeout()与setInterval()
- 说说Java里的equals(上)
- 在java中如何跳出当前的多重嵌套循环?
- HttpClientUtil工具