zoukankan      html  css  js  c++  java
  • Java第七章集合

    七、java集合

     集合体系结构

     

    collection

      方法:

     

    Collection coll = new ArrayList();
    1.size():返回集合中元素的个数
    2.add(Object obj):向集合中添加一个元素
    3.addAll(Collection coll):将形参coll中包含的所有元素添加到当前集合中
    4.isEmpty():判断集合是否为空
    5.clear():清空集合元素
    6.sysout(coll):查看几何中的元素
    7.Collection coll1 = Arrays.asList(1,2,3):声明是直接加进元素
    8.contains(Object obj):判断几何中是否包含指定的obj元素。如果包含,返回true,反之,返回false
    判断的依据,根据元素所在的类的equals()方法进行判断
    明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法
    9.containsAll(Collection coll):判断当前集合中是否包含coll中的所有元素
    10.retainAll(Collection coll1):求当前集合与coll的共有的元素,返回给当前集合
    11.remove(Object obj):删除集合中的obj元素。若删除成功,返回true,否则返回false
    12.removeAll(coll1):从当前集合中删除包含在coll中的元素
    13.equals(Object obj):比较两个集合中的所有元素是否相同
    14.hashCode():集合的hash值,堆空间放在那里
    15.toArray():将集合转化为数组
    16.iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历。
    Iterator iterator = coll.iterator();
    whille(iterator.hasNext())
    sysout(iterator.next());//输出一个

     

     

     

     

    collection子类:

    ------->List

    ArrayList:List的主要实现方法
    List中相对于Collection,新增加的方法
    1.void add(int index,Object obj):在指定的索引位置index添加元素ele
    2.boolean addAll(int index,Collection eles)
    3.Object get(int index):获取指定索引的元素
    4.Object remove(int index):删除指定索引位置的元素
    5.Object set(int index,Object ele):设置指定索引位置的元素ele
    6.List subList(int fromIndex,int toIndex):返回从formIndex到toIndex结束的一个子list集合(左闭右开:包括左边不含右边)
    7.int indexOf(Object obj)返回obj在集合中首次出现的位置,没有返回-1
    8.int lastIndexOf(Object obj)返回obj在集合中最后一次出现的位置,没有返回-1
    
    List常用的方法:
    增(add(Object obj))
    删(remove)
    改(set(int index,Object ele))
    查get(int index)
    插(add(int index,Object obj))
    长度(size())

     

     

    --------->Set子类:

    --------------------->HashSet:

     

    Set:存储的元素是无序的,不可重复的
    1.无序性:无序性!=随机性。真正的无序性,指的是元素在底层储存的位置是无序的。
    2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
    
    说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。
    进而保证Set中元素的不可重复性。
    
    Set中的元素如何存储的呐?使用啦哈希算法。
    当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,
    此哈希值决定了此对象在Set中存储位置。若此位置之前没有对象储存,则这个对象直接存
    储到此位置。位置已有对象存储,再通过equals()比较这两个对象是否相同,如果相同,
    后一个对象就不能再添加进来,万一返回false呐,都存储。(不建议如此) >要求:hashCode()方法要与equals()方法一致

     

     

     

     

    ---------------------->LinkedHashSet:

     

    LinkHashSet:使用链表维护一个添加进集合中的顺序,导致当我们遍历LinkedHashSet集合
    元素时,是按照添加进去的顺序遍历的
    LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能

     

     

     

     

    ----------------------->TreeSet

               自然排序---------自然排序接口Comparable

     

    TreeSet:
    1.向TreeSet中添加的元素必须是同一个类的
    2.可以按照添加进集合中的元素的指定顺序遍历。像String,包装类等默认按照从小到大的顺序遍历。
    3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
    4.自然顺序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法
    在此方法中,指明按照自定义类的哪个属性进行排序
    5.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象此属性值相同。
    但是程序会认为这两个对象是相同的,进而后一个对象是不能添加进来的
    >compareTo()与hashCode()以及equals()三者保持一致
    
    public int compareTo(Object obj){
        if(o instanceof Person){
            Person p = (Person)o;
            int i = this.age.compareTo(p.age);
            if(i == 0){
                return this.name.compareTo(p.name);
            }else{
                return i;
            }
        }
        return 0;
    }
    1.要求添加TressSet中的元素所在的类implements Comparable接口
    2.重写compareTo(object obj),在此方法内指明按照元素的哪个属性进行排序
    3.向TreeSet中添加元素即可,若不实现此接口,会报运行时异常

     

                定制排序----------定制排序接口Comparator

    定制排序:>compare()与hashCode()以及equals()三者保持一致
    1.创建一个实现了Comarator接口的类对象
    Comparator com = new Comparator(){
        向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个属性排序的
        public int compare(Object o1,Object o2){
            if(o1 isntanceof Customer && o2 isntanceof 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
        }    
    };
    2.将此对象作为形参传递给TreeSet的构造器中
    TreeSet set = new TreeSet(com);
    3.向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象
    set.add(new Customer("AA",1003));
    set.add(new Customer("BB",1002));


    1.创建一个实现Comparator接口的实现类的对象,在实现类中重写Comparator的compare(Object o1,Object o2)方法
    2.在此compare()方法中指明按照元素所在类的哪个属性进行排序
    3.将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
    4.向TreeSet中添加元素即可。若不实现此接口,会报与运行时异常

     

     遍历集合

     

    遍历集合:
    1.使用迭代器iterator实现集合的遍历
    Iterator iterator = coll.iterator();
    whille(iterator.hasNext())
    sysout(iterator.next());//输出一个
    
    2.使用增强for循环实现集合的遍历
    for(Object i : coll){
        sysout(i);
    }

     

     

     

     Map

    Map接口
    1.Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
    2.Map中的key和value都可以时任何引用类型的数据
    3.Map中的key用Set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode()和equals()方法
    4.常用String类作为Map的"键"。
    5.key与value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value

     

     

    Map接口体系的继承树

     

      遍历Key-Value

     

    遍历key-value对
    方式一:
    Set set1 = map.keySet();
    for(Object obj : set1){
        sysout(obj + "--->" + map.get(obj));
    }
    方式二:
    Set set2 = map.entrySet();
    for(Object obj : set2){
        Map.Entry entry = (Map.Entry)obj;
        sysout(entry);/ sysout(entry.getKey() + "--->" + entry.getValue())
    }


    key是不可重复的,使用Set存放,value可以重复的,使用Collection来存放的,
    一个key-value对构成一个entry(Map.Entry),entry使用Set来存放

     

     

     

     

    Map分类

      HashMap:

     

    一.HashMap:key是用Set来存放的,不可重复。value是用Collection来存放的,可重复
    一个key-value对,是一个Entry。所有的Entry是用Set存放的,也是不可重复的。
    二.向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同,则只能添加进去后添加的那个元素
    1.Object put(Object key,Object value):向Map中添加一个元素,可以存null。
    2.int size():返回集合的长度
    3.Object remove(Object obj):按照指定的key删除此key-value
    4.void putAll(Map t):放入一个Map集合
    5.void clear():清空
    6.Object get(Object key):获取指定key的value值,若无此key 
    7.boolean containKey(Object key):是否有这个key
    8.boolean containsValue(Object value)是否有这个值
    9.boolean isEmpty()是否为空
    10.boolean equals(Object obj)是否跟另一个Map集合相同

    key 不重复 比较 :重写equals()和hashCode()方法
    value 可重复 比较:重写equals()方法

     

     

     

     

      LinkedHashMap

     

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

     

     

     

     

      TreeMap

     

    按照添加进Map中的元素的key的指定属性进行排序。要求:key必须是同一个类的对象

    自然排序vs自制排序

     

     

     

     

      Hashtable

     

    古老的实现类,线程安全,不建议使用
    
    Properties    常用来处理属性文件,键和值都是String类型的

     

     

     

     

    Collections工具类

     

    reverse(List)反转List中元素的顺序
    shuffle(List):对List集合元素进行随机排序
    sort(List):根据元素的自然顺序对指定List集合元素按升序排序
    sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
    swap(List,int ,int):将指定list集合中的i处元素进行交换
    
    Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
    Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素
    Object min(Collection)根据元素的自然顺序,返回给定集合中的最小元素
    Object min(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最小元素
    int frequency(Collection,Object):返回指定集合中指定元素的出现次数
    void copy(List dest,List src):将src中的内容复制到dest中
    boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List的旧值对象
    
    
    List list1 = Arrays.asList(new Object[list.size()]);
    Collections.copy(list1,list);
    sysout(list);
    
    通过如下的方法保证list线程的安全性
    List list2 = Collections.synchronizedList(list);

     

     - HashMap

        - 键不能重复,值不能重复,如果重复,会覆盖前面的。

        - 无序的。

        - 键值可以为null

        - 线程不安全

     - LinkedHashMap

        - 键不能重复,值可以重复,如果重复,会覆盖前面的。

        - 有序的

        - 键值可以为null

        - 线程不安全

     - HashTable

        - 键不能重复,值可以重复,如果重复,会覆盖前面的。

        - 无序的

        - 键值都不能为null

        - 线程安全

     - TreeMap

        - 键不能重复,值可以重复,如果重复,会覆盖前面的。

        - 键不允许为null,而且为同一数据类型,只允许为null。

        - 根据键的自然排序或者根据创建映射时,提供的Comparator进行排序

        - 线程不安全

     

  • 相关阅读:
    读完此文让你了解各个queue的原理
    借汇编之力窥探String背后的数据结构奥秘
    汇编高手带你玩转字符串,快上车!
    语雀调研
    产品技能一:抽象能力
    我所认知的敏捷开发
    产品经理需要的技能,我有吗?
    孙正义采访:接下来的30年,一切将被重新定义
    5G小白鼠
    goto语句为啥不受待见
  • 原文地址:https://www.cnblogs.com/yangHS/p/10699723.html
Copyright © 2011-2022 走看看