【集合】1、Collection

集合:集合是java中提供的⼀种容器,可以⽤来存储多个数据。
1.集合和数组的区别
数组的⻓度是固定的。集合的⻓度是可变的。
数组中存储的是同⼀类型的元素,可以存储基本数据类型值。集合存储的都是对象。⽽且对
象的类型可以不⼀致。在开发中⼀般当对象多的时候,使⽤集合进⾏存储

集合分为单列集合(java.util.Collection) 
和双列集合 (java.util.Map)

2.Collection
Collection:单列集合类的根接⼝,⽤于存储⼀系列符合某种规则的元素,它有两个重要的
⼦接⼝,分别是  List 和 Set 。

其中,List 的特点是元素有序、元素可重复。

Set 的特点是元素⽆序,⽽且不可重复。 

List 接⼝的主要实现类有ArrayList 和 LinkedList , 

Set 接⼝的主要实现类有 HashSet 和 TreeSet 。

集合本身是⼀个⼯具,它存放在 java.util 包中。在 Collection 接⼝定义着单列集合框架中最
最共性的内容。

Collection 常⽤功能:
public boolean add(E e) : 把给定的对象添加到当前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e) :把给定的对象在当前集合中删除。
public boolean contains(E e) :判断当前集合中是否包含给定的对象。
public boolean isEmpty() :判断当前集合是否为空。
public int size() :返回集合中元素的个数。
public Object[] toArray() :把集合中的元素,存储到数组中。

3.Iterator迭代器
Iterator 接⼝用于遍历集合中的所有元素,它与 Collection 、 Map 接⼝
有所不同, Collection 接⼝与 Map 接⼝主要⽤于存储元素,⽽ Iterator 主要⽤于迭代访问(即
遍历) Collection 中的元素,因此 Iterator 对象也被称为迭代器。

迭代的概念::
即Collection集合元素的通⽤获取⽅式。在取元素之前先要判断集合中有没有元素,
如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。⼀直把集合中的所有
元素全部取出。这种取出⽅式专业术语称为迭代。

Iterator接⼝的常⽤⽅法如下:
public E next() :返回迭代的下⼀个元素。
public boolean hasNext() :如果仍有元素可以迭代,则返回 true。

增强for循环(也称for each循环):
是JDK1.5以后出来的⼀个⾼级for循环,专⻔⽤来遍历数组
和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素
进⾏增删操作。
格式:
for (元素的数据类型 变量 : Collection集合or数组) {
 //写操作代码
}

4.泛型
泛型:本质是参数化类型,可以在类或⽅法中预知地使⽤未知的类型
⼀般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为
Object类型。
集合中是可以存放任意对象的,只要把对象存储集合后,那么这
时他们都会被提升成Object类型。当我们在取出每⼀个对象,并且进⾏相应的操作,这时必须采
⽤类型转换。由于集合中什么类型的元素都可以存储。导致取出时强转引发运⾏时
ClassCastException 。
Collection虽然可以存储各种对象,但实际上通常Collection只存储同⼀类型对象。例如都是存储
字符串对象。因此在JDK5之后,新增了泛型(Generic)语法,使在设计API时可以指定类或⽅法
⽀持泛型,这样使⽤API的时候也变得更为简洁,并得到了编译时期的语法检查。

例:
在创建对象的时候确定泛型
ArrayList<String> list = new ArrayList<String>();
此时,变量E的值就是String类型,那么我们的类型就可以理解为:
class ArrayList<String> {
 public boolean add(String e){ }
 public String get(int index){ }
 ...
}

 泛型通配符
泛型的通配符:不知道使⽤什么类型来接收的时候,此时可以使⽤?表示未知通配符。
当使⽤泛型类或者接⼝时,传递的数据中,泛型类型不确定,可以通过通配符 <?> 表示。但是⼀
旦使⽤泛型的通配符后,只能使⽤Object类中的共性⽅法,集合中元素⾃身⽅法⽆法使⽤。

5.List集合
在List集合中允许出现重复的元素,所有的元素是以⼀种线性
⽅式进⾏存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有⼀个特
点就是元素有序,即元素的存⼊顺序和取出顺序⼀致。
特点:
1. 它是⼀个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的
存储就是按照11、22、33的顺序完成的)。
2. 它是⼀个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是⼀个
道理)。
3. 集合中可以有重复的元素,通过元素的equals⽅法,来⽐较是否为重复的元素。

List接⼝中常⽤⽅法:
List作为Collection集合的⼦接⼝,不但继承了Collection接⼝中的全部⽅法,⽽且还增加了⼀些
根据元素索引来操作集合的特有⽅法,如下:
public void add(int index, E element) :将指定的元素,添加到该集合中的指定位置
上。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) :移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element) :⽤指定元素替换集合中指定位置的元素,返回值的
更新前的元素。

5.1.ArrayList集合
ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于⽇常开发中
使⽤最多的功能为查询数据、遍历数据,所以 ArrayList 是最常⽤的集合。

5.2.Vector类
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:
1.Vector 是同步访问的。
2.Vector 包含了许多传统的方法,这些方法不属于集合框架。
Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。

5.2.1.Stack类
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
堆栈只定义了默认构造函数,用来创建一个空栈。 
堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。

