Java 基础复习
1. 虚拟机对字符串的处理
虚拟机是将字符串直接量(不用 new 声明的)对象放到一个对象池中去缓存的,第
一次使用的时候会将其放入池中,如果下次有其他变量访问一摸一样的直接量的话
直接从对象池中去取该直接量,而不是又再生成一个对象。一般该池中的对象都不会
被垃圾回收器回收。
比如:
String str1 =
"1"
;
String str2 =
"1"
;
实际上这段代码仅仅创建了一个字符串直接对象,保存在对象池中,池中对象就
”
是 1”。str1 和 str2 指向了该对象池的对象位置。
2. 编译时能确定的值
在编译时就能确定的值,在编译的时候就能够确定是否创建新的对象池对象。比如:
String str3 =
"suhuanzhen123"
;
String str4 =
"suhuanzhen"
+ 1 +
"2"
+
"3"
;
System.
out
.println(str3 == str4);
实际上 str3 和 str4 在内存池中都是指向了"suhuanzhen123"这个字符串对象,所
以输出时 true。因为 str4 在编译期间就能确定值是 suhuanzhen123,所以 JVM 不
会再创建新的对象。直接从对象池中去取。
3. 在编译期间不能确定的值
如果字符串的拼接包含了函数、变量等等编译时不确定因素,那么此时就不能指向对
象池中的变量了。比如
String str5 =
"suhuanzhen123"
;
String str6 =
"suhuanzhen"
+
"1"
.length() +
"2"
+
"3"
;
System.
out
.println(str5 == str6);
4. 在编译时就能确定值的字符串变量创建值
比如代码
String str6 = "suhuanzhen" + "1" + "2" + "3";
——
实际上仅仅创建了一个对象
suhuanzhen123,缓存到对象池。
5. StringBuilder 和 StringBuffer 的区别
一般在单线程的系统环境下优先使用 StringBuilder,因为它是非线程安全的。而在
多线程的环境下,比如 Web 系统,优先使用 StringBuffer,因为它当中绝大部分方
法都使用了 synchronized 进行修饰,保证了多线程环境下的线程安全问题。
6. 字符串之间的比较
用一个线程池的常量对象和一个变量、函数返回值比较直接使用==其实就可以了比
如:
String jqgridparams = request.getParameter(
"jqgridparams"
);
if
(jqgridparams !=
null
) {
if
(
"getparams"
== jqgridparams) {
//……………………
}
}
1
/
14