`

java String 缓冲池概念的举例说明(面试题)

阅读更多
转载自http://blog.csdn.net/zmywhhit/article/details/6881609

面试中常会遇到String对象构造的问题。例如String s= new String("a");创建了几个对象。

下面根据代码详细解释一下各种String构造情况。

代码如下:
public class TestConstructString {  
    public static void main(String args[])  
    {  
        String s1 = "a";  
        String s2 = "b";  
        String s3 = "ab";  
          
        String s4 = "ab";  
        System.out.println("s3==s4? "+ (s3==s4));  
  
        String s5 = "a"+"b";  
        System.out.println("s3==s5? "+ (s3==s5));  
          
        String s6 = s1+s2;  
        System.out.println("s3==s6? "+ (s3==s6));  
          
        String s7 = new String("ab");  
        System.out.println("s3==s7? "+ (s3==s7));  
          
        final String s8 = "a" ;   
        final String s9 = "b" ;  
        String s10 = s8 + s9;  
        System.out.println("s3==s10? "+ (s3==s10));  
        }  
} 

输出结果为:
s3==s4? true
s3==s5? true
s3==s6? false
s3==s7? false
s3==s10? true

在解释之前先对String做个简单的介绍。

百度百科:java中的字符串。 String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。

特别注意:String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.

String池:String是不可改变的,为了提高效率Java引用了字符串池的概念,例如new String("abc");首先会在String池中创建一个对象“abc”因为有NEW的 存在所以会分配地址空间copyString池的内容。当出现的String对象在String池中不存在时即在String池中创建该对象。

s3与s4根据String的概念他们都指向了同一个缓冲池内的地址,所以结果为true

s3与s5因为相加的两个为常量所以编译器会把s5="a"+"b"优化为s5="ab"。所以结果也为true。

s3与s6因为是两个变量的相加所以编译器无法优化,s1+s2即等同于(new StringBuilder(String.valueOf(s1))).append(s2).toString(); 在运行时,会有新的String地址空间的分配,而不是指向缓冲池中的“ab”。所以结果false。

s3与s7,根据缓冲池的定义在new的时候实际会新分配地址空间,s7指向的是新分配的地址空间所以与缓冲池地址不同,所以为false

s3与s10,类似于s3与s5,因为是final类型编译器进行了优化所以相同。

创建字符串的方式很多,归纳起来有三类:

其一,使用new关键字创建字符串,比如String s1 = new String("abc");

其二,直接指定。比如String s2 = "abc";

其三,使用串联生成新的字符串。比如String s3 = "ab" + "c";

String对象的创建

String对象的创建也很讲究,关键是要明白其原理。

原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
 
原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
 
原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
 
原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。
 
另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

    最后,有几点问题请大家注意:String a; 与String a=null在作为类变量时候是等价的,在局部变量则不同。null表示一个空引用,String a=null意思是在栈中声明了a,但是这个a没有指向任何地址。此时我们注意到String a 在栈中声明了a,但是也没有指向任何地址,但是java的语法检查如果在局部变量中,String a;是不能直接使用的,String a=null中的这个a可以直接使用。

总之:
//情况一
String s1 = "s"; // 创建了一个对象;
//情况二
s1 = new String("s"); //创建了两个对象
//情况三
String s2 = new String("a" + s1); //创建了三个对象
分享到:
评论
2 楼 xander 2014-11-21  
不错,不错 
1 楼 sunfuyun 2012-06-28  
[size=small][/size]
[/align][align=right]

相关推荐

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题08.String.mp4 │ Java面试题09.讲一下java中的集合.mp4 │ Java面试题10.ArrayList LinkedList.mp4 │ Java面试题11.HashMap和HashTable的区别.mp4 │ Java面试题12.实现一个拷贝文件的类使用字节流...

    【Java面试题】对String常量池的理解

    【Java面试题】对String常量池的理解

    java基础String类选择题练习题

    java基础String类选择题练习题,文档包含了答案与分析,适合学习用,本文档仅仅用于学习分享,不得用于商业用途

    史上最全Java面试题目大集合

    整理了网上的一些java面试题目,很全很强大 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题...

    JAVA面试题解惑系列合集

    1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象? 1.3 JAVA面试题解惑系列(三)——变量(属性)的覆盖 1.4 JAVA面试题解惑系列(四)——final、finally和finalize的区别 1.5 JAVA面试题解惑系列(五...

    java面试大全视频版

    Java面试题08.String Java面试题09.讲一下java中的集合 Java面试题10.ArrayList 和LinkedList的区别 Java面试题11.HashMap和HashTable的区别 Java面试题12.实现一个拷贝文件的工具类要使用字节流还是字符串 Java面试...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题08.String Java面试题09.讲一下java中的集合 Java面试题10.ArrayList 和LinkedList的区别 Java面试题11.HashMap和HashTable的区别 Java面试题12.实现一个拷贝文件的工具类要使用字节流还是字符串 Java面试...

    Java全能学习面试手册——Java面试题库.zip

    06 10个Java经典的String面试题!.pdf 07 15道经典的Tomcat面试题!.pdf 08 15道面试常问的Java多线程面试题!.pdf 09 17道消息队列Kafka面试题!.pdf 10 18道非常牛逼的Nginx面试题!.pdf 11 20道顶尖的Spring Boot...

    10个Java经典的String面试题

    10个Java经典的String面试题

    Java常用类String的面试题汇总(java面试题)

    主要介绍了Java常用类String的面试题汇总,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Java 基础面试题

    该文档主要整理了常见的Java基础面试题,包含以下内容: 1. 抽象类和接口的区别 2. 什么时候使用抽象类,什么时候使用接口 3. 八大基本数据类型,所占字节数 4. List、Set、Map的区别 5. 什么情况下使用List、...

    JAVA面试题最全集

    试举例说明一个典型的垃圾回收算法? 42.请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    java 面试题 资料

    java 面试题 资料 包括 面向对象的特征、String 和StringBuffer的区别、ArrayList,Vector, LinkedList的存储性能和特性、SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别等等

    学会这些java面试题让你吊打面试官

    学会这些java面试题让你吊打面试官!面试前看看,让你充满自信,不再惧怕面试官各种刁难。1.Java中内存管理及各区域内存储数据的生命周期? 2.JVM堆内存的分代管理以及垃圾回收流程? 3.面向对象三大特征及详细理解? 4...

    各大互联网公司常见java面试题

    答案参考:java常见面试题 1、面向对象的特点有哪些? 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 6、Java支持的...

    Java中的String池

    Java中的String池

    java面试真题整理

    java开发岗企业常考面试题目 1.GC垃圾回收处理器,回收内存 托管资源: 非托管资源:手动释放资源 2.堆内存:new出来的 栈内存:基本数据类型的变量,方法的返回值,对象的引用(对象的引用地址) 3.static:存放...

    JAVA面试题汇集

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

Global site tag (gtag.js) - Google Analytics