background image

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