浅谈String

kao331431214 2009-01-13 12:18:14
话说一篇“String问题IBM面试”激起千层浪

先后出现“一场IBM面试题引发的讨论:创建String对象过程中【内存分配】的终极权威详尽解释

【向ZangXT等大侠提问】关于创建String新对象问题的8种情况”等等。

我又搜索了下发现很久之前的帖子“(原创)深入研究java对String字符串对象的创建以及管理

其中主要的问题归纳起来是(后面引用时用数字代替)

1.String a = "ab";//争论是1个还是2个

2.String a = "a" + "b";//争论1个 2个 还是3个

3.String a = new String("ab");//这个基本都认为是2个

这三种情况个创立了几个对象(我这里只讨论String对象)

我们先说说1与3的区别

查阅了一下《Java程序设计与数据结构导论》里面说:

虽然字符串不是基本数据类型,但是它非常基础,也经常使用,正因为如此,Java用一对双引号来定义字符串常量。

这是一直简便的表达法。出现字符串常量时,系统自动创建一个String对象。

也就是说,对String对象,不必非得明确使用new来调用其构造方法。大多数情况下,可以使用这种简化语法。

我们看到上面红字的地方 大多数情况下效果是一样的 区别就在与使用new就要调用其构造方法

那么是不是说1和3就是一样的呢?话说尽信书不如不读书。

那我们再来看看最权威的API(1.6版)

找到String类

Code
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
例如:


String str = "abc";

等效于:


char data[] = {'a', 'b', 'c'};
String str = new String(data);




我们看到 String对象实际上就是char 数组

说明1和3都是创建了两个String对象 而1比3多创建了一个char数组

那我们再来看看2

由于API的解释 2等效于:

char data[] = {'a'};

char data1[] = {'b'};

String str = new String(data + data1);

这说明2也只创建了2个String对象 (之前创建了2个char数组)



慢慢想来 在下说的有所遗漏 权当抛砖引玉 大家见笑了
(由于发帖后不能修改,我会在我的博客上保持更新)


...全文
310 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lh2006 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ZangXT 的回复:]
能推测是个好的习惯,但是推测了最好能找东西证明自己的想法.
这个问题不想多说了,建议有兴趣的话自己去看jvm规范,说的比较明白了.
还有一个建议,看书要学思路,学解决问题的手段和方式,而不是记忆结论.比如很多人看到String的+ 操作就说从Thinking In Java上看到的,+是用StringBuilder连接的,记住结论了,却没有分析结论适应的条件,完全不看作者是怎么分析的,估计Bruce Eckel会很遗憾.
有精…
[/Quote]
支持!
dingzhiming 2009-01-14
  • 打赏
  • 举报
回复
ok
LoginOut 2009-01-14
  • 打赏
  • 举报
回复
2.String a = "a" + "b";//争论1个 2个 还是3个

可以看看老紫竹的博客上面有说明
答案是创建了一个对象
imasmallbird 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ZangXT 的回复:]
能推测是个好的习惯,但是推测了最好能找东西证明自己的想法.
这个问题不想多说了,建议有兴趣的话自己去看jvm规范,说的比较明白了.
还有一个建议,看书要学思路,学解决问题的手段和方式,而不是记忆结论.比如很多人看到String的+ 操作就说从Thinking In Java上看到的,+是用StringBuilder连接的,记住结论了,却没有分析结论适应的条件,完全不看作者是怎么分析的,估计Bruce Eckel会很遗憾.

[/Quote]
呵呵~
飞过~~
kao331431214 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ZangXT 的回复:]
能推测是个好的习惯,但是推测了最好能找东西证明自己的想法.
这个问题不想多说了,建议有兴趣的话自己去看jvm规范,说的比较明白了.
还有一个建议,看书要学思路,学解决问题的手段和方式,而不是记忆结论.比如很多人看到String的+ 操作就说从Thinking In Java上看到的,+是用StringBuilder连接的,记住结论了,却没有分析结论适应的条件,完全不看作者是怎么分析的,估计Bruce Eckel会很遗憾.

