发了聊天记录,引出大家对java中优化现象的了解。

myoswin7 2010-05-11 10:49:04
北京-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
哦了

...全文
150 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ll0210 2010-06-01
  • 打赏
  • 举报
回复
路过 。。。。。。。。。。。
shine333 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zangxt 的回复:]

引用 10 楼 zfq642773391 的回复:
private final加上编译优化现在已经不用了吧

貌似从来就没用过。
很早的书《Practical Java》就说javac不处理编译优化的,现在的编译器也不处理优化。优化是jvm的事情。
[/Quote]

我还有台586,上面保留着JDK1.1,改天试试看。
crazylaa 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 believefym 的回复:]

还真要每个月都来n次?
[/Quote]

女人是MC,month clock
这个绝对的WC..... week clock...非厕所啊
龙四 2010-05-11
  • 打赏
  • 举报
回复
名副其实的月经贴
soli11722984 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 believefym 的回复:]
还真要每个月都来n次?
[/Quote]

正常现象。。。。。。
myoswin7 2010-05-11
  • 打赏
  • 举报
回复
大家能给出java优化的其他情形和实例吗?

比如说hashmap

比如说临时对象

等等

还有大家对jvm的研究

都分享出来吧
myoswin7 2010-05-11
  • 打赏
  • 举报
回复

package com.test.string;

public class AboutEquals {

public static void main(String arg[]) {
AboutEquals ae= new AboutEquals();
ae.fun1();
ae.fun2();
ae.fun3();
}

void fun1() {
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);
}

void fun2() {
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
}

void fun3() {
String s1 = new String("Hello");
String s2 = "Hello";
System.out.println(s1 == s2);
}

}




输出
true
false
false
believefym 2010-05-11
  • 打赏
  • 举报
回复
还真要每个月都来n次?
ZangXT 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zfq642773391 的回复:]
private final加上编译优化现在已经不用了吧
[/Quote]
貌似从来就没用过。
很早的书《Practical Java》就说javac不处理编译优化的,现在的编译器也不处理优化。优化是jvm的事情。
zfq642773391 2010-05-11
  • 打赏
  • 举报
回复
private final加上编译优化现在已经不用了吧
ZangXT 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shine333 的回复:]
曾经,还是JDK1.0/1.1的时候,书上说, private final加上编译优化,会导致这个方法被内联到调用处。我已经记不得自己是否测试过。
[/Quote]
应该不是的。
javac的编译优化一直是个摆设,编译器根本不处理。
final是否内联看虚拟机了。
shine333 2010-05-11
  • 打赏
  • 举报
回复
String 优化,记住编译期能确定的,一定会给你全优化了。

曾经,还是JDK1.0/1.1的时候,书上说, private final加上编译优化,会导致这个方法被内联到调用处。我已经记不得自己是否测试过。
whut_lcy 2010-05-11
  • 打赏
  • 举报
回复
啥都不用优化,内存这么便宜了,买他几百GT的内存条,装个几百个核的西皮优给服务器 哈哈哈哈,看丫的够不够折腾!!!!!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