发了聊天记录,引出大家对java中优化现象的了解。
北京-JAVA(136361939) 10:08:43
String s1 = new String("Hello");
String s2 = "Hello";
System.out.println(s1 == s2);
结果false???????????
北京-JAVA(136361939) 10:09:54
谁能讲解一下
北京--二锅头(151298567) 10:10:28
北京--二锅头(151298567) 10:10:56
String Pool 跟堆的对象不是同一个
武汉-雨中垂钓(121399522) 10:11:21
s1 == s2
你知道比的是什么吗?
武汉-雨中垂钓(121399522) 10:11:38
是指针(引用)
上海—周宇(99697720) 10:11:38
字符串
北京-JAVA(136361939) 10:11:40
你的意思是说String s1 = new String("Hello");
实在堆里建立的
武汉-雨中垂钓(121399522) 10:11:55
你觉得他们两个的指针一样吗?
湖南--中天下(1045724135) 10:12:06
e
北京--二锅头(151298567) 10:12:08
呵呵,必须在堆里面
北京-JAVA(136361939) 10:12:16
String s2 = "Hello";
这里的"hello"是在静态常量区建立的·?
北京-JAVA(136361939) 10:12:20
呵呵
上海-稻草人<kaka_cronaldo@sina.com> 10:12:29
读读 Think in java 把·
武汉-雨中垂钓(121399522) 10:12:39
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
又会有什么结果呢?
北京-JAVA(136361939) 10:13:07
说法不准确
北京-JAVA(136361939) 10:13:23
我是从c++里面转过来的
北京-JAVA(136361939) 10:13:24
呵呵
北京--二锅头(151298567) 10:15:11
你要知道String是这样的String s1 = new String("Hello");这句话实际上是创建了两个对象
北京--二锅头(151298567) 10:15:53
第一个是在String Pool中的一个Hello的对象,一个是在堆里面的Hello对象
北京-JAVA(136361939) 10:16:03
我想问一下
北京-JAVA(136361939) 10:16:09
java对内存的管理
北京-JAVA(136361939) 10:16:15
都分成几个部门呀
北京--二锅头(151298567) 10:16:38
String s2 = "Hello";这句话实际上没有创建任何对象,而是直接将引用指向了Sting Pool中的那个Hello对象
北京--二锅头(151298567) 10:16:47
这两个对象的引用肯定是不一样的
北京-JAVA(136361939) 10:16:53
我知道c++有 静态常量去 字符常量区,全局变量区 栈,堆
北京-JAVA(136361939) 10:17:01
java上有相应的说法吗
北京--二锅头(151298567) 10:17:16
汗,有必要研究这么深么
北京-JAVA(136361939) 10:18:12
有啊
广州-司马(17997912) 10:18:29
就是盏和堆
北京-JAVA(136361939) 10:18:45
不能使栈
北京--二锅头(151298567) 10:18:46
这个问题无非就是String池跟堆得概念啊
北京--二锅头(151298567) 10:20:20
以能做出东西为主要,呵呵
北京-JAVA(136361939) 10:20:50
做出东西偶尔把玩一下这个东东也有意思呀
北京--二锅头(151298567) 10:21:34
java内存想研究的话,你可以看看深入java虚拟机这本书,这本书讲的不错,但是我没看多少,呵呵
北京-JAVA(136361939) 10:21:58
哦
北京--二锅头(151298567) 10:22:54
而刚才的问题只要你知道String池中的对象跟堆对象是两个对象就可以了
北京--二锅头(151298567) 10:23:04
问题解决
北京--二锅头(151298567) 10:23:07
北京-JAVA(136361939) 10:23:28
哦
北京-JAVA(136361939) 10:23:32
好的
北京-JAVA(136361939) 10:23:44
3qq
北京--二锅头(151298567) 10:23:59
呵呵,不客气,互相学习
北京-JAVA(136361939) 10:26:54
武汉-雨中垂钓(121399522) 10:12:39
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
又会有什么结果呢?
北京-JAVA(136361939) 10:26:59
结果也是false
北京-JAVA(136361939) 10:27:57
这是为什么呢?
杭州--九折幸福(812273181) 10:28:47
绿色版的tomcat 如何重启????
北京--二锅头(151298567) 10:32:49
北京--二锅头(151298567) 10:33:31
java中只要有new关键字出现的话,肯定在堆里面是两个对象,所以说这两个引用的地址肯定不一样的
北京-JAVA(136361939) 10:33:44
哦了
北京--二锅头(151298567) 10:34:15
并且此时你这个程序在内存中一共有三个String对象存在,第三个Sting对象就是在String池里面的
北京-JAVA(136361939) 10:34:53
第三个对象为什么还要存在呀
北京-JAVA(136361939) 10:35:56
String s1 = new String("Hello");
String s2 = new String("World");
会不会就是存在是个对象?
北京--二锅头(151298567) 10:36:21
你这个程序在内存中就是4个对象了
北京-JAVA(136361939) 10:36:35
哦2
北京--二锅头(151298567) 10:36:36
String池里面两个,堆里面两个
北京-JAVA(136361939) 10:36:38
哦2
北京--二锅头(151298567) 10:37:12
原因很简单,java中对String做了一些优化工作
北京--二锅头(151298567) 10:37:25
String Pool就是为了这个目的
北京-JAVA(136361939) 10:37:32
对于别的类,会不会也有这种情况呀
北京-JAVA(136361939) 10:38:03
比如说我
MyClass s1 = new MyClass("Hello");
北京--二锅头(151298567) 10:38:17
这个是不会有池的概念的
北京-JAVA(136361939) 10:38:22
哦
北京--二锅头(151298567) 10:38:27
Hello是
北京-JAVA(136361939) 10:38:34
那像String这种情形
北京--二锅头(151298567) 10:38:38
因为Hello是一个字符串
北京-JAVA(136361939) 10:38:40
还有别的吗
北京--二锅头(151298567) 10:38:52
。。。。。。。。
北京-JAVA(136361939) 10:39:10
String 有pool有优化
北京-JAVA(136361939) 10:39:24
别的类还有这样相似的吗
北京--二锅头(151298567) 10:39:45
其他的类优化策略建议你看看相关文档,直接给你讲的话可能说不清楚,你比如说HashMap等等
北京--二锅头(151298567) 10:39:51
这些都是有优化的
北京-JAVA(136361939) 10:39:55
哦
北京--二锅头(151298567) 10:40:15
集合中的散列的概念就是一种优化
北京-JAVA(136361939) 10:40:20
哦
北京--二锅头(151298567) 10:41:10
当然String是一种特殊情况
北京--二锅头(151298567) 10:41:47
java是为了提高效率才为String单独开了一个Pool的概念的
北京-JAVA(136361939) 10:41:58
哦
北京-JAVA(136361939) 10:42:19
和c++上差不多,有个相似的概念吧,叫字符串常量区
北京--二锅头(151298567) 10:42:36
呵呵,C++我不懂,
北京--二锅头(151298567) 10:42:42
可能是吧
北京-JAVA(136361939) 10:46:33
这个是true
北京-JAVA(136361939) 10:46:43
还有深入的兴趣吗
广东-岭南才子(254475842) 10:46:45
就是传递中文的时候出错
北京--二锅头(151298567) 10:49:30
这个是4个对象了,呵呵,你很喜欢钻研,
北京--二锅头(151298567) 10:50:00
因为并没有new关键字,所以都是在池里面的
北京--二锅头(151298567) 10:50:32
最终拼出来的abc赋值给了S1,而S2也是池里的abc所以说肯定是true
北京-JAVA(136361939) 10:50:48
哦了