java集合框架

时间:2024-01-23 08:33:40

集合框架

用来表示和操作集合的统一架构
包含三个方面:
1、接口:定义了集合操作的规范
2、实现类:集合接口的具体实现,本质上,是可重复使用的数据结构
3、算法: 实现集合操作的常用算法

接口 Collection Map
List Set
实现类 ArrayList,   Vector HashSet HashMap, HashTable
LInkedArrayList LinkedHashSet LinkedHashMap
  TreeSet TreeMap

 

 

 

 

 

 

 

 

[四个接口区别]
1、collection: 存储不唯一、无序的数据 
2、list: 存储不唯一、有序的数据
3、set: 存储唯一、无序的数据
4、Map: 以键值的形式存储数据,以键取值,键不能重复,值可以重复 

[list接口]

1、常用方法:
  ① add();在列表最后添加元素
  ② add(index,obj);在列表指定位置添加元素
  ③ size();返回列表元素个数
  ④ get(int index);返回下标为index的元素。
                   如果没有泛型约束,返回object类型,需要强转;
                   如果有泛型约束,直接返回返回类型,无需强转。
  ⑤ clear();清除列表中所有数据
     isEmpty();检测列表是否为空
  ⑥ contains();传入一个对象,检测列表中是否包含该对象
               如果传入的是String 和基本数据类型,可以直接比对
               如果传入的是实体对象,则默认值比对两个对象的地址,因此需要在实体类中重写equals()方法
  ⑦ indexOf()传入一个对象,返回该对象在列表中是第一次出现的位置,如果没有则返回-1
     lastIndexOf();返回最后一次出现的位置
  ⑧ remove();传入一个下标,或者一个对象,删除指定元素;
              如果传入下标,返回被删除的元素对象,如果下标大于size(),会报下标越界
              如果传入对象,则要求重写equals()方法,返回true或false表示是否删除成功
  ⑨ set(index,obj):用新传入的对象,将指定位置的元素替换掉,返回被替换的元素
  ⑩ list.subList(1,3);截取一个子列表,返回List类型
     toArray();将列表转为数组,返回一个Object[]类型的数组

2、常用实现类
  ① ArrayList
      实现了一个长度可变的数组,在内存空间中开辟一串连续的空间。
      这种存储结构,在循环遍历和随机访问元素的速度比较快
  ② LinkedList
      使用链表结构存储数据,在(中间)插入和删除元素时比较快
  LinkedList特有的方法:
   ① addFirst():在该列表开头插入指定的元素。
       addLast():在该列表最后插入指定的元素。
   ② removeFirst();从此列表中删除并返回第一个元素。
       removeLast();从此列表中删除并返回最后一个元素。
   ③ getFirst();返回第一个元素。
       getLast();返回最后一个元素。

[Set接口] 

1、常用方法:与List接口基本相同 但是,由于Set接口中的元素是无序的,因此没有与下标相关的方法
   例如:get(index) remove(index) add(index,obj)
2、Set接口特点:无序、唯一
3、HashSet 底层是调用HashMap的相关方法,传入数据后,根据数据的hashcode进行散列运算,得到一个散列值后再进行运算,确定元素在序列中存储的位置
  HashSet如何确定两个对象是否相等
  ① 先判断对象的HashCode(),如果hashcode不同,那肯定不相同
    如果hashcode相等,那继续判断equals()方法
  ②重写equals()方法
  >>>所以,使用HashSet存储实体对象时,必须重写HashCode()和equals()两个方法
4、LinkHashSet:在HashSet的基础上,新增了一个链表。
   用链表来记录HashSet存放的元素顺序,因此使用迭代器遍历时,可以按照放入的顺序依次读取元素
5、TreeSet:将存入的元素,进行排序,然后再输出
   如果存入的是实体对象,那么实体类必须实现Comparable接口,重写CompareTo()方法
   或者,也可以在实例化TreeSet的同时,通过构造函数传入一个比较器
   比较器:一个实现了Comparator接口,并重写了compare()方法的实现类的对象。

  

//使用匿名内部类,拿到一个比较器对象

   Set<Person> set=new TreeSet<Person>(new Comparator(){

   public int compare(Person p1,Person p2){

        return p1.getId()-p2.getId();

          }

     }

  );

   //自定义一个比较类,实现Comparator接口 

  <Person> set=new TreeSet<Person>(new Compare());

   class Compare implements Comparator{

      // 重写compare方法。

   public int compare(Person p1,Person p2){

      return p1.getId()-p2.getId();

    }
}

 

