java集合实用!!!

3.java集合体系。

集合框架图:

在这里插入图片描述
可以看到集合框架包括两大容器:

  • 集合(Collection):存储一个元素
    • Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
  • Map():存储键/值对映射

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

集合接口

名称描述
Collection 接口Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。
Collection 接口存储一组不唯一,无序的对象。
List 接口List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。
List 接口存储一组不唯一,有序(插入顺序)的对象。
SetSet 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素.
Set 接口存储一组唯一,无序的对象。
SortedSet继承于Set保存有序的集合。
MapMap 接口存储一组键值对象,提供key(键)到value(值)的映射。
Map.Entry描述在一个Map中的一个元素(键/值对)。是一个 Map 的内部接口。
SortedMap继承于 Map,使 Key 保持在升序排列。
Enumeration这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。
Set和List的区别
  • Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
  • Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
  • List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
经常用到的集合详解:
  • list:继承至Collection接口
    • ArrayList:

      • 优缺点:
        优点: 底层数据结构是数组,查询快 !
        缺点: 线程不安全,增删慢。
      • 方法汇总:
        方法描述
        add()将元素插入到指定位置的 arraylist 中
        addAll()添加集合中的所有元素到 arraylist 中
        clear()删除 arraylist 中的所有元素
        clone()复制一份 arraylist
        contains()判断元素是否在 arraylist
        get()通过索引值获取 arraylist 中的元素
        indexOf()返回 arraylist 中元素的索引值
        removeAll()删除存在于指定集合中的 arraylist 里的所有元素
        remove()删除 arraylist 里的单个元素
        size()返回 arraylist 里元素数量
        isEmpty()判断 arraylist 是否为空
        subList()截取部分 arraylist 的元素
        set()替换 arraylist 中指定索引的元素
        sort()对 arraylist 元素进行排序
        toArray()将 arraylist 转换为数组
        toString()将 arraylist 转换为字符串
        ensureCapacity()将 arraylist 转换为字符串
        ensureCapacity()设置指定容量大小的 arraylist
        lastIndexOf()返回指定元素在 arraylist 中最后一次出现的位置
        retainAll()保留 arraylist 中在指定集合中也存在的那些元素
        containsAll()查看 arraylist 是否包含指定集合中的所有元素
        trimToSize()将 arraylist 中的容量调整为数组中的元素个数
        removeRange()删除 arraylist 中指定索引之间存在的元素
        replaceAll()将给定的操作内容替换掉数组中每一个元素
        removeIf()删除所有满足特定条件的 arraylist 元素
        forEach()遍历 arraylist 中每一个元素并执行特定操作
      • 语法:
          public class RunoobTest {
              public static void main(String[] args) {
                  ArrayList<String> sites = new ArrayList<String>();
                  
              //添加元素
                  sites.add("Google"); //添加元素到 ArrayList
                  sites.add("Runoob");//添加元素到 ArrayList
                  sites.add("Taobao");//添加元素到 ArrayList
                  sites.add("Weibo");//添加元素到 ArrayList
                  System.out.println(sites);
                  //输出结果为:Runoob
                  
              //获取一个元素
                  /*注意:这里的数组的索引值从 0 开始*/
                  System.out.println(sites.get(1));// 访问第二个元素
                  //输出结果为:[Google, Runoob, Wiki, Weibo]
                  
              //修改一个元素
          		  sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值
          		  System.out.println(sites);
          		  //输出结果为:[Google, Runoob, Wiki, Weibo]
          		  
              //删除一个元素
                  sites.remove(3); // 删除第四个元素
          		  System.out.println(sites);
          		  //输出结果为:[Google, Runoob, Taobao]
          		  
              //计算大小
          		  System.out.println(sites.size());
          		  //输出结果为:4
          		  
              //迭代数组列表
                  for (int i = 0; i < sites.size(); i++) {
           			   System.out.println(sites.get(i));
          	     }
          		  //输出结果为:Google Runoob Taobao Weibo
              }
          }
        
      • 实例:
            import java.util.*; 
            //循环遍历出ArrayList中的值
          	public class Test{
          	 public static void main(String[] args) {
               List<String> list=new ArrayList<String>();
               list.add("Hello");
               list.add("World");
               list.add("HAHAHAHA");
               //第一种遍历方法使用 For-Each 遍历 List
               for (String str : list) {            //也可以改写 for(int i=0;i<list.size();i++) 这种形式
                  System.out.println(str);
               }
           
               //第二种遍历,把链表变为数组相关的内容进行遍历
               String[] strArray=new String[list.size()];
               list.toArray(strArray);
               for(int i=0;i<strArray.length;i++) //这里也可以改写为  for(String str:strArray) 这种形式
               {
                  System.out.println(strArray[i]);
               }
               
              //第三种遍历 使用迭代器进行相关遍历
               
               Iterator<String> ite=list.iterator();
               while(ite.hasNext())//判断下一个元素之后有值
               {
                   System.out.println(ite.next());
          	     }
          	 }
          	}
        
    • LinkedList:

      • 简介:
        LinkedList 继承了 AbstractSequentialList 类。
        LinkedList 实现了 Queue 接口,可作为队列使用。
        LinkedList 实现了 List 接口,可进行列表的相关操作。
        LinkedList 实现了 Deque 接口,可作为队列使用。
        LinkedList 实现了 Cloneable 接口,可实现克隆。
      • LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输
        •  // 引入 LinkedList 类
           import java.util.LinkedList; 	
           LinkedList<E> list = new LinkedList<E>();   // 普通创建方法
           或者
           LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
          
        • 优缺点:
          优点: 底层数据结构是链表,查询慢,增删快。
          缺点: 线程不安全,效率高
        • 实例:
            	public class RunoobTest {
            	    public static void main(String[] args) {
            	        LinkedList<String> sites = new LinkedList<String>();
            	        sites.add("Google");
            	        sites.add("Runoob");
            	        sites.add("Taobao");
            	        sites.add("Weibo");
            	        System.out.println(sites);
                }
            }
            //输出结果:[Google, Runoob, Taobao, Weibo]
          
        • 常用方法
          方法方法描述
          public boolean add(E e)链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
          public void add(int index, E element)向指定位置插入元素。
          public boolean addAll(Collection c)将一个集合的所有元素添加到链表后面,返回是否成功,成功为 true,失败为 false。
          public void clear()清空链表。
          public E remove(int index)删除指定位置的元素。

          更多方法详见https://www.runoob.com/java/java-linkedlist.html

    • vector

      • 说明:
        该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。
      • 优缺点
        优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程安全,效率低
      • stack(栈)
        栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
  • set:继承至Collection接口
    • hashSet
      • HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。
      • 基本类型对应的包装类表如下:
        基本类型引用类型
        booleanBoolean
        byteByte
        shortShort
        intInteger
        longLong
        floatFloat
        doubleDouble
        charCharacter
      • 语法:
        import java.util.HashSet; // 引入 HashSet 类
        
      • 实例
        		// 引入 HashSet 类      
         	import java.util.HashSet;
        
         	public class RunoobTest {
         	    public static void main(String[] args) {
         		    HashSet<String> sites = new HashSet<String>();
         		    
         		    //添加元素
         		        sites.add("Google");
         		        sites.add("Runoob");
         		        sites.add("Taobao");
         		        sites.add("Zhihu");
         		        sites.add("Runoob");  // 重复的元素不会被添加
         		        System.out.println(sites);
         		        //输出结果:[Google, Runoob, Zhihu, Taobao]
         		        
         		    //判断元素是否存在
         		        System.out.println(sites.contains("Taobao"));
         		        //输出结果: true
         		        
         		    //删除集合中的元素
         		    	sites.remove("Taobao");  // 删除某个元素,删除成功返回 true,否则为 false
         				System.out.println(sites);
         				//输出结果:[Google, Runoob, Zhihu]
         				
         				sites.clear();  // 清空集合
         				System.out.println(sites);
         				输出结果: []
         				
         		    //计算大小
         				System.out.println(sites.size());
         				//输出结果:4
         				
         		    //迭代HashSet
         				for (String i : sites) {
           	 				System.out.println(i);
         				}
         				//输出结果:Google Runoob Zhihu Taobao
         	    }
         	}
        
      • linkedHashSet
        • 底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
          1.由链表保证元素有序
          2.由哈希表保证元素唯一
    • TreeSet
      • 底层数据结构是红黑树。(唯一,有序)
        1. 如何保证元素排序的呢?
          自然排序
          比较器排序
        2. 如何保证元素唯一性的呢?
          根据比较的返回值是否是0来决定
  • map:独立接口
    三个重要的实现类:
    • HashMap
    • TreeMap
    • HashTable
    • 对比图:
      HashMapHashTableTreeMap
      顺序无序无序有序
      方法是否同步不同步同步-
      线程是否安全不安全安全-
      效率较高较低-
      null值允许null值(key和value都允许)不允许有null值-
      父类AbstractMapDictionary-

部分内容借鉴自:https://blog.csdn.net/zhangqunshuai/article/details/80660974

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值