集合和数组都是可以存数据的。但真实开发的时候用的是集合而不是数组。因为数组的容量是固定的,而且数组封装的方法比较少。
一、集合结构
Interface Collection<E> Java 中集合的总接口
---| List<E> Colletion的子接口,特征:存放数据是有序的,可以重复
---|---| ArrayList<E> List的实现类,重写了List接口所有的抽象方法,底层是数组
---|---| LinkedList<E> List的实现类,里面有自己独有的方法 底层是链表
---| Set<E> Collection的子接口, 特征: 存放数据是无序的,不可重复
--|--| HashSet<E> Set的实现类,底层是Hash算法
--|--| TreeSet<E> Set的实现类,底层是二叉树
二、Collection接口(了解)
开发常用Arraylist去实现List,List又是Collection的子接口,因此可以先学习Collection中的方法,之后再学习LIst和ArrayList中的独有的方法
2.1、Collection下面的方法:
boolean add(E e); 添加数据的
boolean addAll(Collection<? extends E> c); 添加集合
boolean remove(Object obj); 删除指定的元素
boolean removeAll(Collection<?> c) 删除集合中包含的所有此集合的元素
boolean contains(Object obj); 判断在集合中是否包含该元素
boolean containsAll(Collection<? extends E> c); 判断集合是否是另一个集合的子集
int size(); 集合中元素个数
void clear(); 清空集合中元素
boolean isEmpty(); 判断集合是否为空
Object[] toArray(); 将集合转为数组
三、List接口
List下面有自己独有的一些方法,子接口比父接口的功能全
语法格式:
ArrayList<E> arrayList = new ArrayList<E>();
3.1、List下面独有的方法(也可以调用继承的方法)
boolean add(int index, E e); 在指定索引下标的位置插入一个数据
boolean addAll(int index, Collection<? extends E> c); 在指定下标为位置 插入另外一个集合
E remove(int index); 通过索引删除数据,返回的是被删除的元素
E set(int index, E e); 替换指定下标的元素,返回值是被替代的元素
E get(int index); 获取指定的下标的元素
int indexOf(Object obj); 通过元素获取指定的下标
int lastIndexOf(Object obj); 获取指定元素的最后一次出现的下标
List<E> subList(int startIndex, int endIndex); 截取集合中的一段
ListIterator<E> listIterator = 集合名.listIterator(index);
该迭代器相比父类的迭代器,可以自定义遍历的位置
3.2、ArrayList和LinkedList区别
1.ArrayList底层是数组,LinkedList底层是链表
2.ArrayList在随机取数据的时候效率高于LinkedList
3.ArrayList在删除和插入的时候效率低于LinkedList
4.ArrayList会自己扩容,需要预留一定空间的
5.LinkedList 是存储数据的节点的信息以及节点信息的内存的指针
四、Set接口
Set接口下面有两个实现类:HashSet和TreeSet
4.1、HashSet
语法格式:
Set<E> set= new HashSet<E>();
只能用for循环、增强for循环和迭代器来读取数据
4.2、set集合中存自定义的对象
需要在实例类中重写hashCode和equals方法,确保set集合中存入的自定义对象是完全不同的对象。(可以快捷键,也可以自定义重写。自定义重写时,两个方法的返回值必须和自定义对象的属性有关才可以)
4.3、TreeSet
在Set集合内数据无需不重复的基础上,对存入数据会进行自然排序。
语法格式:
//无参:
Set<E> set = new TreeSet<E>();
//有参:
//构造一个新的、空的树集,根据指定的比较器进行排序
TreeSet<Emp> emps = new TreeSet<Emp>(new Comparator<Emp>() {
@Override
public int compare(Emp o1, Emp o2) {
// TODO Auto-generated method stub
int num = o1.age - o2.age;
return num;
}
});
4.4、TreeSet存自定义的对象
存对象的时候需要在类的实现Comparable这个接口。该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo
方法被称为其自然比较方法
返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象
1、如果返回值是负数,就证明对象一 < 对象二,对象一排在对象二前面
2、如果返回值是0,就证明相等,不存
3、如果返回值是正数,就证明对象一 > 对象二,对象一排在对象二后面