黑马程序员-java高新技术(一)

家里没网络,纠结啊,只能在记事本上写让回跑来网吧发布。


一,享元模式 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集合中检索对象,也将返回找不到对象的结果,也无法单独删除当前对象,
从而造成内存溢出。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值