10-9 程宗武
10-9 集合
/**
* 1.Set接口的框架:
* |---Collection接口:单例集合,用来存储一个一个的对象
* |---Set接口:存储无需的,不可重复的数据
* |---HashSet:作为Set接口的主要实现类:线程不安全的:可以存储null值
* |---LinkedHashSet:作为HashSet的子类:遍历其内部数据时,可以按照添加的顺序遍历。
* 对于有频繁的遍历操作,LinkedHashSet效率要 高于HashSet
* |---TreeSet:可以按照添加对象的指定属性,进行排序。
*
* 2.Set接口中没有额外定义新的方法,使用的都是Collection中声明过的方法。
*
* 3.要求:向Set中添加的数据,其所在类一定要重写hashCode()和equals()
* 重写的hashCode()和equals()尽量保持一致性:相等的对象必须具有相等的散列码
* 重写两个方法的小技巧:对象中用作equals()方法比较的Field,都应该用来计算hashCode()
*/
/**
* Collections:操作Collection、Map的工具类
* Collections类中提供了多个synchronizedXxx()方法,
* 该方法可以使指定集合包装成线程同步的集合,从而可以解决
* 多线程并发访问集合时的线程安全问题。
*/
/**
* 泛型的使用
* 1.jdk 5.0新增的特性
* 2.在集合中使用泛型:
* 总结:
* ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构
* ② 在实例化集合类时,可以指明具体的泛型类型
* ③ 指明完以后,在集合类或接口中凡是定义类或接口时,
* 内部结构(如:方法,构造器等)使用到泛型的位置,都指定为实例化的泛型类型。
* 如:add(E e)-->实例化后 add(Integer e)
* ④ 注意:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置
* 拿包装类替换。
* ⑤ 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。
*/
* G<? extends A> 可以作为G<A>和G<B>的父类,其中B是A的子类
* G<? super A> 可以作为G<A>和G<B>的父类,其中B是A的父类
练习分析
Map<Short, String> map = new HashMap<>();
for (short i = 0; i < 100; i++) {
map.put(i, String.valueOf(i));
map.remove(i - 1); //传入的实参为int类型,move方法的形参为Object类型,因此传入的实参自动包装为Integer类型,将要删除的Integer类型的Key和已经存入的entry实体的k(short类型)做equals判断时,结果为false,因此返回null,该元素不能被删除,因此调用size()方法的结果为100
}
System.out.println(map.size()); //100
近期评论