`

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

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
82
7
分享到:
评论
60 楼 perrywky 2008-07-19  
引用


臧圩人 昨天
回复disorder:
因为是使用new创建的,因此没有加入到字符串池中,但是你可以调用intern()方法来手动实现这一步

disorder 昨天
请问一下为什么这里a就没有被加入到池中呢?
Java代码 复制代码

   1. String a = new String(new char[] { 'a', 'b', 'c', 'd' });    



new String()不会创建一个对象并将它添加到字符串池中吗?
59 楼 perrywky 2008-07-19  
引用

zzmacoolboy 2008-07-01
引用
String a = "ab";
String b = "cd";
"ab"+"cd" 创建的对象 "加入了" 字符串池中
a +"cd" 创建的对象 "没加入" 字符串池中
"ab"+ b 创建的对象 "没加入" 字符串池中
a + b 创建的对象 "没加入" 字符串池中


从输出的结果可以看到只有 "ab"+"cd"创建的对象加入了字符串池中,其它的的都没有加入字符串池中,请问一下楼主那e,f,g引用到底指向哪了呢?


臧圩人 2008-07-01
回复zzmacoolboy:
这些对象被加到字符串池中,只是我们的程序中没有指向它们的变量罢了。



可不可以这样理解,e,f,g都被加入到了字符串池中,他们的值都为"abcd",也就是说,在字符串池中,存在四个值为"abcd"的对象,即,c,e,f,g
58 楼 臧圩人 2008-07-17  
回复disorder:
因为是使用new创建的,因此没有加入到字符串池中,但是你可以调用intern()方法来手动实现这一步
57 楼 disorder 2008-07-17  
请问一下为什么这里a就没有被加入到池中呢?
 String a = new String(new char[] { 'a', 'b', 'c', 'd' });   
56 楼 臧圩人 2008-07-14  
回复viMory:
你引用的那段话所讲的是对的,但是在我所举的例子中,由于我给出的示例代码前没有其它代码执行,因此"abc"不会被创建出来
55 楼 viMory 2008-07-14  
引用
这个还与具体的条件相关,如果在String池中没有“abc”对象存在那么就会创建两个对象,如果池中已经存在“abc”对象的话,那么就只是创建一个对象,所以这个问题要看具体的条件才能下结论
我也同意这句,已经存在的话就是一个对象了。LZ你认为有可能不?
54 楼 Bluesnails 2008-07-14  
看了前两章,总结的很详细啊,受教了~
53 楼 zm2693450 2008-07-14  
好贴,顶起来
52 楼 臧圩人 2008-07-13  
回复chq32:
这位朋友,不知你是没看全还是没看仔细
我很明确地说了String str只是定义了一个变量并没有创建对象,真正创建对象的是"abc"和new String()
51 楼 chq32 2008-07-13  
我总觉得是一个对象。
String str=new String("abc");
====
用"人"来比喻的话,
,"str"相当于人的身证证,"abc"相当于人的肉身
你能说是两个人吗??
我不解

如果按楼主说的是两个对象,那我看所有的对象都是两个对象了
50 楼 臧圩人 2008-07-09  
回复 狂放不羁:
你说得对。
不过我写这系列文章的目的是面试题解惑,和巩固基础知识,如果想要做好J2EE企业级开发,就需要更进一步的学习了
49 楼 狂放不羁 2008-07-08  
呵呵,这种考题也就只能考考J2SE基础。做J2EE企业级开发,设计模式,OO思想才是重点。
48 楼 臧圩人 2008-07-06  
回复Unmi:
呵呵,一个人的能力固然不是单凭面试就能够完全考出来的,但是出面试题不失为一个不错的考查方法,而分析面试题也不失为一个有针对性的好的学习途径
47 楼 Unmi 2008-07-06  
我觉得出这个题目的人很无聊,分析这个问题的更是无聊,有意思吗?

迂腐
46 楼 臧圩人 2008-07-06  
回复zc2yhy:
总结的很好
我对于字符串池是这么理解的,它是内存中的一块内存区域,作用可以类比于数组(当然,字符串池并不是对象),字符串池中保存的只是对象的引用,实际的对象只在堆中保存一份。
45 楼 zc2yhy 2008-07-05  
让小弟来小结一下这篇文章所说的事情吧

1.堆和栈的概念。
2.编译器也是很机械化的,只能一行行的读代码,所以,在有的时候看似为静态的值,其实编译器是看不出来的,它也只能当机立断得判断。
3.看完后感觉在lz所说的字符串池中存储的其实也是基本数据类型char的数组或者说序列char[],在String类中将其包装。在vb还是c#中我忘了,就区分了这两种字符串的概念,分为基本类型string和对象类型String(注意大小写)。
4.在这里完全能感受到创作一个完整、封闭的语言是多么的缜密于细致,其实这也取决于当时Gosling或其开发团队的想法,当然作为这么优秀的语言,我们确实应该学习得更加细致。
44 楼 臧圩人 2008-07-04  
回复sooo:
你的理解是对的,最后一例中,a的确没有被加入字符串池中,而b被加入了。

而对于这句话:
引用

如果String类的intern()方法在没有找到相同值的对象时,是把当前对象加入字符串池中,然后返回它的引用的话,那么b和a指向的就是同一个对象

请注意我加了“如果”,在这个假设成立的前提下,b和a理应指向同一个对象。
43 楼 sooo 2008-07-04  
引用
如果String类的intern()方法在没有找到相同值的对象时,是把当前对象加入字符串池中,然后返回它的引用的话,那么b和a指向的就是同一个对象


这句话不对吧,当前对象放入串池,而原来的a并没在串池中,怎么会指向同一对象啊?
ps:我的“原来的a并没在串池中“,表述也有问题
42 楼 sooo 2008-07-04  
最后一个,是说明了a没被放入串池吧?
                         String a = new String(new char[] { 'a', 'b', 'c', 'd' }); 
		         String b = a.intern();
		         System.out.println("a = " + a);
		         System.out.println("b = " + b);
		         
		         if (a == b) {  
		             System.out.println("a被加入了字符串池中");  
		         } else {  
		             System.out.println("a没被加入字符串池中");  
		         }  
		         
		         String c = "abcd";  
		         
		         if (c == b) {  
		             System.out.println("b被加入了字符串池中");  
		         } else {  
		             System.out.println("b没被加入字符串池中");  
		         }  

a = abcd
b = abcd
a没被加入字符串池中
b被加入了字符串池中
41 楼 臧圩人 2008-07-04  
回复rabbitbug:
还请多多支持啊,呵呵

相关推荐

    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