corejava学习-----------------集合

集合

集合出现的原因就是为了弥补数组的长度是固定不可变的缺陷,以及存放引用类型的数据。


(一)集合与数组的区别:

1、集合:容器,装载一定数据量不确定的数据
(1)位于java.util包中        
(2)不能存放基本数据类型,使用包装器类把基本数据类型装箱    
(3)下标从0开始    
(4)使用size()方法获取集合的长度                    

2、数组:
(1)长度固定
(2)数据类型固定(优点)
(3)下标从0开始
(4)使用length属性获取数组的长度

 


(二)集合的继承关系

 

 

 

(三)集合的遍历

1、Collection集合:
(1)List集合:
    1.使用for循环进行遍历,因为List集合比Set集合多了一个下标的概念,所以使用for循环时,可以通过下标确定初始条件,再通过集合的size()方法确定结束条件
    2.使用加强for循环
    3.使用iterator方法获得Iterator的实现类,再利用while循环使用hasNext和next进行遍历
    4.【不重要】使用while循环,再使用hasPrevious()和iter.previous()方法


(2)Set集合:
    1.使用加强for循环
    2.使用iterator方法获得Iterator的实现类,再利用while循环使用hasNext和next进行遍历


(3)Map集合:
    1.使用keySet()方法获得键值的集合Set,再用加强for循环遍历key值,使用map.get(key)
    2.使用keySet()方法获得键值的集合set,再用iterator去遍历键值集合
    3.使用entrySet()获得键值对的引用的集合Set,再使用加强for循环,使用getKey()、getValue()方法
        
【了解】1、查看源码了解Iterater迭代器遍历集合collection的基本原理:
    Iterater it = coll.iterator();    
    Collection接口继承自Iterator接口,使用Iterator接口中的iterator()方法产生一个Iterater的实现类Itr的对象it,
    这个实现类对hasNext()和next()进行重写,并且Itr这个实现类是放在ArrayList类中,是一个成员内部类;
    优点:可以访问ArrayList类中的属性和方法

           2、set初始容量为16,
                 list的初始容量为10,当集合中的值超出集合容量时,这是集合会以1.5倍进行扩增

【重点】1、list可以使用Collections中的sort方法进行排序,而set不可以使用;
                 (1)因为hashset本身采用的是哈希表存储数据,方便查询,如果对hashset集合中的数据进行排序的话,那么哈希就没有起任何作用了;所以自然是不支持对HashSet集合中的数据进行排序的。

                 (2)Collections.sort(List<T> list)/Collections.sort(List<T> list,Comparator<? super T> c);第一个方法是对list集合中的数据进行自然排序,因为String、Integer等类都是实现了Comparable方法的,所以会使用他们重写的compareTo方法进行排序;所以只要涉及到compareTo和compare方法的都只能加入同种类型的数据,否则会出现类型转换异常。
                 (3)而TreeSet实现了SortedSet接口,能够对集合中的对象进行排序的(自然排序/客户化排序)

    


(四)HashSet:

(1)采用的是哈希表算法,使用哈希表存储数据,可以存放null值,查询效率高,不能记录数据加入集合时的顺序;
(2)加入HashSet中的数据要对hashcode方法和equals方法进行重写,以保证加入到集合中的数据都是不重复的。

 

【重点】1、对hashcode方法进行重写的原因;
    提高对比的效率,比单独使用equals方法要快很多

              2、HashSet和LinkedHashSet

                   HashSet是不记录插入顺序的,但是它能限制加入集合的对象是不重复的,因为它使用的是哈希表来存放数据,哈希表其实就是数组和链表的结合体,底层其实是一个数组,但数组的每一项又是一个链表,所以做到了方便查找又能方便扩展。

                   LinkedHashSet则是哈希表和链表的结合,这样就既能记录插入集合的顺序,又能去重。

                链表中的每一个节点在存储空间中的存储位置其实是无序的,但是每一个节点中都存储了两部分(数据+下一个节点的地址)链表虽然是无序,但是通过指针的指向实现了链表的有序性。

          3、LinkedList查询比ArrayList慢的原因:

                 (1)ArrayList底层是基于数组的,所以它有明确的下标,可以通过下标直接查找并获得数据

                 (2)而LinkedList的get方法实际上是通过循环,把当前节点指向上一个或者下一个来找到索引位置的节点来获得数据。所以效率上就会比ArrayList慢很多。

 


(五)TreeSet:

(1)不能存放基本数据类型的数据,只能存放引用类型的数据(但基本数据类型能够自动装箱成与其对应的包装器类型,所以就能存入到集合中去),
(2)只能存放同一类型的基本数据类型,基本数据类型的包装器类型有一个共同的父类Number,所以两个子类是无法转化的;可以放入可以转化的类型,比如父类型

【重点】1、自定义排序:添加进TreeSet集合的对象所属的类必须实现了Comparable接口,对compareTo方法进行实现;
        compareTo(Object o1):return 1:交换位置     0:表示o1这个对象和调用conpareTo方法的是同一个对象    -1:不交换位置
        (Double、String、Integer等包装器类型已经对Comparable接口进行了实现)

           String类中对compareTo的重写:实现的排序是对英文字符的首字母按照a,b,c,d进行排序的,如果首字母相同的话会再比对第二个字符。

              2、客户化排序:构建TreeSet对象的时候直接就声明排序规则,使用Comparator接口,实现了compare方法(与compreTo方法类似)
    优点:这样就算没有实现Comparable接口的类的对象也能加入到TreeSet集合中

    TreeSet set = new TreeSet(new Comparator(){
           @Override
           public int compare(Object o1, Object o2) {
                if(o1 instanceof Student && o2 instanceof Student) {
            Student stu1 = (Student)o1;
            Student stu2 = (Student)o2;
               return stu1.getName().compareTo(stu2.getName());
                   }
                 return 0;
           }
       });

 


(六)Map:

(1)Map集合中的数据都是成对存储的,一个key值会对应一个value值;
(2)map集合中放置的键不可重复,值随意;
(3)如果往map集合中将要放置的键值对中的键在map集合中已经存在,这时会执行一个覆盖操作;

1、HashMap:
HashMap集合中的key值的存储方式与HashSet集合存储数据的方式相同;放入其中的键不允许重复,重写hashCode或者equals方法

2、TreeMap:
TreeMap集合中key值的存储方式与TreeSet集合存储数据的方式相同;键不能重复,键可以排序(客户化排序、自然排序)


集合的笔试题:添加学生对象到集合中,要求如下
1.Student类属性:name age NumCard
2.集合中的对象,要按照学生学号排序(从小到大)
3.成绩按照从大到小,但是Tom不管考多少分都是班上第一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值