1.Collection
1.1 概述
Java集合是使程序能够存储和操纵元素不固定的一组数据,所有Java集合类都位于java.util包中
使用数组把多个元素放到一起时,就要提供Java集合工具类
对比数组和Java集合工具类来解释Java集合工具类的必要性:
数组: 长度固定,可以存放任意类型
集合: 长度不固定,不能存放基本数据类型,只能存放对象的引用
注意:如果集合中存放基本类型,一定要将其装箱为对应的基本类型包装类
1.2 继承体系
虚线空心箭头是实现 实线空心箭头是继承 虚线实心箭头是关联
1.3 常用方法
1.4 使用方式
// 创建集合对象
Collection c1 = new ArrayList();
// 判断是否为空(个数是否为0)
System.out.println(c1.isEmpty());
// 集合中是不能保存基本类型的,需要转换为对应包装类才可以
// 这里会进行自动装箱为Integer类型,然后发生多态转型为Object类型 进行存储
c1.add(123);
c1.add(new Integer(1));
c1.add(new Collection_01());
// 个数
System.out.println(c1.size());
System.out.println(c1.isEmpty());
// 删除,会调用要删除元素的equals方法,但是Integer覆写了,所以可以把1删掉
c1.remove(1);
A a = new A("张三");
A a1 = new A("张三");
c1.add(a);
// 所以使用集合保存自定义类型的时候,要注意,是否要覆写equals方法,定义怎么算相等
c1.remove(a1);
// 把集合转换为数组
Object[] arr = c1.toArray();
for (Object object : arr) {
System.out.println(object);
}
// 清空集合
c1.clear();
System.out.println(c1.size());
1.5 Contains 和Remove
Contains 判断集合中是否包含某个元素
Remove 删除指定元素
两个方法底层都会自动调用该对象的equals方法,不管包含还是删除,都需要找到这个数据,所以只能比较,且集合保存的都是引用类型,所以只能使用equals方法
2 Iterator
2.1 概述
在面向对象编程里,迭代器模式是一种设计模式,是一种最简单也最常见的设计模式
它可以让用户透过特定的接口巡访容器中的每一个元素而不用了解底层的实现
获取该集合的迭代器对象
Iterator it = 集合对象.iterator();
三步:
1 Boolean hasNext():判断下面还有没有元素,如果有就返回true,没有就返回false
2 E next():获取下一个元素,并指向下一个元素
3 remove():删除当前指向的元素
注意:
迭代器一旦创建,集合中就不能添加和删除元素了
如果添加或删除,必须重新生成迭代器
2.2 常用方法
2.3 使用方式
// Collection c1 = new ArrayList();
// Collection c1 = new HashSet();
Collection c1 = new LinkedList();
c1.add(1);
c1.add("abc");
// 1 创建迭代器
Iterator it = c1.iterator();
// 遍历 判断下面是否有元素
while (it.hasNext()) {
// 获取并指向下一个元素
Object obj = it.next();
System.out.println(obj);
}
// 使用完之后,想再次使用,需要重新创建
it = c1.iterator();
// 迭代器创建之后,不能添加和删除 , 必须重新生成迭代器
c1.add(2);
c1.add(3);
c1.remove(1);
it = c1.iterator();
while (it.hasNext()) {
// 获取并指向下一个元素
Object obj = it.next();
System.out.println(obj);
// 使用迭代器的时候,不能更改集合个数,所以删除数据的时候不能使用集合的删除,应该使用迭代器的删除
// c1.remove(obj);
it.remove();
}
System.out.println(c1.size() + "----");
3.List
3.1 概述
List特点:添加顺序和取出顺序是一致的,可以有重复数据
ArrayList: 底层是个Object数组,查询更改快,添加删除慢
LinkedList:底层是一个双向链表,查询更改慢,添加删除快
3.2 ArrayList
ArraysList默认初始化容量为10,扩大容量为原始容量的1.5倍
也就是说 我们new ArrayList()的时候,数组长度是为0的,
1.5倍 长度+长度>>1 (长度+长度/2)
3.2.1 常用方法
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
// add(E e ) : 尾部添加
// add(int index , E e ) : 添加到指定位置
// set(int index, E e ) : 更改指定位置上的元素值
// remove(Object object) : 根据元素内容删除
// remove(int index) : 根据索引删除
// get(int index) : 获取指定位置的数据
list.add(1, 4);
// 1 4 2 3
list.set(3, 33);
// 1 4 2 33
System.out.println(list);
System.out.println(list.get(2));
// 这是根据索引删除
list.remove(1);
// 1 2 33
// 删除元素值为1
list.remove(new Integer(1));
// 2 33
System.out.println(list);
// 传统for遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// foreach遍历
for (Object object : list) {
System.out.println(object);
}
// 迭代器遍历
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
3.2.2 遍历
传统for遍历
for(int i =0;i<list.size();i++){
System.out.println(list.get(i));
}
foreach遍历
for(Object object:list){
System.out.println(object);
}
迭代器遍历
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
3.3 LinkedList
和ArrayList操作一模一样
3.3.1常用方法
LinkedList list = new LinkedList();
// add(E e ) : 尾部添加
// add(int index , E e ) : 添加到指定位置
// set(int index, E e ) : 更改指定位置上的元素值
// remove(Object object) : 根据元素内容删除
// remove(int index) : 根据索引删除
// get(int index) : 获取指定位置的数据
首部添加的几种方法
list.addFirst(); list.push(); list.offerFirst();
尾部添加的几种方法
list.addLast(); list.offerLast(); list.offer();
3.3.2 LinkedList类
list.add(1);
list.add(2);
list.add(3);
list.add(0, 4); // 4 1 2 3
list.set(3, 33); // 4 1 2 33
System.out.println(list.get(2));
// 这是根据索引删除
list.remove(1);
// 删除元素值为1
list.remove(new Integer(1));
System.out.println(list); // 2 33
// 传统for遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// foreach遍历
for (Object object : list) {
System.out.println(object);
}
// 迭代器遍历
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());