1. 集合
- 集合主要分两组,单列集合和双列集合。
- 集合是用于存放数据的空间,它不同于数组,可以存放多种类型的数据。
- Collection接口有两个主要的子接口:List 和 Set,它们的实现子类都是单列集合。
- Map接口的实现子类是双列集合,存放键值对。
2. Collection 接口
- Collection实现子类可以存放多个元素,每个元素可以是Object。
- 有些Collection的实现子类可以存放重复的元素,有些不能。
- 有些子类是有序的(List),有些是无序的(Set)。
- Collection接口没有直接实现的子类,是通过子接口List和Set来实现的。
- 实现了Collection接口的子类可以使用父接口Iterable的Iterator方法。
- Iterator的方法主要与next()、hasnext()、remove()。
- 调用next()方法后必须调用hasnext()方法,否则会报错。
2.1 List 接口
- 常用方法
public class Demo01 {
public static void main(String[] args) {
List list= new ArrayList();
//添加单个元素 add
list.add("jack");
list.add(10);//list.add(new Intger(10))
list.add(true);
System.out.println(list);
//删除指定元素 remove
list.remove(0);//删除第一个元素,返回删除的元素
list.remove(new Integer(10));//删除指定元素,返回布尔值
System.out.println(list);
//查找某个对象是否存在 contains,返回布尔值
System.out.println(list.contains(true));
System.out.println(list.contains("jack"));
System.out.println(list);
//获取元素的个数 size
System.out.println(list.size());
//判断是否为空 isEmpty
System.out.println(list.isEmpty());
//清空 clear
list.clear();
System.out.println(list);
//添加多个对象 addAll
List list2 = new ArrayList<>();
list2.add("jack");
list2.add("tom");
list.addAll(list2);//实现了Collection的对象都可以添加
System.out.println(list);
//判断多个元素是否存在 ContainsAll
System.out.println(list.containsAll(list2));
//删除多个元素 removeAll
list.removeAll(list2);
System.out.println(list);
//
}
- 迭代器遍历
public class Demo02 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Book("猫和老鼠",60));
list.add(new Book("海绵宝宝",10));
list.add(new Book("喜洋洋",80));
System.out.println(list);
//通过Interator迭代器遍历
Iterator iterator = list.iterator();
// while (integer.hasNext()){ //判断是否还有数据
// Object objects = integer.next();
// System.out.println(objects);}
while (iterator.hasNext()) { //itit快捷
Object next = iterator.next();
System.out.println(next);
}
//当迭代器遍历完毕,退出while循环后,迭代器已经指向最后的元素,无法再next(),会返回异常
//如果要重置迭代器,需要重置迭代器
iterator = list.iterator();
}
}
class Book{
private String name;
private int num;
public Book(String name, int num) {
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
}
- 增强for循环遍历
public class Demo03 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Book("猫和老鼠",60));
list.add(new Book("海绵宝宝",10));
list.add(new Book("喜洋洋",80));
//增强for循环
for (Object book:list) {
System.out.println(book);
}
}
}
- 例子
创建Dog{name,age}对象,放入Arraylist中,赋给List引用,用迭代器和增强for两种方式遍历,重写Dog的toString方法,输出name和age。
import java.util.ArrayList;
import java.util.Iterator;
public class Test01 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(new Dog("小雪",10));
arrayList.add(new Dog("小白",5));
arrayList.add(new Dog("萌多",9));
//建立迭代器
Iterator iterator = arrayList.iterator();
//迭代器遍历
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
//增强for循环遍历
for (Object dog :arrayList) {
System.out.println(dog);
}
}
}
class Dog{
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.2 ArrayList 集合
- ArrayList可以加入null,并且可以加入多个。
- ArrayList是由数组来实现数据储存的。
- ArrayList基本等同于Vector,但ArrayList是线程不安全的,多线程的情况下,不建议用ArrayList
- 底层源码。
- ArrayList中维护了一个Object类型的数组elementData.
- 当创建一个ArrayList对象时,如果使用无参构造器,则初始化elementData的容纳为0,添加元素,则扩容到10。
- 需要再扩容时,会每次扩容1.5倍。
- 如果使用指定大小的构造器,则初始容纳为指定大小,扩容时自己扩容1.5倍。
2.3LinkedList 集合
-
LinkedList 底层实现了双向链表和双端队列的特点。
-
可以添加任意元素,元素可以重复,包括null。
-
线程不安全,没有实现同步。
-
构造LinkedList的底层源码实现过程。
无参构造,LinkedList的size=0,last和first的指向都为null。 -
添加LinkedList的元素的底层源码实现过程
1.判断如果last为null,则创建一个新的newNode对象指向一个新的含有该元素空间,并使last指向这个新空间。
2.size++ , modCounter++。
newNode的next指向下一个Node,per指向上一个Node
3.使添加位置的上一个Node的next指向新空间和下一个Node的per指向新空间。
2.4 Vector 集合
- Vector集合是线程安全的,适用于多线程开发。
- 它的底层实现和ArrayList是相似的,但它维护的elementData数组是被synchronized修饰的,因此它是线程安全的。
- 当创建一个Vector对象时,如果使用无参构造器,则初始化elementData的容纳为0,添加元素,则扩容到10。
- 需要再扩容时,会每次扩容2倍。
- 如果使用指定大小的构造器,则初始容纳为指定大小,扩容时自己扩容2倍。
- 并且Vector的扩容方法是可以通过三元运算符指定扩容大小的。