java String 两种不同的赋值 比较
2014-05-26 11:05
351 查看
首先明确一点,String是一个类。下面我们主要讨论两个问题
a) String类的对象的两种赋值方式
b) 为什么String类的对象可以直接赋值
a) 1 类似普通对象,通过new创建字符串对象。String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收。
a)2 直接赋值。如String str = "Hello"; 首先会去缓冲池中找有没有一个"Hello"对象,如果没有,则新建一个,并且入池,所以此种赋值有一个好处,下次如果还有String对象也用直接赋值方式定义为“Hello”, 则不需要开辟新的堆空间,而仍然指向这个池中的"Hello"
以下代码可以测试这一结论 ,最后输出结果为 true, 我们用的是== 测试,输出true,说明两者的地址是一样的
a)3 手动入池
即使使用new关键字,第一种方式赋值,也可以使用一个java中的手动入池指令,让所创建的对象入池,以后依然可以背重复使用,利用下面两段代码可以测试, 如下图,结果显然是false,因为二者的地址不同。
下面程序中,我们使用了intern()方法,手动入池,所以结果是true.
下面程序中,str2没有使用直接赋值,所以结果又变为false
综上所述,开发中,使用直接赋值的方式,显然效率更高。
b) 为什么String类的对象可以直接赋值
打开了String.class,有这么一段介绍:
[java] view
plaincopy
/**
* The <code>String</code> class represents character strings. All
* string literals in Java programs, such as <code>"abc"</code>, are
* implemented as instances of this class.
* <p>
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared. For example:
* <p><blockquote><pre>
* String str = "abc";
* </pre></blockquote><p>
* is equivalent to:
* <p><blockquote><pre>
* char data[] = {'a', 'b', 'c'};
* String str = new String(data);
* </pre></blockquote><p>
* Here are some more examples of how strings can be used:
* <p><blockquote><pre>
* System.out.println("abc");
* String cde = "cde";
* System.out.println("abc" + cde);
* String c = "abc".substring(2,3);
* String d = cde.substring(1, 2);
* </pre></blockquote>
* <p>
*/
通过上面的介绍,我们可以清楚,直接赋值的话,是通过编译器在起作用,当你对"abc"没有通过new创建时,他会自动默认给你调用构造函数new String(char value[]). 不显式调用String的构造函数(通过new叫显式调用),其实JDK编译器会自动给你加上。
a) String类的对象的两种赋值方式
b) 为什么String类的对象可以直接赋值
a) 1 类似普通对象,通过new创建字符串对象。String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收。
a)2 直接赋值。如String str = "Hello"; 首先会去缓冲池中找有没有一个"Hello"对象,如果没有,则新建一个,并且入池,所以此种赋值有一个好处,下次如果还有String对象也用直接赋值方式定义为“Hello”, 则不需要开辟新的堆空间,而仍然指向这个池中的"Hello"
以下代码可以测试这一结论 ,最后输出结果为 true, 我们用的是== 测试,输出true,说明两者的地址是一样的
a)3 手动入池
即使使用new关键字,第一种方式赋值,也可以使用一个java中的手动入池指令,让所创建的对象入池,以后依然可以背重复使用,利用下面两段代码可以测试, 如下图,结果显然是false,因为二者的地址不同。
下面程序中,我们使用了intern()方法,手动入池,所以结果是true.
public class TestString { public static void main(String args[]){ String str1 = new String("Hello").intern(); String str2 = "Hello"; System.out.println( str1==str2 ); } }
下面程序中,str2没有使用直接赋值,所以结果又变为false
public class TestString { public static void main(String args[]){ String str1 = new String("Hello").intern(); String str2 = new String("Hello"); System.out.println( str1==str2 ); } }
综上所述,开发中,使用直接赋值的方式,显然效率更高。
b) 为什么String类的对象可以直接赋值
打开了String.class,有这么一段介绍:
[java] view
plaincopy
/**
* The <code>String</code> class represents character strings. All
* string literals in Java programs, such as <code>"abc"</code>, are
* implemented as instances of this class.
* <p>
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared. For example:
* <p><blockquote><pre>
* String str = "abc";
* </pre></blockquote><p>
* is equivalent to:
* <p><blockquote><pre>
* char data[] = {'a', 'b', 'c'};
* String str = new String(data);
* </pre></blockquote><p>
* Here are some more examples of how strings can be used:
* <p><blockquote><pre>
* System.out.println("abc");
* String cde = "cde";
* System.out.println("abc" + cde);
* String c = "abc".substring(2,3);
* String d = cde.substring(1, 2);
* </pre></blockquote>
* <p>
*/
通过上面的介绍,我们可以清楚,直接赋值的话,是通过编译器在起作用,当你对"abc"没有通过new创建时,他会自动默认给你调用构造函数new String(char value[]). 不显式调用String的构造函数(通过new叫显式调用),其实JDK编译器会自动给你加上。
相关文章推荐
- Java String比较两种不同的赋值
- java String 两种不同的赋值 比较
- java中两种不同的 string赋值比较
- java String 两种不同的赋值 比较
- Java中两种String对象创建和初始化方式比较
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- Java中String两种不同创建方式的区别及intern的用法
- Java中两种String对象创建和初始化方式比较
- 004_java中String的两种赋值方式的区别
- 浅谈java中String的两种赋值方式的区别
- Java基础(11):字符串—深入理解String对象和比较符==和equals的不同
- Java 创建线程池两种不同方法的比较
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- java中Map的两种不同遍历、迭代方式及比较
- Java中两种String对象创建和初始化方式比较
- java基础复习之对于String对象,能够使用“=”赋值,也能够使用newkeyword赋值,两种方式有什么差别?
- Java中关于String赋值的两种形式
- Java中String两种不同创建方式的区别
- Java中String两种不同创建方式的区别及intern的用法
- Java—String的两种赋值方式及区别