大纲:
集合只能存放引用数据类型。
1、为什么需要集合:
1、可以动态的保存任意多个类型的数据。
2、提供了一系列方便的操作对象的方法:add、remove、set、get等
2、介绍:
1、集合主要是两组:单列集合、双列集合
2、Collection接口:有两个重要子接口(List、Set),他们的实现子类都是单列集合。
3、Map接口的实现子类是双列集合,存放键值对。
ArrayList arraylist = new ArrayList();
arraylist.add("jack");
arraylist.add("tom");
HashMap hashmap = new HashMap();
hashmap.put("name1", "jack");
hashmap.put("name2", "tom");
3、Collection常用方法:因为list为接口,不能实例化,因此使用ArrayList演示:
Collection方法list接口和set接口都可以使用:
List list = new ArrayList(); // 向上转型
// 1、添加
// 1.1、添加单个元素
list.add("jack"); // 集合只可以存储引用数据类型,String是
list.add(10); // 自动装箱 list.add(new Integer(10))
list.add(true);
System.out.println(list); // [jack, 10, true]
// 1.2、添加多个元素
ArrayList list2 = new ArrayList();
list2.add("红楼梦");
list2.add("三国演义");
list.addAll(list2); // 添加一个集合list2
// 2、删除:
// 2.1、删除一个元素
list.remove(10); // 删除指定元素
list.remove(0); // 索引删除
// 2.2、删除多个元素
list.removeAll(list2);
// 3、查找元素
// 3.1、查找单个元素是否存在
list.contains("jack"); // T
// 3.2、查找多个元素
list.containsAll(list2);
// 4、获取元素个数:size
list.size();
// 5、判断是否为空
list.inEmpty();
// 6、清空:clear
list.clear();
4、遍历集合元素方法:
4.1、Iterator(迭代器):自动生成迭代器快捷键itit
4.1.1、介绍:
1、Iterator主要用于遍历Collection集合中的元素。
2、所有实现了Collection接口的集合类都有一个Iterator方法。
3、inerator仅用于遍历集合,本身并不存放对象。
4.1.2、迭代器原理:
1、Iterator inerator = col.inerator(); 得到一个迭代器。
2、hasNext(); 判断是否还有下一个元素,如果没有返回false,结束while循环。
3、next(); 两个作用:①、向下遍历元素。②、将遍历过的元素返回。
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1);
col.add(new Book("红楼梦", "曹雪芹", 6.1);
col.add(new Book("西游记", "吴承恩", 13.1);
col.add(new Book("水浒传", "施耐庵", 12.1);
// 1、先得到col对应的迭代器
Iterator inerator = col.inerator();
// 2、使用while循环遍历
while(iterator.hasNext()) {
// 返回下一个元素,类型是Object
Object next = inerator.next();
System.out.println(next);
}
// 3、当退出while循环后,这是inerator迭代器指向最后一个元素,如果再次遍历会报错
// iterator.next(); // NoSuchElementException错误
// 4、如果希望再次遍历,重置迭代器
iterator = col.inerator();
}
class Book {
private String name;
private String author;
private double price;
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
}
4.2、增强for循环遍历集合元素:快捷键 I
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1);
col.add(new Book("红楼梦", "曹雪芹", 6.1);
col.add(new Book("西游记", "吴承恩", 13.1);
col.add(new Book("水浒传", "施耐庵", 12.1);
// 增强for循环底层仍然是迭代器。
for(Object book : col) {
System.out.println(book);
}
// 增强for循环也可以用在数组中
int[] nums = {1, 2, 3, 4, 5};
for(int i : nums) {
System.out.println(i);
}
}
4.3、普通for循环遍历集合:
Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1);
col.add(new Book("红楼梦", "曹雪芹", 6.1);
col.add(new Book("西游记", "吴承恩", 13.1);
col.add(new Book("水浒传", "施耐庵", 12.1);
for(int i = 0; i < col.size(); i++) {
System.out.println(col.get(i));
}
5、List接口:
5.1、介绍:
1、List接口是Collection接口的子接口。
2、list集合中元素是有序的,且可以重复。
3、list集合元素支持索引。
List list = new ArrayList();
list.add(new Book("三国演义", "罗贯中", 10.1);
list.add(new Book("红楼梦", "曹雪芹", 6.1);
list.add(new Book("西游记", "吴承恩", 13.1);
list.add(new Book("水浒传", "施耐庵", 12.1);
System.out.println(list.get(3));
5.2、list常用方法:
List接口才可以使用,set接口不可以使用
List list = new ArrayList();
list.add("张三");
list.add("李四");
// 1、在指定位置插入元素
list.add(1, "王五");
// 2、在指定位置插入集合:
List list2 = new ArrayList();
list2.add("jack");
list2.add("mary");
list.addAll(1, list2);
// 3、返回元素首次出现的索引
list.indexOf("mary");
// 4、返回元素在集合中末尾出现的位置
list.lastIndexOf("mary");
// 5、获取指定位置的元素
list.get(1);
// 6、删除指定位置的元素并返回次元素
list.remove(0);
// 7、设置指定位置的元素;类似替换
list.set(1, "老六");
// 8、返回[fromIndex, toIndex)位置的子集合
List returnList = list.subList(0, 2); // [0,2)
ArrayList基本等同于Vector,但是线程不安全,在多线程时建议使用vector。
6、ArrayList底层结构和源码分析:
1、ArrayList中维护了一个Object类型的数组elementData。
2、当创建ArrayList对象时,如果使用的是ArrayList的无参构造,则初始elementData为0,第一次添加elementData扩容为10,再次添加,扩容为原来的1.5倍。
3、如果使用的是指定大小的构造器,那么初始elementData为指定大小,再次添加则扩容为原来的1.5倍。