Java的String类在开发时经常都会被使用到,由此可见String的重要性。经过这次认真仔细的学习了java的String类。发现了自己以前开发中对String使用的不足,特写此博客来记录自己对String的学习总结。
首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
String实际上是使用字符数组来存储的数据的。从源码可以清晰看到定义的字符数组。
String在java/lang包下面,java默认导入lang包,所以使用String类时不用导入。
1.创建方式
(1)String ok1=new String(“ok”);
(2)String ok2=“ok”;
我相信很多人都知道这两种方式定义字符串,但他们之间的差别又有多少人清楚呢。画出这两个字符串的内存示意图:
String ok1=new String(“ok”)。首先会在堆内存申请一块内存存储字符串ok,ok1指向其内存块对象。同时还会检查字符串常量池中是否含有ok字符串,若没有则添加ok到字符串常量池中。所以 new String()可能会创建两个对象.
String ok2=“ok”。 先检查字符串常量池中是否含有ok字符串,如果有则直接指向, 没有则在字符串常量池添加ok字符串并指向它.所以这种方法最多创建一个对象,有可能不创建对象
所以String ok1=new String(“ok”);//创建了两个对象
String ok2=“ok”;//没有创建对象
来两题习题看你是否真的明白了
1.下面代码创建了多少个对象?
String temp="apple";
for(int i=0;i<1000;i++)
{
temp=temp+i;
}
复制代码
答案:1001个String temp=new String("apple")
for(int i=0;i<1000;i++)
{
temp=temp+i;
}
复制代码
答案:1002个2.匹配相等String ok="ok";
String ok1=new String("ok");
System.out.println(ok==ok1);//fasle
复制代码
明显不是同一个对象,一个指向字符串常量池,一个指向new出来的堆内存块,new的字符串在编译期是无法确定的。所以输出falseString ok="apple1";
String ok1="apple"+1;
System.out.println(ok==ok1);//true
复制代码
编译期ok和ok1都是确定的,字符串都为apple1,所以ok和ok1都指向字符串常量池里的字符串apple1。指向同一个对象,所以为true.String ok="apple1";
int temp=1;
String ok1="apple"+temp;
System.out.println(ok==ok1);//false
复制代码
主要看ok和ok1能否在编译期确定,ok是确定的,放进并指向常量池,而ok1含有变量导致不确定,所以不是同一个对象.输出falseString ok="apple1";
final int temp=1;
String ok1="apple"+temp;
System.out.println(ok==ok1);//true
复制代码
ok确定,加上final后使得ok1也在编译期能确定,所以输出truepublic static void main(String[] args) {
String ok="apple1";
final int temp=getTemp();
String ok1="apple"+temp;
System.out.println(ok==ok1);//false
}
public static int getTemp()
{
return 1;
}
复制代码
ok一样是确定的。而ok1不能确定,需要运行代码获得temp,所以不是同一个对象,输出false。String ok="apple";
String ok1=new String("apple");
System.out.println(ok==ok1);//false
ok1=ok.intern();//获取常量池ok的引用
System.out.println(ok==ok1);//true--指向同一个对象
复制代码
原文地址:http://wufanxin.blog.51cto.com/7318130/1653462