【集合框架总结】

简介

集合框架:用于存储数据的容器。

集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。
任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

接口:表示集合的抽象数据类型。接口允许我们操作集合时不必关注具体实现,从而达到“多态”。在面向对象编程语言中,接口通常用来形成规范。

实现:集合接口的具体实现,是重用性很高的数据结构。

算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个接口被多个类实现时有不同的表现。事实上,算法是可复用的函数。
它减少了程序设计的辛劳。

集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部分上,而不是为了让程序能正常运转而将注意力于低层设计上。
通过这些在无关API之间的简易的互用性,使你免除了为改编对象或转换代码以便联合这些API而去写大量的代码。 它提高了程序速度和质量。

特点

  • 对象封装数据,对象多了也需要存储。集合用于存储对象。
  • 对象的个数确定可以使用数组,对象的个数不确定的可以用集合。因为集合是可变长度的。

集合和数组的区别

  • 数组是固定长度的;集合可变长度的。
  • 数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
  • 数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
    数据结构:就是容器中存储数据的方式。
    对于集合容器,有很多种。因为每一个容器的自身特点不同,其实原理在于每个容器的内部数据结构不同。
    集合容器在不断向上抽取过程中,出现了集合体系。

Collection接口

所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,CollectionMap是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

  • Collection一次存一个元素,是单列集合;
  • Map一次存一对元素,是双列集合。Map存储的一对元素:键–值,键(key)与值(value)间有对应(映射)关系

Collection关系继承图:
在这里插入图片描述
Collection集合主要有List和Set两大接口

  • List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
  • Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。

List集合

List是元素有序并且可以重复的集合。

List的主要实现:ArrayList, LinkedList, Vector。

遍历List集合的方式:

package com.zking.demo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class demo01 {
	public static void main(String[] args) {
		List list = new ArrayList();
		demo01 d1 = new demo01();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add(154);
		list.add(2.4);
		list.add(false);
		list.add(true);
		list.add(d1);
//		遍历方式一
		for (Object o : list) {
			System.out.println(o);
		}
//		遍历方式二
		for(int i=0;i<list.size();i++) {
			System.out.println(list.get(i));
		}
//		迭代器
		Iterator it = list.iterator();
		while(it.hasNext()) {
			Object next = it.next();//取值
			System.out.println(next);
		}
		
	}
}

List常用方法:
在这里插入图片描述

ArrayList、LinkedList、Vector 的区别:

ArrayListLinkedListVector
底层实现数组双向链表数组
同步性及效率不同步,非线程安全,效率高,支持随机访问不同步,非线程安全,效率高同步,线程安全,效率低
特点查询快,增删慢查询慢,增删快查询快,增删慢
默认容量10/10
扩容机制int newCapacity = oldCapacity + (oldCapacity >> 1);//1.5 倍/2倍

总结:
ArrayList 和 Vector 基于数组实现,对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

Set集合

Set集合元素无序(存入和取出的顺序不一定一致),并且没有重复对象。
Set的主要实现类:HashSet, TreeSet。

HashSet、TreeSet、LinkedHashSet的区别

HashSetTreeSetLinkedHashSet
底层实现时间复杂度红黑树LinkedHashMap
重复性不允许重复不允许重复不允许重复
有无序无序有序,支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。有序,以元素插入的顺序来维护集合的链接表
时间复杂度add(),remove(),contains()方法的时间复杂度是O(1)add(),remove(),contains()方法的时间复杂度是O(logn)LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet,时间复杂度是 O(1)。
同步性不同步,线程不安全不同步,线程不安全不同步,线程不安全
null值不同步,线程不安全不支持null值,会抛出 java.lang.NullPointerException 异常。因为TreeSet应用 compareTo() 方法于各个元素来比较他们,当比较null值时会抛出 NullPointerException异常。不同步,线程不安全
比较equals()compareTo()equals()

总结:
HashSet是一个通用功能的Set,而LinkedHashSet 提供元素插入顺序保证,TreeSet是一个SortedSet实现,由Comparator 或者 Comparable指定的元素顺序存储元素。

Map接口

Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap

HashMap、HashTable、TreeMap的区别

  • TreeMap:基于红黑树实现。
  • HashMap:基于哈希表实现。
  • HashTable:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。
  • LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
HashMapHashTableTreeMap
底层实现哈希表(数组+链表)哈希表(数组+链表)红黑树
同步性线程不同步同步线程不同步
null值允许 key 和 Vale 是 null,但是只允许一个 key 为 null,且这个元素存放在哈希表 0 角标位置不允许key、value 是 nullvalue允许为null。 当未实现 Comparator 接口时,key 不可以为null 当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException 异常。如果针对null情况实现了,可以存入,但是却不能正常使用get()访问,只能通过遍历去访问。
hash使用hash(Object key)扰动函数对 key 的 hashCode 进行扰动后作为 hash 值直接使用 key 的 hashCode() 返回值作为 hash 值
容量容量为 2^4 且容量一定是 2^n默认容量是11,不一定是 2^n
扩容两倍,且哈希桶的下标使用 &运算代替了取模2倍+1,取哈希桶下标是直接用模运算

集合工具类Collections

Collections:集合工具类,方便对集合的操作。这个类不需要创建对象,内部提供的都是静态方法。

Collection 和 Collections的区别

  Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。

  Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。

数组工具类 Arrays

用于操作数组对象的工具类,里面都是静态方法。

asList方法,将数组转换成list集合。

public static void main(String[] args) {
    String[] arr = {"abc", "kk", "qq"};
	// 使用new ArrayList包裹一层
    List<String> list = new ArrayList<>(Arrays.asList(arr));
    list.add("bb");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值