day10
Class.newInstance和Constructor.newInstance()
首先来分析new和newInstance(),在使用new来创建一个对象时,我们必须知道这个对象的确切类型,而用newInstance()不知道知道确切类型,通过反射来创建实例。
我们知道newInstance()是通过类加载机制,也就是说,要加载过我们要创建的类型,才能创建对象实体。
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。
Class.newInstance() 抛出所有由被调用构造函数抛出的异常。
Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;
Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。
队列
Queue
Queue在SE5中仅有的两个实现是LinkedList和PriorityList,其中,优先级队列的排列规则按照对象类型实现的Comparable控制。
使用方法如下:
|
|
深入理解Map
Map里面总共6个实现:
HashMap
TreeMap
LinkedHashMap//LinkedHashMap可以使用最近最少算法,使得没有被访问的元素放在前面。
WeakHashMap
ConcurrentHashMap
IdentityHashMap
散列与散列码
|
|
原因是因为我们的Groundhog类没有重写hashCode(),继承自Object的方法,Object中equals()用对象的内存地址来散列,因此我们用两个属性相同的对象散列后不想等。
创建equals()满足的条件:
自反性。任意x,x.equals(x)must return true。
对称性。任意x和y,如果x.equals(y)return true then y.equals(x)return true
传递性。
一致性。
对任何不是null的x,x.equals(null)must return false。
容器选择
List
给出了两种容器的性能对比:
|
|
可以看到,对于ArrayList,随机访问操作开销小,中间插入元素开销较大,对于LinkedList,恰恰相反。
Set的选择
测试代码如下:
|
|
HashSet的性能总是比TreeSet好,除了需要排序的Set外,都用HashSet。
###HashMap
容量:表中的桶位数。
初始容量:表在创建时所拥有的桶位数。HashMap和HashSet都具有允许你指定初始容量的构造器。
尺寸:表中当前存储的项数。
负载因子: 尺寸/容量。空表的负载因子是0,而半满表的负载因子是0.5,依次类推。负载轻的表产生的冲突的可能性小。因此对于插入和查找都是最理想的。可以人工指定负载因子,达到水平后扩大容量然后再散列。
Collection中的实用方法
max(Collection) 返回参数的Collection中最大或最小的元素,采用
min(Collection) Collection内置的自然比较法
max(Collection,Comparator) 同上,手动传入比较法。
min(Collection,Comparator)
reverse(list) 逆转所有元素次序
reverseOrder() 返回一个Comparator,逆转顺序
reverseOrder(Comparator
shuffle(List) 随机顺序
shuffle(List,Random)
sort(List
sort(List
copy(List
swap(List,int i,int j) 交换两个位置元素,有优化
min()和max()只能作用于Collection对象。不用管排序。
WeakReference
先说说Java中的GC,当一个对象object被创建时,它被放在Heap里。当GC运行的时候,如果发现没有任何引用指向object,object就会被回收以腾出内存空间。或者换句话说,一个对象被回收,必须满足两个条件:1)没有任何引用指向它 2)GC被运行.
当我们声明了一个强引用时,比如:
StringBuilder buffer=new StringBuilder();
这个buffer就是个强引用,当程序不可访问到这个对象时,也就是没有引用标识符引用它了,GC会自动回收这个对象,但是强引用在某些情况会出问题,比如我们用一个HashMap存了一个控件和空间对应的感兴趣值得映射,如果某个控件的值我们不需要了,就必须手动在HashMap里删除,否则这个值就一直不会释放。
解决方案就是WeakReference,可以用WeakHashMap来存储。就是类似于c++里面的weak_ptr。