Java基础学习:集合篇

1.什么是集合?

  1.1 Java集合的概述:一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储,另一方面,使用Array存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态把多个对象的引用放入容器中

  1.2 Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组

  1.3 存储对象可以考虑:① 数组 ② 集合

  1.4 数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Student();......

    >弊端:① 一旦创建,其长度不可变 ② 真实的数组存放的对象的个数是不可知  

  1.5 Java 集合可分为Collection 和 Map 两种体系 

    > Collection 接口:Set : 元素无序、不可重复的集合,List:元素有序,可重复的集合

    > Map 接口:具有映射关系“key-value对”的集合

2.Collection

   2.1 Collection 接口下的方法:

    > size():返回集合中元素的个数

    > add(Object obj):向集合中添加一个元素

    > addAll(Collection coll):将形参coll中包含的所有元素添加到当前的集合中

    > isEmpty():判断集合是否为空

    > clear():清空集合元素

    > contains(Object obj):判断集合中是否包含指定的obj元素。如果包含,返回true,反之返回false,判断的依据:根据元素所在的类的equals()方法进行判断,明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法

    > containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素

    > retainAll(Collection coll):求当前集合与coll的共有的元素,返回给当前集合

    > remove(Object obj):删除集合中的obj元素,若删除成功,返回true,否则返回false

    > removeAll(Collection coll):从当前集合中删除包含在coll中的元素

    > equals(Object obj):判断集合中的所有元素是否完全相同

    > hashCode():返回数组的hash值

    > toArray():将集合转化为数组  

    > iterator():返回一个Iterator接口实现类的对象

@Test
public void test(){

    Collection coll = new ArrayList();
    coll.add(123);
    coll.add(new String("AA"));
    coll.add(new Date());
    coll.add("BB");
    coll.add(new Person("MM",23));
    
    Iterator i = coll.iterator();
    while(i.hasNext()){
       System.out.println(i.next());
    }          
}

 3.List

  3.1 List : 存储有序的,可以重复的元素

  3.2 ArrayList:List的主要实现类,内部是数组实现,遍历使用此实现

    > add(int index, Object ele):在指定的索引位置index添加元素ele

    > addAll(int index,Collection eles):在指定的索引位置index添加元素集合

    > get(int index):获取指定索引的元素

    > indexOf(Object obj):返回obj在集合中首次出现的位置,没有的话,返回-1

    > lastIndexOf(Object obj):返回obj在集合中最后一次出现的位置,没有的话,返回-1

    > remove(int index):删除指定索引位置的元素

    > set(int index,Object ele):设置指定索引位置的元素为ele

    > subList(int fromIndex,int toIndex):返回从fromIndex到toIndex结束的一个子list

  3.3 LinkedList:对于频繁的插入、删除操作,建议选择此实现类

  3.4 Vector:线程安全的,不建议使用

4.Set

  4.1 Set:存储无序的,不可重复的元素,Set中常用的方法都是Collection下定义的

    >  无序性:无序性 != 随机性,真正的无序性,指的是元素在底层存储的位置是无序的

    > 不可重复性:当向Set 中添加进相同的元素的时候,后面这个不能添加进去

    > 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法,进而保证Set中的元素的不可重复性

    > Set中的元素是如何存储的呢?使用了哈希算法:当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置,若此位置之前没有对象存储,则这个对象直接存储到此位置,若此位置已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能在添加进来,万一返回false呢。要求:hashCode()方法要与equals()方法一致

  4.2 HashSet:Set的主要实现类  

  4.3 LinkedHashSet:使用链表维护了一个添加进集合中的顺序,导致我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的,是HashSet的子类,它是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的,插入的性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能,它不允许集合元素重复

  4.4 TreeSet:向它添加的元素必须是同一个类,可以按照添加进集合的元素的指定的顺序遍历,像String,包装类等默认按照从小到大的顺序遍历,当向TreeSet中添加自定义类的对象时,有两种排序方法 ① 自然排序 ②  定制排序,自然排序要求自定义类实现java.lang.Comparable 接口并重写其compareTo(Object obj)在此方法中,指明按照自定义类的哪个属性进行排序,向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。PS:compareTo()与hashCode()、equals()保持一致,定制排序:实现 Comparator 接口

public void test{
   Comparator com = new Comparator(){
       public int compare(Object o1,Object o2){
            if(o1 instanceof Customer && o2 instanceof Customer){
                Customer c1 = (Customer) o1;
                Customer c2 = (Customer) o2;
                int i = c1.getId().compareTo(c2.getId());
                if(i == 0){
                     return c1.getName().compareTo(c2.getName());
                }
                return i;
            }
            return 0;
       }
   }
   TreeSet set = new TreeSet(com);
   set.add(new Customer("AA",1003));
   set.add(new Customer("BB",1002));
   set.add(new Customer("GG",1004));
   set.add(new Customer("CC",1001));
   set.add(new Customer("DD",1001));
   for(Object str:set){
       System.out.println(str);
   }   
}       

 5.Map

  5.1 Map与Collection并列存在,用于保存具有映射关系的key-value,Map中的key和value都可以是任何引用类型的数据,Map中的key用set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode()和equals()方法,常用String类作为Map的“键”,key 和 value 之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value

  5.2 Map接口下的主要方法:

    > put(Object key,Object value):向Map中添加一个元素

    > remove(Object key):

    > putAll(Map t):

    > clear():清空map

    > get(Object key):获取指定的key的value值,若无此key,则返回null

    > containsKey(Object key):

    > containsValue(Object value):

    > size():返回集合的长度

    > equals():

  5.3 HashMap 解析:key是用Set来存放的,不可重复。value是用Collection来存放的,可重复一个key-value对,是一个Entry。所有的Entry是用Set存放的,也是不可重复的,向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同则只能添加进后添加的那个元素

  5.4 如何遍历Map:

    > Set keySet():返回map集合的key集合

    > Collection values():返回map集合的value集合

    > Set entrySet():返回map集合的entry对

  5.5 LinkedHashMap:使用链表维护添加进Map中的顺序,故遍历Map时,是按添加的顺序遍历的

  5.6 TreeMap:按照添加进map中的元素的key的指定属性进行排序。要求:key必须是同一个类的对象,针对key:自然排序,定制排序

  5.7 Hashtable:Hashtable是个古老的Map实现类,线程安全,与HashMap不同,Hashtable不允许使用null作为key和value,与HashMap一样,Hashtable也不能保证其中key-value对的顺序,Hashtable判断两个key相等、两个value相等的标准与HashMap一致。

  5.8 操作集合的工具类Collections:Collections是一个操作Set、List和Map等集合的工具类,Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法

    > 排序操作:

    > reverse(List):反转List中元素的顺序

    > shuffle(List):对List集合元素进行随机排序

    > sort(List):根据元素的自然排序对指定List集合按升序排序

    > sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序

    > swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换

    > 查找、替换

    > max(Collection c):根据元素的自然排序,返回给定集合中的最大元素

    > max(Collection c,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素

    > min(Collection c):根据元素的自然排序,返回给定集合中的最小元素

    > min(Collection c,Comparator):根据Comparator指定的顺序,返回给定集合中的最小元素

    > frequency(Collection c,Object o):返回指定集合中指定元素出现的次数

    > copy(List dest,List src):将src中的内容复制到dest中

    > replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值

    

    

猜你喜欢

转载自www.cnblogs.com/q151860/p/9163981.html