[/Quote]
多谢企鹅兄的建议
对这个问题我也不是想对其进行深入的了解
只是对最近的帖子有感而发罢了

Pol 2009-01-13
  • 打赏
  • 举报
回复
完全搞不懂啊。学习。。
ZangXT 2009-01-13
  • 打赏
  • 举报
回复
能推测是个好的习惯,但是推测了最好能找东西证明自己的想法.
这个问题不想多说了,建议有兴趣的话自己去看jvm规范,说的比较明白了.
还有一个建议,看书要学思路,学解决问题的手段和方式,而不是记忆结论.比如很多人看到String的+ 操作就说从Thinking In Java上看到的,+是用StringBuilder连接的,记住结论了,却没有分析结论适应的条件,完全不看作者是怎么分析的,估计Bruce Eckel会很遗憾.
有精力做点有意义的事情吧,远离这种空谈.
风中舞者 2009-01-13
  • 打赏
  • 举报
回复
lz,api中是这么写的


Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example:

String str = "abc";

is equivalent to:

char data[] = {'a', 'b', 'c'};
String str = new String(data);


它是说这种写法可以理解为(等效于)先定义一个字符数组,再用它来初始化一个String。但是这并不是说在程序运行中第一种写法是这么执行的。

写得很清楚,lz理解错了。
酒剑仙 2009-01-13
  • 打赏
  • 举报
回复
关注下
就是普通的字符串 都在常量池里。不算对象。
只有被赋给变量时,才在内存模块分配空间。产生对象。
而该变量被其他引用时,不算对象。
我是这么理解的。
wbo112 2009-01-13
  • 打赏
  • 举报
回复
关注
kao331431214 2009-01-13
  • 打赏
  • 举报
回复
SF不留嘿嘿
fulianglove 2009-01-13
  • 打赏
  • 举报
回复
各有各的理解,求同存异就ok了
kao331431214 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fulianglove 的回复:]
珍爱生命,远离String
嘿嘿
[/Quote]
再谈我们就都晕了
各位散了哈

结贴~~~~~~~~
kkxx1254 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 AeolusLau 的回复:]
lz,api中是这么写的


Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example:

String str = "abc";

is equivalent to:

char data[] = {'a', 'b', 'c'};
String str = new String(data);


它是说这种写法可以理解为(等效于)先定义一个字符数组,…
[/Quote]
楼主的说法有点悬,支持一下5楼。《Effective Java》曾建议never use this: String str=new String("a");而应该用String str="a";
照楼主的分析似乎与之正好相反,难道真是“尽信书不如无书”?
xinqing0602 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ZangXT 的回复:]
能推测是个好的习惯,但是推测了最好能找东西证明自己的想法.
这个问题不想多说了,建议有兴趣的话自己去看jvm规范,说的比较明白了.
还有一个建议,看书要学思路,学解决问题的手段和方式,而不是记忆结论.比如很多人看到String的+ 操作就说从Thinking In Java上看到的,+是用StringBuilder连接的,记住结论了,却没有分析结论适应的条件,完全不看作者是怎么分析的,估计Bruce Eckel会很遗憾.

[/Quote]
觉得比较有道理
就是当初开发java的那些牛人,理解的和我们估计都不一样。
要不咋出现这么多的书呢。只要道理一样就行了。
adanssxz 2009-01-13
  • 打赏
  • 举报
回复
越来越晕了。。。
KingNE 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 java2000_net 的回复:]
呵呵!这个问题讨论的太久了。
[/Quote]
ZiSheng 2009-01-13
  • 打赏
  • 举报
回复
小明顶你,呵呵
张志峰 2009-01-13
  • 打赏
  • 举报
回复
关注
chenlili421 2009-01-13
  • 打赏
  • 举报
回复
关注
加载更多回复(6)

62,614

社区成员

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

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