前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试题67(以下程序创建了几个对象——String)

面试题67(以下程序创建了几个对象——String)

作者头像
Java学习
发布2018-04-13 14:22:35
3.2K0
发布2018-04-13 14:22:35
举报
文章被收录于专栏:java学习java学习
面试例题1:以下程序创建了几个对象?
代码语言:javascript
复制
String A,B, C;
A="a";
B="b";
A=A+B;
StringBuffer D=new StringBuffer("abc");
D=D.append("567");

A 4 B 3 C 5 D 6

正确解析如下:

要知道 String s= new String("abc")创建了几个 String Object,首先必须了解引用变量与对象的区别。

(1)引用变量与对象。除了一些早期的Java书籍,我们都可以从书中比较清楚地学习到两者的区别。“A aa;”语句声明一个类A的引用变量aa(常称为句柄),而对象一般通过new创建。所以题目中D仅仅是一个引用变量,它不是对象。而字符串文字“abc”是一个 String对象。

(2)Java中所有的字符串文字(字符串常量)都是一个 String的对象。有人(特别是C程序员)在一些场合喜欢把字符串当作字符数组,这也没有办法,因为字符串与字符数组存在一些内在的联系。事实上,它与字符数组是两种完全不同的对象。

代码语言:javascript
复制
System.out.println("Hello.length()");
char[]cc={'H','i'};
System.out.println(cc.length);

(3)字符串对象的创建。由于字符串对象的大量使用(它是一个对象,一般而言,对象总在heap分配内存),Java中为了节省内存空间和运行时间(如比较字符串时,“==”比 equals( )快),在编译阶段就把所有的字符串文字放到一个文字池( pool of literal strings)中,而运行时文字池成为常量池的一部分。文字池的好处就是该池中所有相同的字符串常量被合并,只占用一个空间。对两个引用变量使用“==”判断它们的值(引用)是否相等,即指向同一个对象。

代码语言:javascript
复制
String s1="abc";
String s2="abc";
if(s1==s2){
  System.out.println("s1,s2 refer to them same object");}
else{
  System.out.println("trouble")
}

这里的输出显示两个字符串文字保存为一个对象。就是说,上面的代码只在pool中创建了一个 String对象。

现在看String s= new String("abc"):"语句,这里“abc”本身就是pool中的一个把heap中的这个对象的引用交给s持有。这条语句就创建了两个 String对象。

代码语言:javascript
复制
String s1=new String("abc");
String s2=new String("abc");
if(s1==s2){
//不会执行到这里来
}

这时用“==”判断就可知,虽然两个对象的“内容”相同(用 equals( )判断),但两个引用变量所持有的引用不同。上面的代码创建了三个 String Object,pool中一个,heap中两个。

下面对题目中的代码一 一分析。

(1)“ StringBuffer D= new StringBuffer("abc");”产生了两个对象,“abc”本身与经过new创建出来的不是一个对象,可以用“==”来检验。

(2)对本题:

“A="a";”,引用的不是对象,此处创建了一个对象和一个引用A;

“B="b";”,说明同上;

“A=A+B;”,说明同上,此处创建了一个对象,并由引用A来引用,那么原来A所指向的对象就成为垃圾对象,被回收;

StringBuffer D= new StringBuffer("abc")", StringBuffer的特点是改变对象本身而不是创建新的对象,因此,此处及“D= D.append("567");”都是对同一个对象进行处理。而字符串对象也是一个对象,故有两个对象。

正确答案在下面

结论:若讨论整个过程共产生了几个对象,可以得出是5个。

面试例题1的正确答案:C

小编寄语

以上每一个字都是小编一个字一个字打出的!图也是小编一笔一笔的画出来的!希望大家多多支持小编!也希望大家好好学习天天向上!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档