Keyword:
- 集合
- Collection
- List
- Arraylist
- Vector
- Linkedlist
- List
集合
- 集合的由来
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。 - 数组和集合的区别
(1): 长度区别:
数组的长度是固定的而集合的长度是可变的
(2): 存储数据类型的区别:
数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型
(3): 内容区别:
数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素
集合继承体系图:
Collection集合
Collection集合的功能:
- 添加功能
boolean add(Object obj):
添加一个元素
boolean addAll(Collection c):
添加一个集合的元素 (给一个集合添加进另一个集合中的所有元素) - 删除功能
void clear():
移除所有元素
boolean remove(Object o):
移除一个元素
boolean removeAll(Collection c)
:移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素 ,如果没有交集元素 则删除失败 返回false - 判断功能
boolean contains(Object o):
判断集合中是否包含指定的元素
boolean containsAll(Collection c):
判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true)
比如:1,2,3 containsAll 12=true 1,2,3 containsAll 2,3,4=false
boolean isEmpty():
判断集合是否为空 - 获取功能
Iterator<E> iterator()
(重点) - 长度功能
int size():
元素的个数
面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢? - 交集功能
A集合对B集合取交集,获取到的交集元素在A集合中。返回的布尔值表示的是A集合是否发生变化boolean retainAll(Collection c)
:获取两个集合的交集元素(交集:两个集合都有的元素) - 把集合转换为数组 Object[] toArray()
集合的遍历之集合转数组遍历
public class Demo {
public static void main(String[] args) {
Collection list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
Object[] objects = list.toArray();
System.out.println(Arrays.toString(objects));
}
}
Collection存储自定义对象并遍历
public class Student {
int age;
String name;
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
public class test1 {
public static void main(String[] args) {
Collection list=new ArrayList();
list.add(new Student(20,"学生一"));
list.add(new Student(22,"学生二"));
list.add(new Student(23,"学生三"));
Object[] objects = list.toArray();
System.out.println(Arrays.toString(objects));
}
}
集合的遍历之迭代器遍历
public class Demo {
public static void main(String[] args) {
Collection list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
Iterator iterator = list.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
}
List集合
List概述及特点:元素有序,并且每一个元素都存在一个索引.元素可以重复.
案例演示
List集合存储字符串并遍历
迭代器的方式
public class Demo {
public static void main(String[] args) {
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
/*Iterator iterator = list.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}*/
Object[] objects = list.toArray();
System.out.println(Arrays.toString(objects));
}
}
List集合的特有功能
void add(int index,E element):
在指定索引处添加元素
E remove(int index):
移除指定索引处的元素 返回的是移除的元素
E get(int index)
:获取指定索引处的元素
E set(int index,E element):
更改指定索引处的元素 返回的而是被替换的元素
List集合的特有遍历功能
案例演示: 使用for循环 通过size()和get()方法结合使用遍历。
public class Demo {
public static void main(String[] args) {
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
System.out.println(o);
}
}
}
ListIterator的特有功能
ListIterator的特有功能:
boolean hasPrevious():
是否存在前一个元素
E previous():
返回列表中的前一个元素
注意:以上两个方法可以实现反向遍历 但是注意 要完成反向遍历之前 要先进行正向遍历 这样指针才能移到最后,如果直接反向遍历是没有效果的 因为指针默认位置就在最前面 他前面没有元素
public class Demo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()){
Object next = listIterator.next();
System.out.println(next);
}
while (listIterator.hasPrevious()){
Object previous = listIterator.previous();
System.out.println(previous);
}
}
}
aaa
bbb
ccc
ccc
bbb
aaa
并发修改异常产生的原因及解决方案
public class Demo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()){
Object next = listIterator.next();
System.out.println(next);
list.remove(0);<<<<<<<<<<<<<<<<<<<<ConcurrentModificationException
}
}
}
出现的原因:
- 我们用Iterator这个迭代器遍历采用hasNext方法和next方法或者高级for循环(数组的循环遍历),集合修改集合 会出现并发修改异常,原因是我们的迭代依赖与集合 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数,这个时候你在遍历的时候又突然想给 集合里面加一个元素(用的是集合的add方法) 那迭代器不同意 就报错了。
- 解决方案1 我们用ListIterator迭代器遍历 用迭代器自带的add方法添加元素
- 解决方案2 使用for循环遍历集合 添加元素 不会报错
List的三个子类的特点
List的三个子类的特点:
- ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。 - Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。 - LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
什么时候使用,要看具体的业务逻辑,是安全还是效率,查找多还是增删多
tips
数据结构其实就是存储数据的格式
分类:栈 , 队列 , 数组 , 链表 , 树 , 哈希表