StringBuffer转String后的intern方法

用StringBuffer生成字符串过程中,不同的拼接方式会影响最终字符串对象的位置。

案例一:声明对象中含直接定义的字符串

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String str1=new StringBuffer("计算机").append("软件").toString();
        String str2=new StringBuffer("计算机软件").toString();
        String str3=new StringBuffer("计算机软件").append("").toString();
        String str4=new StringBuffer().append("计算").append("机软件").toString();
        String str5=new StringBuffer().append("计算机").append("软件").toString();
        String str6="计算机软件";

        System.out.println("str1.intern()==str6\t"+(str1.intern()==str6));
        System.out.println("str2.intern()==str6\t"+(str2.intern()==str6));
        System.out.println("str3.intern()==str6\t"+(str3.intern()==str6));
        System.out.println("str4.intern()==str6\t"+(str4.intern()==str6));
        System.out.println("str5.intern()==str6\t"+(str5.intern()==str6));
        System.out.println("str6.intern()==str6\t"+(str6.intern()==str6));

    }
}

输出结果:

str1.intern()==str6 true
str2.intern()==str6 true
str3.intern()==str6 true
str4.intern()==str6 true
str5.intern()==str6 true
str6.intern()==str6 true

分析:当字符串中有直接字符串常量“计算机软件”,且赋值给str6,所以str6直接引用常量池对象,即str6.intern()=str6,其他字符串的intern方法也对应常量池中str6对象。

案例二:声明对象中不含直接定义的字符串,但是通过StringBuffer对象经过两次以上append方法生成

        String str7=new StringBuffer().append("计算").append("机网络").toString();
        String str8=new StringBuffer().append("计算机").append("网络").toString();
        String str9=new StringBuffer("计").append("算机网络").toString();

        System.out.println("str7.intern()==str7"+(str7.intern()==str7));
        System.out.println("str8.intern()==str7"+(str8.intern()==str7));
        System.out.println("str9.intern()==str7"+(str9.intern()==str7));

输出结果:

str7.intern()==str7  true
str8.intern()==str7  true
str9.intern()==str7  true

分析:当字符串中没有完整的最终字符串(“计算机网络”),且每个字符串均由两个(及其以上的)小的字符串拼接而成,则第一个生成的字符串和常量池中的字符串相同,谁先生成则将常量池中字符串赋值给谁(此处为str7)。若上述字符串.intern()和str8或者str9比较,则结果为false。

案例三:声明对象中不含有直接定义的字符串,但是有通过一次StringBuffer对象生成的字符串。

        String str1=new StringBuffer("计算机").append("软件").toString();
        String str2=new StringBuffer("计算机软件").toString();
//        String str3=new StringBuffer("计算机软件").append("").toString();
        String str4=new StringBuffer().append("计算").append("机软件").toString();
        String str5=new StringBuffer().append("计算机").append("软件").toString();

        System.out.println("str1.intern()==str2\t"+(str1.intern()==str2));
        System.out.println("str2.intern()==str2\t"+(str2.intern()==str2));
//        System.out.println("str3.intern()==str3\t"+(str3.intern()==str3));
        System.out.println("str4.intern()==str2\t"+(str4.intern()==str2));
        System.out.println("str5.intern()==str2\t"+(str5.intern()==str2));

输出结果:

str1.intern()==str2 false
str2.intern()==str2 false
str4.intern()==str2 false
str5.intern()==str2 false

分析:当字符串中有通过StringBuffer一次生成的String对象,则不会将字符串常量付给任何字符串对象。同样如果字符串str2注销,换成str3,结果依然为false。

总结:

  • 字符串对象通过字面值直接生成时则直接对应常量池对象。
  • 如果每个字符串都是通过两个及其以上的小的字符串通过StringBuffer对象拼接而成,并且没有全由字面值生成的字符串对象,则第一个生成的字符串对应常量池中的该字符串对象。
  • 如果生成的字符串对象中有由一个完整字符串或者一个完整字符串拼接空串通过StringBuffer对象生成,并且没有全由字面值生成的字符串对象,则所有的字符串对象均不对应常量池中的对象
时间: 2024-11-05 02:35:02

StringBuffer转String后的intern方法的相关文章

了解String类的intern()方法

相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String intern(); 文档告诉我们该方法返回一个字符串对象的内部化引用. public String intern()返回字符串对象的规范化表示形式. 一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确

String类的intern()方法

public native String intern(); 这个是在String类源码中申明的一个方法,是一个本地方法,返回的是一个String对象的引用.先看一下代码: String s1="123"; String s2 = new String("123"); System.out.println(s1==s2);//false System.out.println(s1==s2.intern());//true s1==s2结果为false,这个不再详述.

测试String类的intern方法

<pre name="code" class="java">package com.ckw.mianshi; /** * 测试String类的intern方法 * @author Administrator *intern():返回一个字符串,内容与此字符串相同,但它保证来自字符串池中. */ public class StringOfIntern { public static void main(String[] args) { /** * 例1 *

String类中intern方法的原理分析

一,前言 ? 昨天简单整理了JVM内存分配和String类常用方法,遇到了String中的intern()方法.本来想一并总结起来,但是intern方法还涉及到JDK版本的问题,内容也相对较多,所以今天就弥补昨天缺失的知识点. 二,String.intern() ? 先来看下网上流行的关于intern()方法的示例代码: public static void main(String[] args) { String s = new String("1"); s.intern(); St

Java技术——你真的了解String类的intern()方法吗

0.引言 转载请注明出处:http://write.blog.csdn.net/postedit/52291082 什么都先不说,先看下面这个引入的例子: String str1 = new String("SEU")+ new String("Calvin"); System.out.println(str1.intern() == str1); System.out.println(str1 == "SEUCalvin"); 本人JDK版本1

JAVA中String类的intern()方法的作用

一般我们平时很少使用到 intern这个方法,今天我就来解释一下这个方法是干什么的,做什么用的 首先请大家看一个例子: [java] view plaincopyprint? public static void main(String[] args) throws Exception { String a =  "b" ; String b =  "b" ; System.out.print( a == b); String c = "d" ;

深入解析String.intern()方法

转载: http://tech.meituan.com/in_depth_understanding_string_intern.html 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如

String的Intern方法详解

引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存.8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如果不是用双引号声明的String对象,可以使用String提供的intern方法.intern 方法会从字符串常量池中查询当前字符串是否存在,

java中String类intern()方法探索

想到什么写什么,会有点乱,意思理解就行 首先我们创建两个字符串对象,如下: String a = new String("hx"); String b = new String("h")+new String("x"); 通过new关键字创建字符串对象时,会同时在堆和常量池中生成两个对象,比如说上面的第一条语句产生两个内容均为"hx"的对象,一个在堆中,一个在常量池中,a引用的是堆中的对象,内容是"hx";