家里没网络,纠结啊,只能在记事本上写让回跑来网吧发布。
一,享元模式 flyweight:
小的整数(使用频率高的对象)在装箱的时候装成同一个数 ~128-127
二,枚举:枚举就是让某给类型的变量的取值只能为若干个固定值中的一个,否则编译器将报错。枚举可以让编译器在编译是就可以控制源程序中填写的非法值,普通变量的方式在开发间断无法实现这一目标。
普通类中实现枚举功能:
1,私有的构造方法
2,每个元素分别用一个公有的静态成员变量表示
3,可以有若干公有方法或抽象方法。
4,采用抽象方法定义方法就将大量的if else语句转成一个个独立类。
三,反射技术:
反射:反射就是把java类中的各种成分映射成相应的java类
获取字节码:
类名.class ,例如:System.class
对象.getClass() 例如:new Date().getClass();
Class.forName("类名") 例如:Class.forName("java.util.Date");
//获取到类名,并调用该类的无参构造方法
Collection collections = (Collection)Class.forName(className).newInstance();
反射与常用创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式://得到某个类上的某一个构造方法字节码
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str = (String)construtor.newInstance(new StringBuffer("abc"));
//反射不使用缓存,比较费时,性能比较低
Field 代表字节码里的变量,不代表对象里的某个变量
Person {
private int x;
public int y;
}
Person person = new Person(3,5);
Field fieldY = person.getClass().getField("y");
System.out.print(fieldY.get(person));
Field fieldX = person.getClass().getDeclaredField("x");
//强制获取
fieldX.setAccessible(true);
System.out.print(fieldX.get(person));
Method 方法
//str1.charAt(1);
Method method = String.class.getMethod("charAt",int.class);
//发信号,invoke调用方法
System.out.print(method.invoke(str1,1));
数组反射的应用
private static void show(Object obj){
Class class = obj.getClass();
//判断是否是数组
if(class.isArray()){
int len = Array.getLength(obj);
for(int i = 0;i<len;i++){
System.out.print(Array.get(obj,i));
}
}
}
四,Hashcode 分析 及 ArrayList 和HashSet比较
hashcode 只有类的实例对象要被采用哈希算法惊醒存储和检索时,这个类才需要按要求覆盖hashcode方法。即使程序可能暂时不会用到当前类的hashCode方法,但是为他提供一个hashcode方法也不会又什么不好,没准以后什么时候又用到这个方法,所以,通常要求hashCode方法和equals方法一并同时覆盖。
HashSet特性及内存溢出小例子:
Person person = new Person();
Collection collections = new HashSet();
Person person1 = new Person(1,2);Person person2 = new Person(3,5);
Person person3 = new Person(1,2);
collections.add(person1 );
collections.add(person2 );
collections.add(person3 );
person1 .a = 7;
collections.remove(person1 );
System.out.println(collections.size());
输出 2
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段。否则,对象修改后的哈希值就会改变
在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,也无法单独删除当前对象,
从而造成内存溢出。