basic java-1

1.JDK1.5+的基本类型自动装箱拆箱
Integer i1=10;
Integer i2=10;

他们产生的是同一个对象,那下面这个呢?
Integer i1=138;
Integer i2=138;

产生两个不同的对象,这是为什么呢?小于一个字节(-128~127)的数,java虚拟机会将这个对象放在缓存中,创建下一个对象是先去找是否已经存在这个对象。其实这里蕴含了一种设计模式-->flyweight(享元模式)-->将相同的属性作为对象的内部属性,不相同的属性作为方法的外部参数传进来

2.枚举
  -->枚举可以有自己的构造方法(必须是private的)
  -->枚举的任何一个子类都可以使用枚举类的带参构造方法创建对象,参见以下枚举类(包含枚举构造方法,抽象类...)
public enum TrafficLamp{
RED(30){
    @Override
        public TrafficLamp nextLamp() {
            // TODO Auto-generated method stub
	   return GREEN;
	}
    },GREEN(45){
	@Override
	public TrafficLamp nextLamp() {
	    // TODO Auto-generated method stub
	    return YELLOW;
	}
    },YELLOW(5){
	@Override
	public TrafficLamp nextLamp() {
	    // TODO Auto-generated method stub
	    return RED;
	}
    };
    public abstract TrafficLamp nextLamp();
    private int time;
    private TrafficLamp(int time) {
	    this.time = time;
    }
}


3.反射(方法)的一个小例子
String habi="abcdefg"
Method charAt=Class.forName("java.lang.String").getMethod("charAt",int.class);
System.out.println(charAt.invoke(gabi,2));

运行结果: c
当invoke的第一个参数为null的时候,说明是不需要对象就可以执行的方法,什么方法呢?当然是静态方法,很容易理解。

4.当一个对象存到HashSet中时,不要修改那些用于计算hashCode的字段。为什么?先要弄清楚HashSet的存储原理-->先把内存划为一块块的区域,然后根据对象的hashCode将对象存储了对应的区域中。这样,如果修改计算hashCode的字段,对象的hashCode就变化了,后面你如果再想删除这个对象时就删除不了了。这样就会出现内存泄露(变向说明java是有内存泄露的)。

5.利用反射,可以判断一个对象是否是数组或者其他类型:object.getClass().isArray()。

你可能感兴趣的:(java,设计模式)