一、集合的好处
- 可以动态保存任意多个对象,使用比较方便
- 提供了一系列方便的操作对象:add、remove、set、get等
- 使用集合添加,删除新元素的示意代码简洁明了
二、集合的框架体系
Collection集合体系
Collection借口有两个重要的子借口List 和Set,他们的实现子类都是单列集合
Map集合
Map接口的实现子类是双列集合,存放的K-V存放键值对
二、Collection
Collection接口实现类的特点
- Collection实现子类可以存放多个元素,每个元素可以是Object
- 有些Collection的实现类,可以存放重复的元素,有些不可以
- 有些Collection的实现类,有些是有序的(List),有些不是有序的(Set)
- Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的
Collection接口和常用方法
以ArrayList来演示
add
add也可以()内输入index,Object obj来把要放入的数据插入index位置
public class Collection01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(true);
System.out.println(list);//[jack, 10, true]
}
}
remove(int index)
index表示要删除的元素位置,还有一种选择删除的对象,返回的是boolean值;也可以指定删除某个值
public class Collection01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(true);
System.out.println(list);//[jack, 10, true]
list.remove(0);//表示删除第一个元素
System.out.println(list);//[10, true]
}
}
contains()
寻找是否存在返回boolean值
public class Collection01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(true);
System.out.println(list);
// list.remove(0);//表示删除第一个元素
// System.out.println(list);
System.out.println(list.contains(10));//true
}
}
size()
用来返回集合中元素的个数
public class Collection01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(true);
System.out.println(list);
System.out.println(list.size());//3
// list.remove(0);//表示删除第一个元素
// System.out.println(list);
// System.out.println(list.contains(10));
}
}
isEmpty()
//判断集合是否为空返回boolean值
public class Collection01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(true);
System.out.println(list);
System.out.println(list.isEmpty());//false
// System.out.println(list.size());
// list.remove(0);//表示删除第一个元素
// System.out.println(list);
// System.out.println(list.contains(10));
}
}
clean()
清空数组
public class Collection01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(true);
System.out.println(list);
list.clear();//[]
// System.out.println(list.isEmpty());
// System.out.println(list.size());
// list.remove(0);//表示删除第一个元素
// System.out.println(list);
// System.out.println(list.contains(10));
}
}
addAll(),containsAll(),removeAll()
这三个形参都是集合对象
add也可以()内输入index,Object objs来把要放入的数据插入index位置
public class Collection01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
List list2 = new ArrayList();
list2.add("jack");
list2.add("rose");
list.addAll(list2);
System.out.println(list);//[jack, rose]
System.out.println(list.containsAll(list2));//true
list.removeAll(list2);
System.out.println(list);//[]
}
}
Collection接口遍历元素的方式
使用iterator迭代器
- iterator对象称为迭代器,主要用于遍历Collection集合中的元素
- 所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了lterator接口的对象,即可以返回一个迭代器
- iterator的结构
- iterator仅用于遍历集合,本身并不存放对象
lterator接口的方法
- hasnext()返回boolean值判断下一个是否还有值
- next()返回下一个元素
- 在用next()前一定要先判断hasnext()不然如果下一个没有值则会抛出NoSuchElementException异常
public class Iterator01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("三国演义","罗贯中",10.1));
col.add(new Book("小李飞刀","古龙",5.1));
col.add(new Book("红楼梦","曹雪芹",34.6));
//System.out.println(col);
//遍历集合
//1.先得到col对应的迭代器
Iterator iterator = col.iterator();
while(iterator.hasNext()){
//返回下一个元素,类型是Object
Object obj = iterator.next();
System.out.println(obj);
}
//快捷键itit加回车
}
}
当退出while循环后,迭代器指针指向最后一个元素
如果希望再次遍历则需要重置迭代器
iterator = col.iterator();
增强for循环
就是简化版的iterator迭代器只能用于遍历数组或集合
public class For {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("三国演义","罗贯中",10.1));
col.add(new Book("小李飞刀","古龙",5.1));
col.add(new Book("红楼梦","曹雪芹",34.6));
for (Object obj : col){
System.out.println(obj);
}
//快捷键输入I
}
}
二、List接口
List接口基本介绍
List接口是Collection接口的子接口
- List集合类中元素有序(即添加顺序和取出顺序一致)、且可以重复
- List集合中的每一个元素都有其对应的顺序索引,即支持索引。
- List容器中的每一个元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
- JDK API 中List接口的实现类有
常用的有ArrayList、LinkedList和Vector
List方法补充
indexOf()和lastIndexOf()
索引找到括号内元素出现的第一个位置
last表示最后一个出现的位置
public class List01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add("j");
list.add("tom");
list.add(1);
System.out.println(list.indexOf("tom"));//2
}
}
remove()
表示删除下标位置的元素
public class List01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add("j");
list.add("tom");
list.add(1);
System.out.println(list.indexOf("tom"));//2
list.remove(0);
System.out.println(list);//[j, tom, 1]
}
}
set(int index , obj)
表示在index位置将原来元素改为你输入的元素
public class List01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add("j");
list.add("tom");
list.add(1);
list.set(1,"ss");
System.out.println(list);//[jack, ss, tom, 1]
}
}
subList(int fromindex,int toindex)
表示索引从fromindex位置到toindex位置但是toindex位置不取左闭右开
public class List01 {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add("j");
list.add("tom");
list.add(1);
System.out.println(list.subList(0,2));//[jack, j]
}
}
三、ArrayList底层结构和源码分析
ArrayList的注意事项
- 可以加入所有元素,null也可以加入并且多个
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码。在多线程情况下,不建议使用ArrayList
ArrayList的底层操作机制源码分析
transient表示属性不会被序列化