日期:2014-05-20  浏览次数:20729 次

我对String的一些见解(看了JAVA面试题解惑系列(二)——到底创建了几个String对象?之后)
前几天 拜读了zangweiren兄的大作 JAVA面试题解惑系列(二)——到底创建了几个String对象?
http://topic.csdn.net/u/20080630/19/BEAB5990-FEE8-43F8-B6F4-882B4B04C89C.html
当时只是简单的看了下 差不多感觉明白了 也就没管了
但是今天 群里的一个朋友提问关于String的一些问题 当时就把那篇帖子推荐给他了
他看完后 我们讨论了下 有些争执 于是乎 晚上花了点时间 查阅资料 重新整理了下我的看法
发表下 有不足之处 望各位大大指出 不慎感激
(看的时候最好参照下zangweiren兄的帖子,链接上面给出了)


String a = "abc"这种 在字符串常量池里创建对象 这个书上有明确写 常量池里保存字符串对象  
然后 String a = new String("abc");这种 先在字符串常量池里创建一个对象
就是"abc"
完了堆上创建一个 就是new String() 
他们引用相同的char数组 这个看String类的构造方法就可以确定 value(String类中char[]类型的字段 
保存String的值)是直接赋值的 也就是传递引用
同时 根据构造方法 String(String orginal)也可以确定String a = new String("abc")是创建了两个对象
至于zangweiren兄帖子里最后总结的 String a = “abc" 这种 他说是常量池一个 然后堆上又创建了一个 
我不认可这个观点 因为简单点理解的话
new操作符创建字符串 都是在堆上 然后由于java对String的特殊定义 (字符串不能改变 方便共享) 所以引进字所以引进字符串常量池 由String类进行管理 把引号引其来的字符串(书上称为规范化字符串或字符串直接量)
放在常量池 方便共享 所以说 String a = "abc"这种可以看作一中特殊的创建对象的方式
是java设计者们为String类型量身定做的  
但是也没办法验证 而之前所说的那些 都编程验证过了(原谅我比较懒 都比较简单 大家可以自己写写)  

还有就是char[] 的数组是不是存放在栈上 这个还不确定 因为根据面向过程的学习经验(不敢说编程经验 
 因为没写过什么程序 大部分时间都是看别人的代码 呵呵) 数组一般是放在栈上的 但是当比较大的时候 都是用malloc等分配空间的函数创建的 但是java里数组又是用new操作符创建的 所以总认为它是存放在堆上的 这个查了下书 书上没有说 BAIDU也没查到 所以不确定 留待以后深入学习吧

最后 补充一点点 楼下有个回帖的有不同论点(zangweiren兄的帖子) 认为String a = new String("abc");是创建了一个对象 "abc"是直接在编译期就确定了 我不认同这个观点 感觉用static修饰的才会在编译时确定  
不然怎么叫静态 其他的都是运行时动态的 java语言是动态的嘛 zangweiren在另一篇帖子里说过
在一个类中用static final修饰的变量 在其他的类中引用时 编译时就确定了 在执行时 不需要加载包涵变量的那个类 然后没其他论据了 慢慢来吧
  
好了 废话了这么久 写的也是比较简单的东西
大家有不同观点 欢迎一起讨论
第一次发表这种帖子 大家千万别砸场子阿



------解决方案--------------------
用static修饰的才会在编译时确定 
不然怎么叫静态 其他的都是运行时动态的 java语言是动态的嘛


你看看我提供的一个文章吧。需要注意问题是:运行此语句时,产生了多少个对象。 那个字符串池的,肯定不是在这个语句后产生的。而是在类加载时,已经放好了。
------解决方案--------------------
ding
------解决方案--------------------
Java 中数组也是拿对象实现的,即 char[] ca = new char[10]; 相当于有个名叫 char[] 的数组类,而 ca 只是个对象变量,它引用后面 new 出来的长度为 10 的 char 数组对象,而这里 10 可以看作 char[] 类的构造方法参数。
------解决方案--------------------
学习
------解决方案--------------------
学习
------解决方案--------------------
不错!