day25——集合2

2 篇文章 0 订阅
  1. 迭代器对象:
        Iterator: 迭代器对象,只能从上往下迭代.Iterator iterator list.iterator();
           boolean  hasNext(); 判断当前指针后是否有下一个元素
           Object    next():获取指针的下一个元素,并且移动指针.
        ListIterator:  是Iterator接口的子接口,支持双向迭代,从上往下迭代,从下往上迭代.
        Enumeration:古老的迭代器对象,现在已经被Iterator取代了. 适用于古老的Vector类.

  2. 1):foreach可以操作数组:        底层依然采用for循环+ 索引来获取数组元素.
    2):foreach可以操作Iterable的实例:底层其实采用的Iterator(迭代器).

  3. 当需要边迭代集合元素,边删除指定的元素时:只能使用迭代器对象的remove方法.
    在Collection接口中存在删除指定元素的方法:boolean  remove(Object ele), 该方法只能从集合中删除元素,不能把迭代器中指定的元素也删除,出现并发修改异常
    使用Iterator中的remove方法,该方法会从两个线程中同时移除被删除的元素,保证了两个线程的同步.

  4. 使用迭代器迭代的时候(底层就是),在当前线程A中,会单独创建一个新的线程B.
    A线程负责继续迭代, B线程负责去删除.
    B线程每次都会去检查和A线程中的元素是否个数相同.如果不是报错ConcurrentModificationException.

  5. Set判断两个对象是否相等用equals,而不是使用==。

  6. HashSet是Set接口最常用的实现类,底层采用了哈希表算法.
    其底层其实也是一个数组,提高查询速度,插入速度也比较快,但是适用于少量数据的插入操作.
    在HashSet中如何判断两个对象是否相同问题:
           1):两个对象的equals比较相等.   返回true,则说明是相同对象.
           2):两个对象的hashCode方法返回值相等.
    对象的hashCode值决定了在哈希表中的存储位置.
    二者:缺一不可.
    往HashSet添加对象的时候,先判断该对象和集合中对象的hashCode值:
                             1):不等: 直接把该新的对象存储到hashCode指定的位置.
                             2):相等: 再继续判断新对象和集合对象中的equals做比较.
                                            1>:hashCode相同,equals为true: 则视为是同一个对象,则不保存在哈希表中.
                                            1>:hashCode相同,equals为false:非常麻烦,存储在之前对象同槽为的链表上.
    存储在哈希表中的对象,都应该覆盖equals方法和hashCode方法,并且保证equals相等的时候,hashCode也应该相等.

  7. LinkedHashSet:底层采用哈希表和链表算法,不允许元素重复,记录先后添加的顺序

  8. TreeSet集合底层才有红黑树算法,会对存储的元素默认使用自然排序(从小到大).
      注意: 必须保证TreeSet集合中的元素对象是相同的数据类型,否则报错.
  9. TreeSet的排序规则:
    1:自然排序(从小到大):自动排序
    TreeSet调用集合元素的compareTo方法来比较元素的大小关系,然后将集合元素按照升序排列(从小到大).
    注意:要求TreeSet集合中元素得实现java.util.Comparable接口.
    java.util.Comparable接口
    集合元素实现接口,覆盖 public int compareTo(Object o)方法,在该方法中编写比较规则,则自动排序
    在该方法中,比较当前对象(this)和参数对象o做比较(严格上说比较的是对象中的数据,比如按照对象的年龄排序).
           this  >  o: 返回正整数.  1
           this <   o: 返回负整数.  -1
           this == o: 返回0.     此时认为两个对象为同一个对象.
    在TreeSet的自然排序中,认为如果两个对象做比较的compareTo方法返回的是0,则认为是同一个对象.
    2:定制排序(从大到小,按照名字的长短来排序):
    在TreeSet构造器中传递java.lang.Comparator(接口)对象.该对象实现Comparator,并覆盖public int compare(Object o1, Object o2)再编写比较规则.
    对于TreeSet集合来说,要么使用自然排序,要么使用定制排序.
    判断两个对象是否相等的规则:
    自然排序:   compareTo方法返回0;定制排序:  compare方法返回0;
  10. 泛型:谁调用,随决定.

  11. 泛型类:直接在类/接口上定义的泛型.
    泛型的菱形语法:List<String> list = new ArrayList<>();
    使用集合都得使用泛型来约束该集合中元素的类型。底层依然使用强转

  12. 泛型方法:在方法上声明泛型
        情况1):泛型类中的泛型只能适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法:
        情况2):泛型类中的泛型应该适用于整个类中多个方法,有时候只对某一个方法设置泛型即可.
        一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的.
        如果没有参数来设置泛型的具体类型,此时的方法一般返回类型为Object即可.
        public static <T> List<T> asList(T... a) {
             return new ArrayList<T>(a);
        }

  13. 泛型的通配符和上限和下限:
      泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?
      此时只能接受数据,不能往该集合中存储数据
    泛型的上限和下限:用来限定元素的类型必须是X类的子类或相同,  X的父类或相同.
    private void doWork(List<?> list){};
    doWork(new ArrayList<String>());
    doWork(new ArrayList<Integer>());

  14. 泛型擦除和转换:
            1):泛型编译之后就消失了(泛型自动擦除);
             2):当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除(手动擦除).
    堆污染:
        单一个方法既使用泛型的时候也使用可变参数,此时容易导致堆污染问题.
    如:在Arrays类中的asList方法: public static <T> List<T> asList(T... a).

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值