`

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面试题集锦 java面试题集锦

    以下是对标题和描述中涉及的一些常见Java面试题的详细解释: 1. **JDK 和 JRE 的区别** JDK(Java Development Kit)是用于开发和调试Java程序的完整工具集,包括JRE(Java Runtime Environment)、编译器(javac...

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

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

    java基础String类选择题练习题

    综上所述,这份Java基础String类选择题练习题主要覆盖了String和StringBuffer类的基础概念、基本操作方法以及它们之间的区别等内容。通过这些练习题,学习者可以更好地理解和掌握这两个类的使用方法,为实际编程工作...

    java经典面试题

    ### Java经典面试题知识点 #### Java数据结构容器 - **核心知识点**:Java集合框架,包括List、Set、Map等接口及其实现类。List接口代表有序的集合,例如ArrayList和LinkedList;Set接口代表不允许重复元素的集合,...

    Java面试题以及答案整理.pdf

    为了在Java面试中脱颖而出,了解和掌握常见的面试题及答案至关重要。以下是一些关键知识点的详细解析: 1. **super()与 this()的区别** `super()`用于调用父类的构造器,确保子类实例化时父类的初始化;`this()`则...

    计算机和JAVA 面试题大全

    【计算机和JAVA 面试题大全】 在计算机科学与技术领域,尤其是软件开发行业,Java是一种广泛应用的编程语言,以其跨平台、面向对象和高效性而受到赞誉。本资料集涵盖了丰富的Java面试题,旨在帮助求职者准备Java...

    Java17道面试题及答案

    Java 面试题及答案 Java 是一种广泛使用的编程语言,Java 面试中常见的问题有很多,今天我们来讨论 JDK 和 JRE 的区别、==和 equals 的区别等问题。 JDK 和 JRE 的区别 JDK(Java Development Kit)是 Java 开发...

    常见的java,android面试题整理

    Java和Android面试题涵盖了许多核心概念,以下是这些知识点的详细说明: 1. **面向对象** (Object-Oriented Analysis and Design Principle, OOADP): 面向对象编程是Java和Android开发的基础,它涉及类、对象、继承...

    java经典面试题汇总(精华版).pdf

    ### Java经典面试题汇总 #### 一、面向对象与面向过程的区别 **面向对象**与**面向过程**是编程中两种不同的思想模式。 1. **面向过程**: - **特点**:关注解决问题的具体步骤和流程。 - **示例**:如洗衣服的...

    java常见面试题(史上最全最经典-希望对你有用)

    Java常见面试题 Java是最流行的编程语言之一,掌握Java的基础知识是非常重要的。在这里,我们总结了Java常见的面试题,涵盖了Java的基础部分,包括基本语法、类相关的语法、内部类的语法、继承相关的语法、异常的...

    Java后端面试题

    ### Java面试题知识点概览 #### 面向对象概念 1. **super()与this()的区别**: - `super()`用于调用父类的构造方法或父类成员方法。 - `this()`用于调用本类中的其他构造方法。 2. **作用域public, protected, ...

    2024java面试题.pdf

    ### Java 面试知识点详解 #### 一、Java 基础知识 1. **面向对象的特征:** - **抽象**:抽象是指在程序设计中隐藏对象的复杂性,只展示对象的...对于准备参加 Java 面试的人来说,理解并掌握这些概念将非常有帮助。

    java程序员面试题——863面试集

    ### Java程序员面试题详解 #### 一、Java基础知识 1. **作用域public, private, protected, 以及不写时的区别** - **public**: 可以被任何类访问。 - **protected**: 可以被同一包内及不同包内的子类访问。 - ...

    JAVA面试题最全集.pdf

    本文档概括了Java面试题的知识点,涵盖了Java基础知识、JSP&Servlet技术、J2EE相关知识、Web安全性、MVC、XML、structs、Session Bean、EJB、Java多线程、文件加密技术、软件开发生命周期、路由协议、Java AWT和...

    java面试题(word文档,很全,不下后悔)

    Java 面试题 Java 是一种面向对象的编程语言,具有抽象、继承、封装、多态性四大特征。面向对象编程语言的特征包括抽象、继承、封装和多态性,它们是 java 语言的基础。 1. 抽象:抽象是忽略一个主题中与当前目标...

    2022最新java面试题大全

    Java 面试题大全 Java 是一种广泛使用的编程语言,本文总结了 Java 面试中常见的知识点,涵盖了 Java 基础、字符串操作、数据类型、运算符、抽象类等方面的知识。 Java 基础 1. JDK 和 JRE 的区别:JDK(Java ...

    java面试题精讲视频MP4Java面试题08.String

    java面试题精讲视频MP4Java面试题08.String提取方式是百度网盘分享地址

    最全java面试题及答案(208道).pdf

    "Java面试题及答案详解" Java是目前最流行的编程语言之一,在软件开发行业中广泛应用。以下是Java面试题及答案的详解: Java基础 1. JDK 和 JRE 的区别是什么? JDK(Java Development Kit)是Java开发工具包,...

Global site tag (gtag.js) - Google Analytics