一、集合和数组既然都是容器,它们的区别:
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):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
注意: 操作索引的时候,一定要防止索引越界异常,
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; } }