Collection集合概述
Collection集合(单列集合)
集合与数组的区别
- 数组的长度是固定的。集合的长度是可变的。
- 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储
- 特点
- list集合存储的元素可以重复
- list集合存储的元素有序
- 有索引(可用普通for循环遍历)
- Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下:
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()
: 把集合中的元素,存储到数组中- 注意: 有关Collection集合的方法可不止这些,其他方法可以自行查看API学习。
List集合
- 特点
- 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
- 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
- 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
- 常用方法
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。public E get(int index)
:返回集合中指定位置的元素。public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
ArrayList集合
- Arraylist集合底层为一个数组结构,因此具有查询快,增删慢的特性
- 因为数组创建后大小是固定的,每次增加或者删除一个元素都要创建一个新的数组
- 大小可变的数组
- 常用方法
- public boolean add(E e) :将指定的元素添加到此集合的尾部。
public E remove(int index) :移除此集合中指定位置上的元素。返回被删除的元素。
public E get(int index) :返回此集合中指定位置上的元素。返回获取的元素。
public int size() :返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界。
- public boolean add(E e) :将指定的元素添加到此集合的尾部。
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。
Set集合
- 特点
- set集合存储元素无序
- set集合存储元素不能重复
HashSet集合
- 底层是hash表结构,查询迅速非常快
Hash表
-
数组+链表
-
数组+红黑树结构
-
Java中在创建对象时,每一个对象对会有一个hash值,即由object类中的hashcode方法获得,而hashcode方法是一个native方法,本地方法,是操作系统的方法,不是由Java来编写的,用底层的c或者c++方法编写,通过本地方法接口调用本地方法库,从库中获得。每个对象所获得的哈希值都是不同的,如果哈希值相同,则认为两个对象相同。而哈希表结构:数组中存储的是不同的哈希值,将对象存储在链表或者红黑树中。所以Hashset集合查询速度是非常快的
-
hashset方法和equals方法保证数组的唯一性
-
如果在集合中要存储自定义对象,那么这个集合必须重写hashcode和equals方法
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age); } }