由于是复习的方式来过一遍字符串。这里不会详细的介绍String类型。只是大概聊一聊,我认为比较重要的知识点。至于详细的用法,我推荐去书上看一看,配合着代码敲敲,至于书籍(《java核心卷1》)的链接,我以及在我的java基础复习1有百度网盘的。需要的同学自行去获取。
一,String是不可变的
相信很多人都知道String是不可变的,但是对原因不了解。那么为什么这么说呢。首先看一段代码
private final char value[];
可以看出String的对象一旦定义由于final修饰,它所指向的char数组就已经不可变了。不过这并不能完全说明他是不可变的,因为对于final修饰的数组其实我们是可以修改数组内部的值的。所以原因是什么呢?其实原因挺简单的,因为对于String对象,是没有办法通过方法去改变的。也就是没有setvalue()之类的方法的。所以基本上可以说String是不可变的。
String a="111";
a="222";
这样可不是改变String对象,而是重新new一个新的String对象。
二,关于Stirng的equals()
个人认为还是挺重要的。直接贴上源码吧
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
源码还是很简单的,大家阅读即可,我也不做多的描述,不过这里对于String对象的“==”和equals()的比较方式希望大家还是要了解区分一下的。= =比较的一般的是值,对于引用类型比较的是地址
String a="111";
String b="111";
String c= new String("111");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
大家可以试一试,自己思考一下原因。结果是T,F,T,T。
三,关于StringBuilder和StringBuffer
前面说了Stirng的类是不可变的,意味着对于不同的字符串其实都是要占用不同的空间的。那么我们如果处理一些问题时,需要不断的对字符串操作,那么对内存将会是很大的浪费,而且很耗时间。那么就可以使用StrngBuilder类和StringBuffer类来代替。
特别是做算法题的同学们,特别要注意。关于这两个类的具体操作不赘述。
注:StringBuilder是线程不安全的,而StringBuffer是线程安全的
不过在处理单线程问题,StringBuilder速度会更快。
四,关于String的内存问题
其实对于喜欢思考的同学应该会发现一个问题,对于同样的“111”为什么有的==是true,和有的结果是false。
其实这涉及到字符串常量池和String对象之间的关系。
简单说,就是利用=声明的String对象其实地址是直接指向字符串常量池的。而new出来的对象则是在堆中开辟了一个新的空间,然后在这个空间再指向字符串常量中的实例。因而利用= =比较是会出现false的结果,原因就是地址不同。