java知识查缺补漏

 

作者: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来进行比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值