作者:fbysss
msn:jameslastchina@hotmail.com
blog:blog.csdn.net/fbysss
声明:本文由fbysss整理编写,转载请注明出处
关键字:java基础
1.字符串相关
public class Test2 {
public static void main(String[] args) {
String a = "ab";
String b = a+""; //语句1
// String b =”a”+"b";//语句2
System.out.println((a == b));
}
}
返回false ,好理解
如果使用语句2,则返回true,原因是什么?因为jvm认为”a”,”b”是常量,在编译时进行了优化
2.关于static代码段
public class TestStatic {
static {
System.out.println("***");
}
public static final String a = "sss";
public static void main(String[] args) {
System.out.println(TestStatic.a);
}
}
输出是
***
sss
因为static代码段在类加载时就要执行
但是注意,如果是另外一个类调用:
public class Test2 {
public static void main(String[] args) {
System.out.println(TestStatic.a);
}
}
输出却是
sss
而把final关键字去掉,结果又和上面一样。
原因在final关键字,编译期间,把TestStatic.a优化为”sss”了,所以跟TestStatic实际没有关系了。
相关讨论见
http://skydream.javaeye.com/blog/48351
http://www.javaeye.com/topic/211937
3.字节码查看
javap -c[verbose] MyClass
4.关于HashCode
package com.sss.test.String;
import java.util.Hashtable;
/**
* <p>标题: TestHash.java</p>
* <p>功能描述: <br>
*
* </p>
* <p>版权: Copyright (c) 2007</p>
* <p>公司: </p>
* @author fbysss
* @version 1.0
*
* </p>
* <p>修改记录:</p>
* 创建时间:2008-7-10 下午08:29:46
* 类说明
*/
public class TestHash {
public static void main(String[] args){
Hashtable hsPeriod = new Hashtable();
hsPeriod.put('W', 1);
hsPeriod.put('T', 1);
hsPeriod.put("H", 1);
hsPeriod.put('M', 1);
String strH= "H";
char charH = 'H';
char char1 = '1';
System.out.println(hsPeriod.get(strH));
System.out.println(hsPeriod.get(charH));
System.out.println(hsPeriod.get(char1));
Character charS ='s';
String strS = "s";
System.out.println("charS.hashCode:"+charS.hashCode());
System.out.println("strS.hashCode"+strS.hashCode());
System.out.println("strS.equals(charS)?"+strS.equals(charS));//hashCode相同,但对象不一定相同
System.out.println("--------------------------");
String ss= "ss";
String strA = "sss";
String strB = "sss";
String strC ="ss"+"s";
String strD ="ss"+"s";
String strE =ss+"s";
System.out.println("strA.hashCode():"+strA.hashCode());
System.out.println("strB.hashCode():"+strB.hashCode());
System.out.println("strC.hashCode():"+strC.hashCode());
System.out.println("strD.hashCode():"+strD.hashCode());
System.out.println("strE.hashCode():"+strE.hashCode());
System.out.println("--------------------------");
System.out.println("strA==strB?"+(strA==strB));
System.out.println("strA==strC?"+(strA==strC));
System.out.println("strA==strD?"+(strA==strD));
System.out.println("strA==strE?"+(strA==strE));
System.out.println("--------------------------");
System.out.println("strA.equals(strB)?"+strA.equals(strB));
System.out.println("strA.equals(strC)?"+strA.equals(strC));
System.out.println("strA.equals(strD)"+strA.equals(strD));
System.out.println("strA.equals(strE)"+strA.equals(strE));
}
}
输出结果:
1
null
null
charS.hashCode:115
strS.hashCode115
strS.equals(charS)?false
--------------------------
strA.hashCode():114195
strB.hashCode():114195
strC.hashCode():114195
strD.hashCode():114195
strE.hashCode():114195
--------------------------
strA==strB?true
strA==strC?true
strA==strD?true
strA==strE?false
--------------------------
strA.equals(strB)?true
strA.equals(strC)?true
strA.equals(strD)true
strA.equals(strE)true
结论:
hashCode的作用:用于集合中防止添加重复的对象
a equals b,a和b的hashCode一定相同
hashCode 相同,equals可能返回true,也可能返回false
对于字符串,只要字符串值相同,hashCode就相同,无论字符串如何构成。
5.关于自动装箱autoboxing要注意的问题
自动装箱和拆箱事实上是对于编译器来说的。比如Integer i = 10相当于Integer i = new Integer(10);
陷阱1:Integer i = null; int j = i;编译期间是合法的。但是运行肯定会出错,原因自动装箱相当于
Integer i = null;
int j= i.intValue();这样就会报出NullPointerException。
陷阱2:
Integer i1 = 200;
Integer i2 = 200;
i1==i2? 答案居然是false。
这是因为:自动装箱时,对于-128到127之间的值装箱之后,会在内存中被重用,超出这个范围,每次装箱相当于新建了一个Integer对象。这时候应该使用equals来进行比较。