String与常量池_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > String与常量池

String与常量池

 2013/9/26 15:50:32  ifWhileCaseFor  程序员俱乐部  我要评论(0)
  • 摘要:1.String对象不属于8中基本数据类型,String是一个对象String对象的默认初始值为null;String为一个特殊的对象,有一些其他对象没有的特点;2.newString()与newString("")都是申请一个新的空字符串,是空字符串而不是null;3.Stringstr=”a“与Stringstr=newString("a")的区别;此处需明白常量池的意义(constantpool),常量池是指在编译器被确定的并被保存在编译完成的.class文件中。包括了类、方法
  • 标签:
1.String对象不属于8中基本数据类型,String是一个对象 
  String对象的默认初始值为null;String为一个特殊的对象,有一些其他对象没有的特点;

2.new String()与new String(" ")都是申请一个新的空字符串,是空字符串而不是null;

3.String str = ”a“ 与 String str = new String("a")的区别;
  此处需明白常量池的意义(constant pool),常量池是指在编译器被确定的并被保存在编译完成的.class文件中。包括了类、方法、接口等中的常量,也包括字符串常量;
public class Test01 {
	public static void main(String[] args){
	    String str1 = "abcd";
	    String str2 = "abcd";
	    String str3 = "ab"+"cd";
	    System.out.println(str1 == str2);
	    System.out.println(str1 == str3);
	}
}

输出结果为:
true
true

程序中的str1与str2均为字符串常量,在编译过程中即被保存在.class文件中;str3是被两个字符串连接而成,并且他也是一个字符串常量,所以str3在编译期也会被解析为一个字符串常量,它也是常量池中"abcd”的一个引用;因此str1==str2==str3;
  但是用new String()创建的字符串不是字符串常量不能被保存在常量池中,他们有自己的地址空间;
public class Test02 {
	public static void main(String[] args){
	    String str1 = "abcd";
	    String str2 = new String("abcd");
	    String str3 = "ab"+new String("cd");
	    System.out.println(str1 == str2);
	    System.out.println(str1 == str3);
	    System.out.println(str2 == str3);
	}
}

输出结果:
false
false
false

  在程序Test02中str1还是一个字符串常量,但是str2与str3均不再是字符串常量;str1被保存在常量池中,str2与str3均在运行时创建了新的对象(具有新的地址空间,且str2与str3的地址是不同的)

4.String.intern()方法扩充常量池 
当一个String实例调用intern()方法时会查找常量池中是否具有相同的Unicode字符串常量,如果有则返回其的引用;如果没有则在常量池中增加一个与其相同的Unicode字符串并返回其引用;
public class Test03 {
	public static void main(String[] args){
	    String str1 = "abcd";
	    String str2 = new String("abcd");
	    String str3 = new String("abcd");
	    System.out.println(str1 == str2);
	    System.out.println("**************");
	    //str2虽然调用了intern()方法但是并未返回给其引用
	    str2.intern();
	    //str2调用了intern()方法并返回其引用
	    str3 = str3.intern();	
	    System.out.println(str1 == str2);
	    System.out.println(str1 == str3);
	}
}

输出结果:
false
**************
false
true


5.String实例是不可变的
String str3 = "ab"+"cd"
存在ab cd 以及abcd三个字符串常量;会造成内存的浪费所以对字符串一般采用StringBuffer

6.附加
public class Test {
	public static void main(String[] args){
	    String str1 = "abcd";
	    String str2 = "cd";
	    //str2由于+号后存在str2的引用无法在编译期进行确定与str1地址是不同的
	    String str3 = "abcd"+str2;	   
	    System.out.println(str1 == str3);
	}
}

输出结果:
false




邪恶的面试题
public class Test{	
	public static void main(String[] args){
	    String a = "a1";
	    String b = "a"+ 1;
	    System.out.println("------>"+a==b);
	}
}
  • 相关文章
发表评论
用户名: 匿名