Java集合类概述
定义:集合类存放的都是对象的引用,而非对象本身,称集合中的对象就是指集合中对象的引用(reference)。 通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
Set(集):
Set集合中,不能包含重复元素
List(列表):
List是一个有序的,且存放元素是可以重复的一个集合
Map(映射):
对象容器中的元素包含一对"键对象-值对象"映射,其中键对象不能重复,值对象可以重复
Java集合框架中提供的几个接口
接口SortedSet为Set类型容器提供排序功能
接口SortedMap是为Map类型容器提供对键对象的排序
接口Iterator提供了对集合对象进行遍历访问的遍历器
接口Comparable和Comparator用来实现集合中对象的排序
Collection接口和Iterator接口
Collection接口的方法
定义:Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。是Set接口和List接口的父接口
Collection 接口存储一组不是唯一的,无序的对象。
int size();返回当前集合中包含的元素个数
boolean add(Object o);向集合中添加到某一元素
boolean remove(Object o);从集合中删除某一元素
boolean contains(Object o);判断集合中是否包含某一指定元素
Iterator接口的方法
定义:Iterator接口是一种用于遍历集合的接口。所谓遍历,是指从集合中取出每一个元素的过程。在Collection接口中,有一个iterator()方法,通过该方法可以返回一个Iterator对象。通过这个对象,可以遍历集合中所有元素
hasNext() 如果集合中还有更多元素,该方法返回true
next() 返回集合中的下一个元素
remove() 删除iterator返回的最后一个元素
List接口中的方法
void add(int index, Object o) 在列表指定的位置插入对象
boolean addAll(int index, Collection c) 将另一个集合中的所有对象插入到列表指定位置
Object get(int index) 返回列表中指定位置的对象
Object set(int index, Object o) 用指定对象替换列表中指定位置的对象
Object remove(int index) 删除列表指定位置的对象
LinkedList是实现了双向链表功能的列表,它将列表中的每个对象放在独立的空间中,而且每个空间中还保存有上一个和下一个链接的索引
Set接口
Set接口也继承自Collection接口,同时也继承了Collection接口的全部方法,
元素可能有顺序,也可能没有顺序,因为元素可能没有顺序,所以不能基于索引访问Set中的元素
Set集合中,不能包含重复元素
HashSet
HashSet类是基于哈希算法的Set接口实现
特点:
当遍历HashSet时,其中的元素是没有顺序的
HashSet中不允许出现重复元素
允许包含null元素
Map接口
Map(映射)接口是Java集合框架中不同于Collection接口的另一个重要接口,它对应的是在一种从键(Key)到值(Value)的对应关系的集合。也就是说,Map类型的对象容器里面保存着两组对象,一组对象用于保存Map里的Key,另外一组用于保存Value。Key和Value可以是任何引用类型的数据。Key不能重复,但是Value可以重复
Map 接口存储一组键值对象,提供key(键)到value(值)的映射。
TreeMap
继承了AbstractMap,并且使用一颗树
reeSet集合中,只能存放相同类型的数据
集合中的元素,必须要实现Comparable接口,并重写compareTo() //TreeSet底层是TreeMap,但是TreeMap是采用二叉树的结构来存储数据 //在二叉树中,比较元素时,比树中元素小的,永远在下一代的左边 //当然,比树中元素大的,永远在下一代的右边,相等的,就直接覆盖
//二叉树结构,见 https://blog.csdn.net/github_26672553/article/details/77185003
Hashtable 、HashMap
HashMap底层是数组+单向链表的结构,数组用于存放键的hash值,而链表用于存储k-v结构
//数组构成了HashMap中的Hash表,表的大小默认是16,可以存放的数据是16加载因子0.75 //当超过160.75个数据时,Hash表将自动扩容,扩容的后的大小是16*2^nHashMap中,如果是我们的自己定义的类的对象,做为键的时候,必须要重写hashcode()和equals() //当然上层的HashSet,也同理
Hashtable 和 HashMap 的区别
1、Hashtable是线程安全的,HashMap是线程非安全
2、HashMap中允许存放空键(只能出现1次),空值,但是Hashtable中不允许出现空键,空值
比键
Set keys = map.keySet();//返回键的集合
Object key = iterator.next();//得到键了
工具类Collections和Arrays
没有s的分别代表集合和数组,而加个s后代表工具类
Collections类
Java集合框架中提供了一个操作Set、List和Map等集合的工具类Collections,该工具类中提供了大量方法,用于对集合元素进行排序、查询、修改等操作
Collections类中提供了多个静态方法用于创建线程安全的同步集合:
synchronizedCollection(Collection c):返回一个线程安全的collection
synchronizedList(List list):返回一个线程安全的list
synchronizedSet(Set s):返回一个线程安全的set
synchronizedMap(Map m):返回一个线程安全的map
Arrays类
Java集合框架不仅提供了Collections类用于操作集合,同时也提供了Arrays类用于操作数组。Arrays类包含用来操作数组(比如排序和搜索)的各种方法
ArrayList底层是基于数组结构的集合,使用数组的复制,来完成集合的扩容或缩容
但是:ArrayList底层是基于数组结构来实现的,查询数据较快,操作数据较慢 LinkedList,底层是基于链表结构来实现的,操作数据上较快,查询数据较慢
,Vector 同ArrayList一样,也是基于数组结构来实现的,但是区别在于它线程安全