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

{1SEAEDAU75U@XF{F4}DH6J

image-20201009224853900

标签

评论

this is is footer