Java基础之String类

Java基础之String类

==和equals

众所周知,==是用来比较对象引用所指向的地址的(也可以用来比较基本数据类型),equals是调用equals方法来比较的,具体比较什么是由该方法定义的。我们可以重写该方法来定义比较规则。

之前被问了一题,

1
2
3
Integer i = 100;
Integer j = 100;
System.out.println((i == j)?true:false);

既然都问了,结果必然是true.其原因是因为在Integer类的内部缓存了-128-127.

String类相关

为什么String类不可变

一直知道String类是不可变,之前对于不可变类的理解就是类的对象的状态不可变。

如String str = “abc”;这里的str仅仅是String类型对象的一个引用,这个引用完全是可以改变的。但是对象本身(就是在堆中的那块区域的字符串内容)是不能改变的。

今天突然想到为什么String是不可变的。
从一般意义上来看:我们日常使用的字符串而言,较多时直接使用,或者稍微拼接、裁剪。大量连续改动是较少的情况。

  1. 对于后者,需要连续改动,这种明显是可变的。可变的就有线程安全(同步)问题。这种其实就是StringBuffer。我们反射加载类或者数据库连接池都是通过String来定位的,这时安全问题非常重要。
  2. 对于前者,完全可以将其定为不可变的变量。这样就避免了线程同步带来的消耗。但是有时我们使用字符串没有达到使用stringBuffer的程度。但是可能也需要对字符串做些改动。由于是String是不可变的,自然在此过程中,会产生一些过渡变量。这是不可避免的,但是我们可以做些优化.

由于大部分时候字符串不需太多改动,我们可以在建立String的时候在常量池进行检查,保证某一字符串在常量池只有一份。这也就是String interning
同时由于String的不变性,我们可以直接将String的hashcode计算出来,然后再string搞一个相关的成员变量,这样可以方便其他的类使用。比如hashMap

String创建了几次的问题

这个问题一直在争论,其中涉及到jdk版本,问题的准确描述(创建了几个string对象,“xx”有几份。。),还有很多因素,创建形式 String str = new String(“”);或者 String str = new String(“”);
实在是乱,大概就是常量池一份,如果new 堆中一份(new时如果池中有直接复制,没有创建再复制),

String、StringBuffer、StringBuilder

String劣势:不可变 优势:安全
StringBuffer 优势:可变 还想要安全,这必然是要付出代价的,线程同步的代价 自jdk1就有了
StringBuilder 最简单 索引不要安全,这样最高效,但是有风险。jdk1.五开始所有的+拼接字符串都是用builder来实现。
功能都提供了,就看应用者的选择

参考文章

http://www.importnew.com/7440.html
http://www.hollischuang.com/archives/1246
http://wiki.jikexueyuan.com/project/java-interview-bible/string-array.html