![](https://img-blog.csdnimg.cn/de92b79974804d43a03f092d3a5e4a73.png)
Collection集合特点
List系列集合:添加的元素是有序、可重复、有索引
ArrayList、LinekdList :有序、可重复、有索引
Set系列集合:添加的元素是无序、不重复、无索引
Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的
Collection的常见方法
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数。 |
public Object[] toArray() | 把集合中的元素,存储到数组中 |
遍历:
迭代器
迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator
Collection集合获取迭代器的方法
Iterator<E> iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素 |
Iterator迭代器中的常用方法
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true ,不存在返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象指向下一个元素处。 |
例子:
Iterator<String> it = lists.iterator();
while(it.hasNext()){
String ele = it.next();
System.out.println(ele);
}
lIterator<E> iterator():得到迭代器对象,默认指向当前集合的索引0
通过迭代器获取集合的元素,如果取元素越界会出现什么异常?
会出现NoSuchElementException异常。
增强for循环
修改增强for中的变量值不会影响到集合中的元素。即下列例子中的s
for (元素的数据类型 变量名 : 数组或者集合) {
//在此处使用变量即可,该变量就是元素
}
例子:
Collection<String> c = new ArrayList<>();
...
for(String s : c) {
System.out.println(s);
}
Lambda表达式遍历集合 (forEach)遍历
default void forEach(Consumer<? super T> action) | 结合lambda遍历集合 |
Collection<String> lists = new ArrayList<>();
...
lists.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
lists.forEach(s -> {
System.out.println(s);
});
// lists.forEach(s -> System.out.println(s));
列子:
Collection<String> c = new ArrayList<>();
c.add("赵敏");
c.add("小昭");
c.add("素素");
c.add("灭绝");
//调用forEach方法
//由于参数是一个Consumer接口,所以可以传递匿名内部类
c.forEach(new Consumer<String>{
@Override
public void accept(String s){
System.out.println(s);
}
});
//也可以使用lambda表达式对匿名内部类进行简化
c.forEach(s->System.out.println(s)); //[赵敏, 小昭, 素素, 灭绝]
List系列集合特点: 有序,可重复,有索引
List集合的特有方法
lList集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了。
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
List集合支持的遍历方式
查询速度快(注意:是根据索引查询数据快):查询数据通过地址值和索引定位,查询任意数据耗时相同。
删除效率低:可能需要把后面很多的数据进行前移。
添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。
LinkedList集合的底层原理
基于双链表实现的
链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
链表的特点1:查询慢,无论查询哪个数据都要从头开始找。
链表的特点2:链表增删相对快
但对首尾元素进行增删改查的速度是极快的
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
LinkedList的应用场景之一:可以用来设计队列
队列的特点:先进先出,后进后出
数据进入栈模型的过程称为:压/进栈(push)
数据离开栈模型的过程称为:弹/出栈(pop)
set--集合
Set系列集合特点:无序:添加数据的顺序和获取出的数据顺序不一致; 不重复; 无索引;
注意:
Set要用到的常用方法,基本上就是Collection提供的!!
自己几乎没有额外新增一些常用功能!
Set集合的常见实现类有哪几个?各自有啥特点?
TreeSet
注意:
对于数值类型:Integer , Double,默认按照数值本身的大小进行升序排序。
对于字符串类型:默认按照首字符的编号升序排序。
对于自定义类型如Student对象,TreeSet默认是无法直接排序的。
自定义排序规则
TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。
方式一
方式二
public TreeSet(Comparator<? super E> comparator)
两种方式中,关于返回值的规则:
注意:如果类本身有实现Comparable接口,TreeSet集合同时也自带比较器,默认使用集合自带的比较器排序。