1.集合 Collection
1.1 什么是集合?
Java中的集合是指计算机程序存储和操作不固定元素的一组数据,所有的Java集合类都位于java.util包中,使用的时候需要导包
集合和数组都是存储多个元素的方式,那么他们的区别在哪呢?
1.集合中只能存放引用数据类型,如果想存储基本数据类型,需要装箱
2.集合的长度是不固定的,而数组是固定的
1.2 继承体系
1.3 常用方法
1.4 使用方式
//创建集合对象
Collection c1 = new ArrayList() ;
//判断集合是否为空 isEmpty()
System.out.println(c1.isEmpty());
//集合添加操作,集合只能存储引用类型对象,所以当输入为基本数据类型时,
//会自动装箱成相应包装类类型
c1.add(1) ;
c1.add(new Integer(1)) ;
c1.add(new Collection_01()) ;
//查看集合中的元素个数
System.out.println(c1.size()) ;
//删除集合中对应的元素,会调用要删除元素的equals方法
//但是Integer覆写了equals方法,所以可以把1删掉
c1.remove(1) ;
//自定义类型变量的时候,要注意是否覆写equals方法,
//定义怎么算相等
A a = new A("张三") ;
A a1 = new A("张三") ;
c1.add(a) ;
c1.remove(a1) ;
System.out.println(a1) ;
//将集合转换为数组
Object [] arr = c1.toArray() ;
for(Object obj : arr){
System.out.println(obj) ;
}
//清空集合
c1.clear();
1.4 注意事项
在使用集合的remove方法和contains方法时,程序需要寻找要删除的元素,寻找过程中需要一个一个的对比,所以equals方法和hashCode方法被调用了,equals方法如果没有覆写的话默认打印的是地址,所以如果想要判断正确,一般情况下需要覆写equals方法确认对比的是那个值
2.迭代器 Iterator
2.1 什么是迭代器
在面向对象编程中,迭代器模式是一种设计模式(前人的经验,后人使用)
他可以让用户通过特定的接口寻找容器中的每一个元素而不管它的数据结构是啥,就是无论你是个数组还是个链表还是个散列表,拿来给我,我就让你遍历
2.2 使用方式:
首先要获取该集合的迭代器对象 Iterator it = 集合对象.iterator();
然后使用迭代器的三个方法:
boolean hasNext() : 判断下一位是否还有元素,如果有就返回true,没有就返回false
E.next :获取下一个元素,并指向下一个元素
remove() ; 删除当前指向的元素
//创建一个链表对象
Collection c1 = new LinkedList() ;
c1.add(1) ;
c1.add("abc") ;
//判断是否包含元素
System.out.println(c1.contains(1)) ;
//创建迭代器
Iterator it = c1.iterator() ;
//遍历 判断下一个位置是否有元素
while (it.hasNext()){
//获取并指向下一个元素
Object obj = it.next() ;
System.out.println(obj) ;
//使用迭代器的时候,不能更改集合,
//所以删除和添加数据的时候不能用集合的remove方法
//需要用Iterator的remove方法
//c1.remove(obj) ;
it.remove() ;
}
2.3 使用迭代器时的注意事项:
迭代器一旦创建,集合中就不鞥添加和删除元素了,如果添加和删除,那么迭代器必须重新生成
3.数组 ArrayList
3.1 List的特点
List特点:有序,可重复
有序:数据添加的顺序和取出的顺序是一致的
可重复数据:就是说数据可以有重复的
ArrayList:底层是个Object数组,随机查询和更改效率高,但是添加和删除慢
LinkedList:底层是双向链表,添加和删除快,但是随机查询更改效率低
3.2 ArrayList是什么
底层是数组,下标从0开始
默认初始化容量为10,扩大的容量为原始容量的1.5倍
这个默认初始化容量是我们第一次往里面方数据的时候才创建的,和StringBuilder不一样,sb是创建了不放数据就有初始化容量了
3.3 基本使用
List list = new ArrayList() ;
这里直接创建List的变量即可,因为有时候我们也可能用到LinkedList,这样就不用更改类型了
打印list后,显示为一个[xxxx,xxxx,xxx]这是因为List的toString方法被覆写了
3.4 常用方法
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(int index):根据下标删除
//remove(Object obj):根据元素内容删除
//get(int index) : 获取指定位置的数据
list.add(1,4) ;
list.set(3, 33) ;
System.out.println(list.get(2)) ;
//这是根据索引删除
list.remove(1) ;
//删除元素值为1
list.remove(new Integer(1)) ;
System.out.println(list);
3.5 三种遍历方式
//垃圾for循环遍历
for(int i = 0;i<list.size() ;i++){
System.out.println(list.get(i)) ;
}
//foreach遍历
for(Object obj:list){
System.out.println(obj);
}
//迭代器遍历
Iterator it = list.iterator() ;
while(it.hasNext()){
System.out.println(it.next()) ;
}
4.链表 LinkedList
4.1 LinkedList是什么
就是个双向链表,有序,可重复数据,
常用方法和ArrayList基本一样
4.2 底层实现
4.3 LinkedList类
4.4 add方法的实现
4.5 Get方法实现
获取数据
Get方法 只是模拟了下标获取数据的方式,本质就是遍历,从头挨个去找
所以这可以理解为 并不是下标,只是决定了循环次数
而 ArrayList的get才是根据下标获取