[Comparable接口 和 Comparator接口的区别]

 1、Comparable由实体类实现,重写compareTo()方法;

   实体类实现Comparable接口以后,TreeSet使用空参构造即可。

 2、Comparator需要单独一个比较类进行实现,重写Compare()方法。

   实例化TreeSet的时候,需要传入这个比较类的对象。

[Map接口]

1、特点:以键值对的形式存储数据,以键取值。 键不能重复,只可以重复
2、Map常用的方法
  ① put(key,value):向map的在最后追加一个键值对; 
  ② get(key); 通过建,取值
  ③ clear(); 清除所有键值对;
  ④ containsValue(obj);检测是否包含指定的值
     containsKey(obj);检测是否包含指定的键  
3、LinkedHashMap
   可以使用链表,记录数据放入的顺序,使让读出的数据次序与存入的次序一致,与LinkedHashSet一样
4、TreeMap
   根据键的顺序,进行排序后,输出。如果传入的是实体对象,必须重写比较函数,详见TreeSet

[HashMap与HashTable的区别]
1、HashTable是线程安全(线程同步)的,HashMap是线程不安全(线程不同步)的
2、HashTable的键不能为null,HashMap的键可以为null
3、HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口。
4、HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
5、HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
6、两者计算hash的方法不同: 
   Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模:
   HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸:
7、判断是否含有某个键 
  在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对 应的值为null。当get()方法返回null 值时,
既可以表示HashMap 中没有该键,也可以表示该键所对应的值为null。因此,在HashMap 中不能用get()方法来判断HashMap中是否存在某个键,、
而应该用containsKey()方法来判断。Hashtable 的键值都不能
为null,所以可以用get()方法来判断是否含有某个键。
/**
         * 遍历Map方式一
         */
        Set<String> keys = map1.keySet();
        Iterator<String> iter1 = keys.iterator();
        while (iter1.hasNext()) {
            String key = iter1.next();
            System.out.println(key + "------" + map1.get(key));
        }

        /**
         * 遍历Map方式二
         */
        Collection<String> values = map1.values();
        Iterator<String> iter2 = values.iterator();
        while (iter2.hasNext()) {
            System.out.println(iter2.next());
        }

        /**
         * 遍历Map方式三
         */
        Set<Entry<String, String>> set3 = map1.entrySet();
        /*Iterator<Entry<String,String>> iter3 = set3.iterator();
        while (iter3.hasNext()) {
            Entry<String,String> entry=iter3.next();
            Entry是java给我们提供的一种特殊的数据类型,其实就是一个键值对
             * 键就是当前这条记录的键,使用getKey()取到;
             * 值就是当前这条记录的值,使用getValue()取到
            
//            System.out.println(entry);
            System.out.println(entry.getKey()+"---"+entry.getValue());
        }*/
        for(Entry<String,String>entry:set3){
            System.out.println(entry.getKey()+"-----"+entry.getValue());
        }

[Collections类]

Collections是Java中专门用来操作集合的工具类
Collection是一个接口
[方法]
1、addAll()方法:向集合中添加多个数据
  Collections.addAll(list, "Test1","Test2","Test3");

2、sort()方法:对集合中的数据进行排序 如果集合中的数据是实体对象那么 
  ① 实体类实现Comparable接口,重写compareTo方法
  ②在sort的第二个参数传入一个实现了Comparator接口的比较器对象,重写compare方法

    Collections.sort(list1, new Comparator<Person1>() {
     @Override
      public int compare(Person1 o1, Person1 o2) {
      return o1.getId() - o2.getId();
      }
    });

3、binarySearch():查找元素,返回下标
  使用binarySearch()要先排序 如果集合中的数据是实体对象那么 
  ①实体类实现Comparable接口,重写compareTo方法 (推荐使用)
  ②在sort的第二个参数和binarySearch的第三个参数传入一个实现了Comparator接口的比较器对象,重写compare方法
  System.out.println(Collections.binarySearch(list, "list2"));

4、找出最大、最小元素,如果实体对象,同上需要实现比较器接口
  Collections.max(list);
  System.out.println(Collections.min(list1));

5、repalceAll(): 将列表的指定值,替换新值. 如果是对象,重写equals方法

     Collections.replaceAll(list1, new Person1(1, "张三", 12),
     new Person1(1, "111张三", 12));

6、翻转列表中的所有元素
  Collections.reverse(list1);

7、对集合的元素,随机排序
  Collections.shuffle(list1);
8、 将集合中的元素位置,进行交换 Collections.swap(list1, 0, 1); 9、将集合中的所有元素替换为同一个元素 Collections.fill(list, "姜皓真帅");