`

JAVA面试题解惑系列(二)——到底创建了几个String对象?

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
82
7
分享到:
评论
80 楼 future_9 2008-07-30  
我随时关注
79 楼 臧圩人 2008-07-30  
回复infante_yin:

infante_yin 写道
LZ基于下面的代码可以给我解释一下吗?String类本身就是final的了!

String a = "ab";
String b = "cd";
String c = "abcd";
String d = a + b;
System.out.println(c==d);


请参照下面这个例子,它们的原理是相同的。在执行“String d=a+b;”之前,a和b的值都可以能被其他代码改变,因此d是一个在执行时才可以确定值的变量,它不同于“String d="ab"+"cd";”。

臧圩人 写道
public class StringStaticTest { 
     // 常量A 
     public static final String A; 
  
     // 常量B 
     public static final String B; 
  
     static { 
         A = "ab"; 
         B = "cd"; 
     } 
  
     public static void main(String[] args) { 
         // 将两个常量用+连接对s进行初始化 
         String s = A + B; 
         String t = "abcd"; 
         if (s == t) { 
             System.out.println("s等于t,它们是同一个对象"); 
         } else { 
             System.out.println("s不等于t,它们不是同一个对象"); 
         } 
     } 
}

上面这个例子的输入结果是:s不等于t,它们不是同一个对象。
对照文中前面一个例子,就更容易理解了。
78 楼 infante_yin 2008-07-30  
LZ基于下面的代码可以给我解释一下吗?String类本身就是final的了!

String  a = "ab";
String  b = "cd";     
String c = "abcd";
String d = a + b;
System.out.println(c==d);
77 楼 臧圩人 2008-07-28  
回复nihao620:

第一种情况比第二种情况多创建了一个变量a到栈中,其它的是等价的。
76 楼 nihao620 2008-07-28  
请问:
String a="abc";String b=new String(a);


String b=new String("abc");

在堆,栈和字符串池的存储上是不是等价的?
75 楼 臧圩人 2008-07-28  
回复high0048:

更准确的说是“new”命令创建的字符串对象只是在堆中被创建了,但是没有保存到字符串池中,也就是说字符串池并不知道有这么一个对象存在
74 楼 臧圩人 2008-07-28  
回复hustKiwi、tianyong182:

谢谢支持,请多多关注
73 楼 臧圩人 2008-07-28  
回复nbawukun:

我会在新版本中用图来表示字符串池与堆的关系,以及字符串对象在它们中的存储,请保持关注
72 楼 tianyong182 2008-07-28  
mark一下

回顾学习用

记住常量表达式在编译期间被计算 String a = "ab" + "cd";
在编译时:a已经被计算过了。

而同时变量在编译阶段是不能确定的,只能到运行的时候才能够被确定。
71 楼 high0048 2008-07-27  
你的意思就是:
String a = new String(new char[] { 'a', 'b', 'c', 'd' });
这句话中"abcd"没有在字符串池中创建,而是在堆空间中创立的?
70 楼 hustKiwi 2008-07-27  
写得很好,这些语法细节在真正项目中也许不需要记得这么清楚(拿不准的测试下就知道了),但您分析问题的思路很值得学习。
69 楼 nbawukun 2008-07-25  
你好,请问:

是不是当执行上面的代码以后,在堆里面有3个String对象,一个的引用在池,还有2个在栈,他们的value都指向站上的内容

数组的内容放在栈里面,堆上放的是指针,一共有9个指针,对不?

数组的内容不是在连续的内存地址存放吗,为什么一个String对象的value要3个指针啊,一个不就够了吗,这个设计不太理解。

还有,这里既然谈到内存的层面上,我想请问一下,当我new一个普通对象时,比如一个Student,它有一个int属性的id,值是10,一个String属性的name,叫tom,还有一个数组属性,存放‘a,b,c’。

你能花2个图出来说明一下这个student和前面讲的2个String在内存中是怎么存放的吗,把池、栈、堆都画一下吧,谢谢
68 楼 臧圩人 2008-07-25  
回复nbawukun:

引用
同时在栈里面还有2个引用,在堆里面有2个String对象,栈里面的2个引用分别指向堆里面的2个对象,而堆里面的2个String对象,都有一个value属性,这个属性又是一个数组引用,他们都指向栈的数组'a','b','c'。


你的这一段理解都是对的

引用
是不是这样理解,在栈上面有一个数组,这个数组装着'a','b','c',


这个有点问题,'a','b','c'是String对象s1和s2的值,也就是它们的属性value,而value是一个char型数组,它本身作为对象是保存在堆中的,它有三个引用value[0]、value[1]、value[2]分别指向了栈中的'a','b','c'

引用
还希望你能解释一下池里面装的是什么东西,String是对象还是指向Sting的引用,如果是引用,它指向谁了?是数组引用,还是一个数组内容?


关于字符串池请参考我的上一个回复。字符串池并不是数组,我只是把它比作类似于数组功能的一个存放字符串引用的容器。
67 楼 nbawukun 2008-07-24  
比如这个例子
String s1 = new String("abc")
String s2 = new String("abc")

是不是这样理解,在栈上面有一个数组,这个数组装着'a','b','c',同时在栈里面还有2个引用,在堆里面有2个String对象,栈里面的2个引用分别指向堆里面的2个对象,而堆里面的2个String对象,都有一个value属性,这个属性又是一个数组引用,他们都指向栈的数组'a','b','c'。

这样理解对吗?
还希望你能解释一下池里面装的是什么东西,String是对象还是指向Sting的引用,如果是引用,它指向谁了?是数组引用,还是一个数组内容?
66 楼 臧圩人 2008-07-24  
回复nbawukun:

对象总是被保存在堆中,而引用总是被保存在栈中。

实际上是字符串池搅乱了我们的思路。我觉得可以把它看作一个数组,字符串被保存池中,实际上只是在字符串池中保存了这个字符串的引用,实际的字符串对象仍像其它对象一样被保存在堆中了。只不过通过new创建的字符串对象在被保存在堆中的同时,并没有在字符串池中保存它的引用,因此字符串池并不知道它的存在,也就无法将它共享使用。
65 楼 nbawukun 2008-07-24  
你好,问一个问题

如果我们接着执行String b=new String("abc");代码,由于"abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建的三个char型值值'a'、'b'和'c'。

关于堆上的String对象我要怎么理解啊,它只是一个引用还是一个对象啊?
64 楼 lz726 2008-07-23  
额,这也是effective java 中提及的避免创建重复的对象的一个很好的注解.~

多谢~.
63 楼 muyuqian 2008-07-22  
似乎是懂了一些,一时半会儿还难以消化,收藏先,以待后期巩固。
62 楼 shiyouxu 2008-07-22  
very good!
61 楼 臧圩人 2008-07-19  
回复perrywky:
你好,你的理解是有问题的,建议你再仔细看看这篇文章

相关推荐

    JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    JAVA 面试题解惑系列之 String 对象创建机制 本文将深入探讨 JAVA 中 String 对象的创建机制,解答常见的面试题目,并探索 String 对象池的概念和机制。 一、String 对象的创建方式 在 JAVA 中,String 对象可以...

    JAVA面试题解惑系列合集

    .3 1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 1.3 JAVA面试题解惑系列(三)——变量(属性)的覆盖 . . . . . . . . . . . . ....

    臧圩人--JAVA面试题解惑系列合集.pdf

    **1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象?** - **知识点**:探讨Java中String对象的创建机制,特别是常量池的概念和String对象的内存分配策略。了解字符串字面量与`new String()`的区别,以及...

    JAVA面试题解惑系列.rar

    这个压缩包可能包含了两本书籍,一本是"JAVA面试题解惑系列.pdf",另一本是"臧圩人--JAVA面试题解惑系列合集.pdf"。这些资源旨在帮助求职者准备Java开发相关的面试,提升他们对Java技术的理解和应用能力。 在Java...

    Java面试题解惑系列

    2、到底创建了几个String对象;3、变量(属性)的覆盖;4、final,finally,finalize;5.传了值还是传了引用;6.String杂谈;7.日期与时间的处理;8.基本类型总结;9.继承,多态,重载,重写;10.多线程;11.运算符...

    Java面试题详解,和一些基础知识的深入剖析,个人认为非常棒

    首先,我们来看“JAVA面试题解惑系列(二)——到底创建了几个String对象?”这个问题。在Java中,String是不可变的,这意味着一旦创建,其内容就不能改变。因此,每当对String进行操作,如拼接或赋值,实际上可能...

    《经典JAVA面试题解惑系列合集(臧圩人)》

    《经典JAVA面试题解惑系列合集(臧圩人)》这本书很可能就是针对这些问题进行深入解析的一本指南。 首先,Java的基础知识是面试中的必考部分。这包括但不限于Java语法、数据类型、控制结构(如if语句、for循环、...

    JAVA面试题解惑系列

    【JAVA面试题解惑系列】是一系列专门针对Java开发者面试准备的文章集合,涵盖了多个核心Java概念和面试常问问题。作者臧圩人在JavaEye社区分享了这个系列,旨在帮助求职者理解和解答面试中可能出现的疑问。 1. **类...

    JAVA面试题解惑系列——类的初始化顺序

    在Java中,类的初始化顺序是一个经常被问及的面试题目,尤其对于Java程序员和工程师来说,了解这个知识点是必须的。在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面...

    JAVA面试题解惑系列(六)——字符串(String)杂谈[收集].pdf

    Java中的字符串(String)是编程面试中的热门话题,其特性与操作是面试官常常用来考察候选人基础知识的手段。本文将深入探讨String对象的一些关键知识点。 首先,我们要了解`String`类的`length()`方法。这个方法返回...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    JAVA面试题解惑系列(一)——类的初始化顺序 JAVA 是一门面向对象的编程语言,类的初始化顺序是 JAVA 程序员和 JAVA 工程师面试中一个非常重要的知识点。本文将详细讲解类的初始化顺序,并提供了相关的测试代码,...

    JAVA面试题解惑系列.doc

    《JAVA面试题解惑系列——类的初始化顺序》 在Java编程中,理解类的初始化顺序是面试中常见的考察点,因为它直接关系到程序的执行逻辑。本文将深入探讨类的初始化过程,以及在继承场景下如何理解这个过程。 首先,...

    115个Java面试题和答案——终极列表

    Java面试题是每个Java开发者在求职过程中必须面对的挑战,涵盖范围广泛,从基础概念到高级特性和设计模式。这份终极列表包含115个Java面试题和答案,旨在帮助求职者全面准备,以期在面试中表现出色。以下是部分核心...

    JAVA面试题解惑系列合集.docx

    本文通过对Java面试题中的两个典型问题——类的初始化顺序和String对象的创建——进行了深入分析。这些知识点不仅是Java编程的基础,也是深入理解Java语言特性的关键。掌握这些内容不仅能够帮助开发者在面试中表现...

Global site tag (gtag.js) - Google Analytics