String 是八大基本数据类型里的一种
String类型是不可变的类型
如果一个类,在他创建完成之后,该对象的成员变量不能够被改变,基本数据类型的值不能改变,引用类型的变量不能指向其他对象,那就说明这个类是不可变的
举一个简单的例子:(在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap)
String s = "abd";//先在堆中创建了一个s实例
s = s + "ef"; //又创建了一个 s 把原来的s+“ef”赋值给他 原来的s会被垃圾回收机制回收
//所以s 实际上并没有被更改
-
正因为String 的不可更改 ,所以他需要不断的创建和回收极大的消耗内存,系统开销大
-
所以出现了StringBuffer ,StringBuilder 主要用于字符串的了解(下一篇详细讲解)
关与String的判空
“”和null的区别
null
-
String s = null表示的是一个s的值为null,而并不是一个字符串
-
表示声明一个字符串对象的引用,但指向为null,所以他(还)没有指向任何的内存空间
”“
-
String s = null; 表示一个空字符串,也就是说他的长度为0
-
表示声明一个字符串类型的引用,其值是空字符串,这个 s 引用指向的是空字符串的内存空间
所以String类型的判空应该为: if(s == null || s.length() == 0); 推荐
也可以是:if(s == null || s.equals(""));不推荐,效率低
注意:s==null一定要写且要写在前面 要不然会报java.lang.NullPointerException 在他为null的情况下就没必要比较长度了
拓展
list map set集合判空
if(list != null && !list.isEmpty()){
//最佳方法 list存在且有元素
}
if(list != null && list.size() == 0){
}
//剖析
list != null 同上判断是否存在这个list null表示这个list不指向任何的东西,如果你调用他会报java.lang.NullPointerExceptionlist.isEmpty() 判断这个list集合是否存在元素
list.size()==0 判断这个list集合里有几个元素
Date类型判空
Date date = new Date();
if(date ==null){
sout("date is null");
}else{
sout("date is not null");
}
equals和 ==
先说==
-
如果是八种基本类型之间的 == ,那比较的是他们的值是否相等
-
如果是引用类型的比较,则判断的是他们内存地址是否相等(每次new一个新的对象会重新分配一个内存空间,地址改变)
equals
-
判断的是内存地址是否相等
-
可以重写equals比较其内容是否相等 重写equals时必须重写hashcode()方法
-
存储一个元素首先会使用Hash算法生成一个int类型的hashcode散列值
-
然后与已经存储的所有元素的hashcode相比较
-
如果hashcode不相等,那么两个对象一定不相等
-
如果hashcode相等,再调用再判断其内容是否相等 如果内容也相等那这两个对象相等,如果内容不相等,这两个对象也是不相等的
-