java基础知识点10(Collection,增强for,泛型,数据结构)
1.1 Collection的接口体系
1.2 Collection的常见方法
Collection是所有单列集合的根接口
常见方法:
(常用)public boolean add(E e) : 把给定的对象添加到当前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e) : 把给定的对象在当前集合中删除。
public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。
public boolean isEmpty() : 判断当前集合是否为空。
(常用)public int size() : 返回集合中元素的个数。
public Object[] toArray() : 把集合中的元素,存储到数组中
?
Collection是一个接口,如果要用,需要使用实现类,最常用的实现类是ArrayList
1.3 增强for循环
01 增强for遍历数组
格式: for (数据类型 变量名 : 容器) { ... } 格式解释: 数据类型:要遍历的容器中保存的是什么类型的数据,这个数据类型就写什么。 变量名: 表示容器中的每一个元素。 容器: 要遍历的容器,可以是数组,也可以是集合。
使用增强for遍历数组
增强for是一种语法糖,语法糖指的是本质没有变,只不过写法更加的简洁了。 增强for遍历数组,本质还是使用的
普通for循环
。
02 使用增强for遍历集合
格式: for (数据类型 变量名 : 集合) {}
注意: 增强for遍历集合,本质使用的是
迭代器遍历
。增强for的好处和缺点: 好处: 写法简洁,省去了对索引的操作。 缺点: 因为省略了索引,所以无法再遍历的过程中操作索引。如果要在遍历过程中操作索引,还是需要使用普通for循环。
1.4 泛型
泛型是一种未知的,不确定的数据类型。
泛型也可以省略,如果省略泛型相当于泛型是Object
泛型之间是没有继承关系的。 比如:ArrayList
如果在定义类的时候,类名后面写上
,就表示在类的范围内定义了一个泛型类型T(不确定的数据类型T) 这种未知的类型T等到我们使用这个类的时候就会被确定出来。
这个T可以使用其他字母代替。
泛型好处:
省略了向下转型的代码。
将运行时期的问题提前到了编译时期。
泛型擦除
Java中的泛型都是伪泛型,泛型只在源代码阶段有效,一旦编译,泛型就会消失。
泛型方法
泛型方法的定义格式: 修饰符 <泛型> 返回值类型 方法名(参数列表) { 方法体; return 返回值; } 在方法上定义的泛型,需要等到调用方法的时候才能确定。
public class Factory<T> {
/*
定义方法,接收什么类型的参数,就得到什么类型的结果
*/
public <E> E getSame(E e) {
return e;
}
}
泛型通配符
如果想要接受任何类型类型的泛型,可以使用泛型通配符 ?表示泛型通配符,可以匹配任何类型的泛型。
泛型通配符要放在方法参数位置被动匹配, 不要主动使用。
泛型限定
如果限制泛型通配符的取值范围,那么可以使用泛型限定。
格式:
<? extends A>:泛型要么是A类,要么是A类的子类。 上限。
<? super A>: 泛型要么是A类,要么是A类的父类。 下限。
1.5 数据结构
栈
特点:先进后出(FILO)
队列
特点:先进先出(FIFO)
数组
特点:查询快,增删慢
为什么查询快
因为数组在内存中是连续存储的(也就是数组中的元素是相邻的),可以根据数组的首元素的地址值算出其他元素的地址值
为什么增删慢
因为数组定长,如果要进行增删操作,需要创建新的数组
ArrayList内部是在使用数组保存数据。
链表
链表是由多接点组成,每个节点至少包含两个东西
1 存储的数据 ,2 指向下个节点的地址
特点:查询慢,增删快
为什么查询慢
链表在内存中是离散存储的,链表中的节点在内存中是没有规律的,如果要找到某个节点,必须先找到他的上一个节点
为什么增删快
进行增删操作时,修改地址值即可