/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.racky.string;
/**
*
* @author Racky
*/
public class StringTest {
public static void main(String args[])
{
String s0="racky";
String s1="racky";
String s2="rac"+"ky";
/**
* s0,s1均为常量,在编译时就已经确定
* 当一个字符穿为多个常量字符穿连接时,它自己也是常量,所以s2也是"racky"的一个引用
**/
System.out.println(s0==s1);
System.out.println(s1==s2);//==比较地址是否相同,也就是是否是同一个字符串的引用
System.out.println(s0.equals(s1));//equals比较unicode是否相同
System.out.println(s1.equals(s2));
System.out.println("******************************************************");
String s3="racky";
String s4=new String("racky");
String s5="rac"+new String("ky");
/**
*用new String() 创建的字符串不是常量,不能在编译期就确定,
* 所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间
* s3为常量池中"racky"的引用,而s4,s5均不能在编译时确定
* */
System.out.println(s3==s4);
System.out.println(s3==s5);
System.out.println(s4==s5);
System.out.println(s3.equals(s4));
System.out.println(s3.equals(s5));
System.out.println(s4.equals(s5));
System.out.println("*******************************");
/*
* 存在于.class文件中的常量池,在运行期被JVM装载,
* 并且可以扩充。String的intern()方法就是扩充常量池的一个方法
* 当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,
* 如果有,则返回其的引用,如果没有,
* 则在常量池中增加一个Unicode等于str的字符串并返回它的引用;
* */
s4.intern();
s5=s5.intern();
System.out.println(s3==s4);
System.out.println(s3==s4.intern());
System.out.println(s3==s5);
System.out.println(s4==s5);
System.out.println(s4.intern()==s5);
/*
* 关于String是不可变的
* 这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,
* 比如说:String str=”kv”+”ill”+” “+”ans”;
* 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,
* 然后”kvill”又和” “ 生成 ”kvill “存在内存中,
* 最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,
* 就是因为String的“不可变”产生了很多临时变量,
* 这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。
* */
}
}
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.racky.string;
/**
*
* @author Racky
*/
public class StringTest {
public static void main(String args[])
{
String s0="racky";
String s1="racky";
String s2="rac"+"ky";
/**
* s0,s1均为常量,在编译时就已经确定
* 当一个字符穿为多个常量字符穿连接时,它自己也是常量,所以s2也是"racky"的一个引用
**/
System.out.println(s0==s1);
System.out.println(s1==s2);//==比较地址是否相同,也就是是否是同一个字符串的引用
System.out.println(s0.equals(s1));//equals比较unicode是否相同
System.out.println(s1.equals(s2));
System.out.println("******************************************************");
String s3="racky";
String s4=new String("racky");
String s5="rac"+new String("ky");
/**
*用new String() 创建的字符串不是常量,不能在编译期就确定,
* 所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间
* s3为常量池中"racky"的引用,而s4,s5均不能在编译时确定
* */
System.out.println(s3==s4);
System.out.println(s3==s5);
System.out.println(s4==s5);
System.out.println(s3.equals(s4));
System.out.println(s3.equals(s5));
System.out.println(s4.equals(s5));
System.out.println("*******************************");
/*
* 存在于.class文件中的常量池,在运行期被JVM装载,
* 并且可以扩充。String的intern()方法就是扩充常量池的一个方法
* 当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,
* 如果有,则返回其的引用,如果没有,
* 则在常量池中增加一个Unicode等于str的字符串并返回它的引用;
* */
s4.intern();
s5=s5.intern();
System.out.println(s3==s4);
System.out.println(s3==s4.intern());
System.out.println(s3==s5);
System.out.println(s4==s5);
System.out.println(s4.intern()==s5);
/*
* 关于String是不可变的
* 这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,
* 比如说:String str=”kv”+”ill”+” “+”ans”;
* 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,
* 然后”kvill”又和” “ 生成 ”kvill “存在内存中,
* 最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,
* 就是因为String的“不可变”产生了很多临时变量,
* 这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。
* */
}
}