Java 集合详解

目录

一、概述

二、集合是什么?

三、Collection/集合

 四、ArrayList/数组列表

五、Iterator/迭代器

六、Set/无序集合/集 

七、HashSet/散列集

八、LinkedHashSet

九、TreeSet/树集

十、List/列表 

十一、 Map                


一、概述

所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量)。当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。

Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。

二、集合是什么?

  Java集合类存放于 java.util 包中,是一个用来存放对象的容器。

注意:

  1. 集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
  2. 集合存放的是多个对象的引用,对象本身还是放在堆内存中。
  3. 集合可以存放不同类型,不限数量的数据类型。

三、Collection<E>/集合

Collection与Collections

  • Collection是所有集合类的根接口;
  • Collections是提供集合操作的工具类;

集合类和数组不同,

  • 数组元素可以为基本数据类型值/对象引用;
  • 集合元素只能为对象引用;

Java的集合类由Collection接口和Map接口派生,

  • Set代表无序集合,无序不可重复;
  • List代表有序集合,有序可重复;
  • Map集合存储键值对

 ArrayList<E>/数组列表

ArrayList底层有数组支持,通常作为默认首选;当程序频繁进行插入/删除操作时,选用LinkedLIst;如果元素数量固定,可选择真正数组/List/备选;

 //我们这里将 ArrayList集合作为 Collection 的实现类
 2         Collection collection = new ArrayList();
 3         
 4         //添加元素
 5         collection.add("Tom");
 6         collection.add("Bob");
 7         
 8         //删除指定元素
 9         collection.remove("Tom");
10         
11         //删除所有元素
12         Collection c = new ArrayList();
13         c.add("Bob");
14         collection.removeAll(c);
15         
16         //检测是否存在某个元素
17         collection.contains("Tom");
18         
19         //判断是否为空
20         collection.isEmpty();
21         
22         //利用增强for循环遍历集合
23         for(Object obj : collection){
24             System.out.println(obj);
25         }
26         //利用迭代器 Iterator
27         Iterator iterator = collection.iterator();
28         while(iterator.hasNext()){
29             Object obj = iterator.next();
30             System.out.println(obj);
31         }

Iterator<E>/迭代器

Collection 接口的 iterator() 方法返回一个 Iterator。 

public interface Iterable<E> {  // Iterable泛型接口
   Iterator<E> iterator();      // 由继承接口的集合类负责实现,返回一个迭代器
}
  1. 使用方法 iterator() 要求容器返回一个Iterator .第一次调用Iterator 的next() 方法时,它返回集合序列的第一个元素。
  2. 使用next() 获得集合序列的中的下一个元素。
  3. 使用hasNext()检查序列中是否元素。
  4. 使用remove()将迭代器新返回的元素删除

Set<E>/无序集合/集 

Set集合中对象不可重复,因此当试图添加两个相同元素时,add()方法返回false/元素不可加入;

Set集合中对象必须重写hashCode()方法和equals()方法;

 Set最大的特性就是不允许在其中存放的元素是重复的

 

Set set1 = new  HashSet();
        if(set1.add("a"))
        {
            System.out.println("OK");
        }
        if (set1.add("a")) {
            System.out.println("OK2");
        }
        else
        {
            System.out.println("BAD2");
        }
        set1.add("000");
        set1.add("111");
        set1.add("222");
        System.out.println("集合set1的内容:"+set1);
        System.out.println("集合set1的大小:"+set1.size());
        set1.remove("000");
        System.out.println("集合set1的内容:"+set1);
        System.out.println("集合set1中是否包含000 :"+set1.contains("000"));
        System.out.println("集合set1中是否包含111 :"+set1.contains("111"));
        Set set2=new HashSet();
        set2.add("111");
        set2.addAll(set1);//将set1 集合中的元素全部都加到set2中
        System.out.println("集合set2的内容:"+set2);
        Iterator iterator = set1.iterator();//得到一个迭代器
        while (iterator.hasNext()) {//遍历
            String element =(String) iterator.next();
            System.out.println("iterator = " + element);
        }
        //将集合set1转化为数组
        Object s[]= set1.toArray();
        for(int i=0;i<s.length;i++){
            System.out.println(s[i]);
        }

HashSet<E>/散列集

  • 添加元素时,调用hashCode()方法计算对象的hashCode值;
  • 根据hashCode值决定对象的存储位置—>元素存储顺序和添加顺序可能不一致(LinkedHashSet可保证);
  • HashSet判断元素相等的标准:equal()方法相等/hashCode()方法返回值相同;
  • Hash算法/哈希/散列:通过计算元素的hashCode值获取元素的存储位置—>价值在于存取/查找速度快
  • 与数组相比,HashSet索引不需要连续,可自由增加HashSet长度;

Set set1 = new HashSet();
        Set set2 = new LinkedHashSet();
        for(int i =0 ; i<5 ;i++)
        {
            int s = (int)(Math.random()*100);
            set1.add(new Integer(s));
            set2.add(new Integer(s));
            System.out.println("第 "+i+" 次随机数产生为:"+s);
        }
         System.out.println("未排序前HashSet:"+set1);
         System.out.println("未排序前LinkedHashSet:"+set2);
         //使用TreeSet来对另外的Set进行重构和排序
         Set sortedSet = new TreeSet(set1);
         System.out.println("排序后 TreeSet :"+sortedSet);

LinkedHashSet<E>

HashSet的子类,LinkedHashSet也是根据元素的hashCode值决定其存储位置;

同时使用链表维护元素的添加次序—>性能略低于HashSet的性能;

TreeSet<E>/树集

TreeSet实现SortSet接口,

TreeSet采用红黑树(red-black tree)存储集合元素,排序规则支持自然排序/定制排序;

TreeSet存储对象必须实现Comparable接口

List<E>/列表 

Java中所有链表底层都是双向链接(doubly linked);

List额外提供listIterator()方法,该方法返回一个ListIterator对象,用于遍历List;

ListIterator的set(obj)方法用新元素obj覆盖next()/previous()返回的上一个元素,可以双向移动;

方法:

  • void add(int index, Object element) :添加对象element到位置index上
  • boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素
  • Object get(int index) :取出下标为index的位置的元素
  • int indexOf(Object element) :查找对象element 在List中第一次出现的位置
  • int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置
  • Object remove(int index) :删除index位置上的元素
  • Object set(int index, Object element) :将index位置上的对象替换为element 并返回老的元素。

 Map                

数学中的映射关系在Java中就是通过Map来实现的。它表示,里面存储的元素是一个对(pair),我们通过一个对象,可以在这个映射关系中找到另外一个和这个对象相关的东西。 

  • KeySet()遍历实质:遍历两次,第一次转为Iterator对象,第二次从Map中去除key对应的value;
  • entrySet()遍历实质:只遍历一次就把K,V放入entry中,效率较KeySet()更高;

 

HashMap<String, String> hm = new HashMap<String, String>();
        //试图将2个key为null的key-value对放入HashMap中
        hm.put(null , null);
        hm.put(null , null);
        //将一个value为null的key-value对放入HashMap中
        hm.put("a" , null);
        hm.put("a" , "b");
        //输出Map对象
        System.out.println(hm);

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小寻己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值