Collection之List接口
集合概述
概述:java中的集合就像一个容器,专门用来存储JAVA对象(实际上是对象的引用,但习惯上称为对象),这些对象可以是任意的数据类型
并且长度可变。其中,这些集合类都位于java.util包中,在使用时一定要 注意包的问题,否则出现异常。集合按照存储结构可以分为两大类,即单列集合Collection和双列集合 Map
Collection:单列集合的根接口,用于存储一系列符合某种规则的元素。collection 集合有两个非常重要的子接口,分别是List 和 Set.
Map: 双列集合的根接口,用于存储具有键(Key),值(Value)映射关系的元素。
Collection 接口
Collection 是所有单列集合的根接口,因此在Collection 中定义了单列集合(List 和 Set)的一些通用方法
函数 | 说明 |
---|---|
boolean add(Object o) | 向集合中添加一个元素 |
boolean addAll(Collection c) | 将指定集合c中所有元素添加到该集合中 |
void clear() | 删除该集合中的所有元素 |
boolean remove(Object o) | 删除该集合中指定的元素 |
boolean removeAll(Collection c) | 删除该集合中包含指定集合c中的所有元素 |
boolean isEmpty() | 判断该集合是否为空 |
boolean contains(Object o ) | 判断该集合中是否包含某个元素 |
boolean containsAll(Collection c) | 判断该集合中是否包含指定集合c中的所有元素 |
Iterator iterator() | 返回在该集合的元素上进行迭代的迭代器,用于遍历该集合所有元素 |
int size() | 获取该集合元素个数 |
Stream stream() | 将集合源转换为有序元素的流对象 |
List 接口
List 接口简介:
是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外 List 集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。List 集合继承了Collection 接口中的全部方法,而且还增加了一些操作集合的特有方法。
函数 | 说明 |
---|---|
void add(int index, Object element) | 将元素element 插入在List集合的指定索引位置 |
boolean addAll(int index,Collection c) | 将集合 c 包含的所有元素插入到List集合的指定索引位置 |
Object get(int index) | 返回集合索引index处的元素 |
Object remove(int index) | 删除index索引处的元素 |
Object set(int index,Object element) | 将索引index处元素替换成element 元素,并将替换后的元素返回 |
int indexOf(Object o) | 返回对象 o 在list 集合中首次出现的位置索引 |
int lastIndexOf(Object o) | 返回对象 o 在list集合中最后一次出现的位置索引 |
List subList(int fromIndex, int toIndex) | 返回从索引 fromIndex(包括)到 toIndex(不包括)处所有元素集合组成的子集合 |
Object [] toArray() | 将集合元素转换为数组 |
default void sort(Comparator<?super E > c) | 根据指定的比较器规则对集合元素排序 |
sort(Comparator< ? super E > c) | 用于对集合进行排序操作,该方法的参数是一个接口类型的比较器Comparator,可以用Lambda表达式传入一个函数式接口作为参数,来指定集合元素的排序规则。 |
ArrayList类
ArrayList 是 List 接口的一个实现类。
ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList 会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组
缺点:不适合做大量的增删操作。
优点:遍历和查找元素时显得非常高效。
e.g:
package arraylist;
import java.util.ArrayList;
public class arraylist {
public static void main(String[]args)
{
ArrayList list = new ArrayList();
list.add("s1");
list.add("s2");
list.add("s3");
System.out.println("集合的长度是 " + list.size());
System.out.println("第二个元素是 " + list.get(1));
}
}
LinkedList 集合
List的另一个实现类,集合内部包含两个Node类型的first 和 last 属性维护一个双向循环链表。
优点:增删操作比较方便
LinkedList 中的特有方法:
函数 | 说明 |
---|---|
void add(int index, E element) | 在此列表中指定的位置插入指定的元素 |
void addFirst(Object o) | 将指定元素插入集合的开头 |
Object getFirst() | 返回集合的第一个元素 |
Object getLast() | 返回集合的最后一个元素 |
Object removeFirst() | 移除并返回集合的第一个元素 |
Object removeLast() | 移除并返回集合的最后一个元素 |
boolean offer(Object o) | 将指定元素添加到集合的结尾 |
boolean offerFirst(Object o) | 将指定元素添加到集合的开头 |
boolean offerLast(Object o) | 将指定元素添加到集合的结尾 |
Object peek() | 获取集合的第一个元素 |
Object peekFirst() | 获取集合的第一个元素 |
Object peekLast() | 获取集合的最后一个元素 |
Object poll() | 移除并返回集合第一个元素 |
Object pollFirst() | 移除并返回集合第一个元素 |
Object pollLast() | 移除并返回集合最后一个元素 |
void push(Object o) | 将指定元素添加到集合的开头 |
Object pop() | 移除并返回集合的第一个元素 |
e.g:
package arraylist;
import java.util.LinkedList;
public class arraylist {
public static void main(String[]args)
{
LinkedList link = new LinkedList();
link.add("s1");
link.add("s2");
link.add("s3");
System.out.println(link);
link.offer("offer");
link.push("push");
System.out.println(link);
Object object = link.peek();
System.out.println(object);
link.removeFirst();
link.pollLast();
System.out.println(link);
}
}
Collection 集合遍历
Iterator 遍历集合(迭代器)
e,g:
package arraylist;
import java.util.Iterator;
import java.util.ArrayList;
public class arraylist {
public static void main(String[]args)
{
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
Iterator iterator = list.iterator();
while(iterator.hasNext())
{
Object obj = iterator.next();//调用next()函数时,必须保证要获取元素存在,否则会抛出NoSuchElementException 异常
System.out.println(obj);
}
}
}
foreach 遍历集合
e.g:
package arraylist;
import java.util.ArrayList;
public class arraylist {
public static void main(String[]args)
{
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
for(Object obj : list) {
System.out.println(obj);
}
}
}
注意:
1.foreach 循环虽然书写起来很简洁,但在使用时也存在一定的局限性。当使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改
原因是:临时变量指向一个新的字符串,这和数组中的元素没有一点关系。普通的for循环可以修改
2.在使用Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的remove()方法去删除元素,会出现异常。
package arraylist;
import java.util.Iterator;
import java.util.ArrayList;
public class arraylist {
public static void main(String[]args)
{
ArrayList list = new ArrayList();
list.add("jack");
list.add("Annie");
list.add("rose");
list.add("Tom");
Iterator iterator = list.iterator();
while(iterator.hasNext())
{
Object obj = iterator.next();//调用next()函数时,必须保证要获取元素存在,否则会抛出NoSuchElementException 异常
if("Annie".equals(obj))
{
//list.remove(obj);
//想要删除方法1
// break;
//方法2
iterator.remove();
}
}
System.out.println(list);
}
}
不这样做,按照原来的方法在运行时会出现 ConcurrentModificationException 这个异常,因为使用list.remove()会使得迭代器预期的迭代次数发生变化,导致迭代结果不正确。