一、集合和数组既然都是容器,它们的区别:
1. 数组的长度是固定的。集合的长度是可变的
2. 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储
二、集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection
和双列集合java.util.Map
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List
和java.util.Set
。其中,List
的特点是元素有序、元素可重复。Set
的特点是元素无序,而且不可重复。List
接口的主要实现类有java.util.ArrayList
和java.util.LinkedList
,Set
接口的主要实现类有java.util.HashSet
和java.util.TreeSet
。
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(): 把集合中的元素,存储到数组中。
三、List接口
特点:①有序 ②有索引 ③允许存储重复元素
List接口中带索引的方法(特有): public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。 public E get(int index):返回集合中指定位置的元素。 public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。 public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
注意: 操作索引的时候,一定要防止索引越界异常,IndexOutOfBoundsException:索引越界异常,集合会报 ArrayIndexOutOfBoundsException:数组索引越界异常 StringIndexOutOfBoundsException:字符串索引越界异常。
List接口的实现类:
1. ArrayList,底层是数组结构。元素增删慢,查寻快
2.LinkedList,底层链表结构。元素增删快,查询慢 ;里面包含了大量操作首尾的方法
3.Vector,底层是数组结构,Vector是同步的,即单线程、速度慢,而ArrayList不是同步的
LinkedList中部分方法:
public void addFirst(E e):将指定元素插入此列表的开头。 public void addLast(E e):将指定元素添加到此列表的结尾。 public void push(E e):将元素推入此列表所表示的堆栈。 public E getFirst():返回此列表的第一个元素。 public E getLast():返回此列表的最后一个元素。 public E removeFirst():移除并返回此列表的第一个元素。 public E removeLast():移除并返回此列表的最后一个元素。 public E pop():从此列表所表示的堆栈处弹出一个元素,此方法相当于removeFirst public boolean isEmpty():如果列表不包含元素,则返回true。
四、Set接口
特点:①不允许存储重复元素②没有索引,没有带索引的方法,也不能使用普通的for循环遍历
Set接口的实现类:
1. HashSet,底层是哈希表结构(查询的速度非常快),不同步;是一个无序的集合,存储和取出元素的顺序可能不一致,两种遍历方式:增强for循环和迭代器遍历
2. LinkedHashSet,底层是一个哈希表(数组 链表/红黑树) 链表:多了一条链表(记录元素的存储顺序),保证元素有序,有序,不允许存储重复元素
注意: HashSet集合存储数据的结构(哈希表) jdk1.8版本之前:哈希表=数组 链表 jdk1.8版本之后: 哈希表=数组 链表 哈希表=数组 红黑树(提高查询的速度)
set集合保证元素唯一:存储的元素(String、Integer、Student、Person.......),必须重写hashCode方法和equals方法;如:存储Person类型,同名统年龄的人视为同一个人,此时为保证元素唯一,就必须重写hashCode方法和equals方法
import java.util.Objects; public class Person { String name; int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } @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); } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }