Java String 字符串相关的一些面试题

匿名网友 匿名网友 发布于: 2015-08-30 00:00:00
阅读 146 收藏 0 点赞 0 评论 0

Java代码

  1. String s = new String(“abc”);
  2. String s1 = “abc”;
  3. String s2 = new String(“abc”);
  4. System.out.println(s == s1);
  5. System.out.println(s == s2);
  6. System.out.println(s1 == s2);

String s = new String(“abc”);

String s1 = “abc”;

String s2 = new String(“abc”);

System.out.println(s == s1);

System.out.println(s == s2);

System.out.println(s1 == s2);

请问以上程序执行结果是什么?

第一句执行后内存中有两个对象,而不是一个。一个由new String(“abc”)中的”abc”在String Pool里生成一个值为”abc”的对象;第二个由new在堆里产生一个值为”abc”的对象,该对象完全是String Pool里的”abc”的一个拷贝。变量s最后指向堆中产生的”abc”对象;
第二句执行时,s1先去String Pool找是否有值为”abc”的对象,很显然在上一步中java已经在String Pool里生成一个”abc”对象了,所以s1直接指向String Pool中的这个”abc”;
第三句中又有一个new,在java中凡遇到new时,都会在堆里产生一个新的对象。因此,该句执行后堆里又多了一个”abc”对象,这与执行第一句后生成的”abc”是不同的两个对象,s2最后指向这个新生成的对象。
因此,执行后面的打印语句的结果是三个false

问题2:

Java代码

  1. System.out.println(s == s.intern());
  2. System.out.println(s1 == s1.intern());
  3. System.out.println(s1.intern() == s2.intern());

System.out.println(s == s.intern());

System.out.println(s1 == s1.intern());

System.out.println(s1.intern() == s2.intern());

请问以上程序执行结果是什么?

设s为String类型的变量,当执行s.intern()时,java先在String Pool里找与字符串变量s相等(用equals()方法)的字符串,若有则将其引用返回;若没有则在String Pool里创建一个与s的值相等的字符串对象,并将其引用返回。从中我们可以总结出intern()方法无论如何都将返回String Pool里的字符串对象的引用。
因此,以上程序执行的结果是falsetruetrue
PS:设s和t为两个字符串变量,若有s.equals(t),必有s.intern() == t.intern();
PS:”==”永远比较的是两边对象的地址是否相等。

问题3:

Java代码

  1. String hello = “hello”;
  2. String hel = “hel”;
  3. String lo = “lo”;
  4. System.out.println(hello == “hel” + “lo”);
  5. System.out.println(hello == “hel” + lo);

String hello = “hello”;

String hel = “hel”;

String lo = “lo”;

System.out.println(hello == “hel” + “lo”);

System.out.println(hello == “hel” + lo);

请问以上程序执行结果是什么?

前三句在String Pool里分别产生“hello”、“hel”、“lo”三个常量字符串对象
当做第一个加法连接时,+号两边都是常量字符串,java就会将两者拼起来后到String Pool里找与之相等(用equals)的字符串,若存在则将其地址返回;不存在则在String Pool里新建一个常量对象,其值等于拼接后的字符串,并将其地址返回。
第二个+号两边有一个是变量,此时,java会在堆里新建一个对象,其值是两字符串拼接后的值,此时返回的地址是堆中新对象的地址。
所以,第一句做+连接后返回String Pool中“hello”的地址,显然与变量hello的地址相等;
第二句返回的是堆中地址,显然与变量hello的地址不等;

 

 

Java的String,StringBuffer,StringBuilder有什么区别?
那就是:String是不可变类(immutable),每次在String对象上的操作都会生成一个新的对象;StringBuffer和StringBuilder则允许在原来对象上进行操作,而不用每次增加对象;StringBuffer是线程安全的,但效率较低,而StringBuilder则不是效率最高。
这个答案我是很早都知道的,而且实际应用中也是这样做的,经常变化的时候用StringBuilder或者StringBuffer。但是为什么是这样的是最近才晓得的,而了解的方法非常简单,就是阅读jdk的源代码:
String和StringBuffer,StringBuilder都是用字符数组来表示的。但是在String中这个字符数组是这样定义的:

/** The value is used for character storage. */
private final char value[];

而在StringBuffer和StringBuilder中,这个字符数组都是继承于java.lang.AbstractStringBuilder中的

/**
* The value is used for character storage.
*/
char value[];
这样答案就很明显了,原因就在这个final关键字上。
而同时通过源代码可以发现StringBuffer的很多方法和属性都有synchronized关键字修饰,而StringBuilder则没有。

评论列表
文章目录