boolean empty() :测试堆栈是否为空。
Object peek( ):查看堆栈顶部的对象,但不从堆栈中移除它。
Object pop( ):移除堆栈顶部的对象,并作为此函数的值返回该对象。
Object push(Object element):把项压入堆栈顶部。
int search(Object element):返回对象在堆栈中的位置,以 1 为基数。

5.3.LinkedList集合
LinkedList 集合数据存储的结构是链表结构。⽅便元素添加、删除的集合。
实际开发中对⼀个集合元素的添加与删除经常涉及到⾸尾操作,⽽LinkedList提供了⼤量⾸尾操
作的⽅法:
public void addFirst(E e) :将指定元素插⼊此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public E getFirst() :返回此列表的第⼀个元素。
public E getLast() :返回此列表的最后⼀个元素。
public E removeFirst() :移除并返回此列表的第⼀个元素。
public E removeLast() :移除并返回此列表的最后⼀个元素。
public E pop() :从此列表所表示的堆栈处弹出⼀个元素。
public void push(E e) :将元素推⼊此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true。
此外LinkedList是List的⼦类,List中的⽅法LinkedList都是可以使⽤。
在开发时,LinkedList集合也可以作为堆栈,队列的结构使⽤。

6.Set接⼝
它与 Collection 接⼝中的⽅法基本⼀致,并没有对 Collection 接⼝进⾏功能上的扩充,只是⽐
Collection 接⼝更加严格了。与 List 接⼝不同的是, Set 接⼝中元素⽆序,并且都会以某种规
则保证存⼊的元素不出现重复。

6.1 HashSet集合
HashSet 是 Set 接⼝的⼀个实现类,它所存储的元素是不可重复的,并且元素都是⽆
序的(即存取顺序不⼀致)。HashSet 底层的实现其实是⼀个HashMap ⽀持。
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性
能。保证元素唯⼀性的⽅式依赖于: hashCode 与 equals ⽅法。

6.1.1 HashSet集合存储数据的结构
哈希表是由数组+链表+红⿊树(JDK1.8增加了红⿊树部分)实现的,保证HashSet
集合元素的唯⼀方式,其实就是根据对象的hashCode和equals⽅法来决定的。如果我们往集合中存
放⾃定义的对象,那么保证其唯⼀,就必须复写hashCode和equals⽅法建⽴属于当前对象的⽐
较⽅式。

6.1.2 LinkedHashSet
HashSet下⾯有⼀个⼦类 LinkedHashSet ,它是链表和哈希表组合的⼀个数据存储
结构。保证元素唯一,且有序。

6.2 SortedSet
SortedSet<T> 对象在插入和删除元素时维护排序顺序,而不会影响性能。 不允许重复元素。
 不支持更改现有项的排序值,这可能导致意外行为。

6.3 TreeSet
TreeSet是一个有序的集合,它的作用是提供有序的Set集合。
TreeSet是一个包含有序的且没有重复元素的集合,
TreeSet的元素支持2种排序方式:自然排序或者根据提供的Comparator进行排序。
TreeSet的构造函数都是通过新建一个TreeMap作为实际存储Set元素的容器。
因此TreeSet的底层实际使用的存储容器就是TreeMap。
相对HashSet,TreeSet的优势是有序,劣势是相对读取慢。
TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,
TreeSet判断元素是否重复 、以及确定元素的顺序 靠的都是这个方法;

7.Collections
Collections 是集合⼯具类,⽤来对集合进⾏操作。
常用方法:
public static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加⼀些元素。
public static void shuffle(List<?> list) :打乱集合顺序。
public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。
public static <T> void sort(List<T> list,Comparator<? super T> ) :将集合中元
素按照指定规则排序

7.1.Comparator⽐较器
排序是comparator能实现
的功能之⼀,该接⼝代表⼀个⽐较器,⽐较器具有可⽐性,顾名思义就是做排序的,通俗地讲需
要⽐较两个对象谁排在前谁排在后,那么⽐较的⽅法就是:
public int compare(String o1, String o2) :⽐较其两个参数的顺序。
两个对象⽐较的结果有三种:⼤于,等于,⼩于。
如果要按照升序排序,则o1 ⼩于o2,返回(负数),相等返回0,o1⼤于o2返回(正数)
如果要按照降序排序,则o1 ⼩于o2,返回(正数),相等返回0,o1⼤于o2返回(负数)

7.2.Comparable和Comparator两个接⼝的区别
Comparable:强⾏对实现它的每个类的对象进⾏整体排序。这种排序被称为类的⾃然排序,类
的 compareTo ⽅法被称为它的⾃然⽐较⽅法。只能在类中实现 compareTo() ⼀次,不能经常修
改类的代码实现⾃⼰想要的排序。实现此接⼝的对象列表(和数组)可以通过
Collections.sort(和Arrays.sort)进⾏⾃动排序,对象可以⽤作有序映射中的键或有序集合中的
元素,⽆需指定⽐较器。

Comparator:强⾏对某个对象进⾏整体排序。可以将 Comparator 传递给 sort ⽅法(如
Collections.sort或 Arrays.sort),从⽽允许在排序顺序上实现精确控制。还可以使⽤
Comparator 来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有⾃然顺序的
对象 collection 提供排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值