Java IDEA学习之路:第五、六周课程笔记归纳
集合【开发的重点**】
一、概念
1. 集合:是一种工具,也是一种容器,用于存储数量不等的多个对象。
2. 集合相关的接口和类位于 java.util 包中。
3. 学习集合从以下 4个点入手:
(1) 集合接口的特点
(2) 集合接口中功能方法
(3) 集合接口对应的实现类
(4) 集合的遍历方式
二、Collection集合体系
1. 父接口:Collection接口
(1) 特点:存储任意类型Object对象。
(2) 方法:
a. boolean add(Object o):将o对象添加到集合中。【开发重点】
b. boolean contains(Object o):判断当前集合中是否包含 o元素,包含-true;否则-false.
c. boolean remove(Object o):将 o对象从当前集合中移除、删除。
d. int size() : 获取集合中有效元素的个数
(3) 实现类:没有直接的实现类,详见子接口。
(4) 遍历:详见子接口。
2. 子接口:List接口
(1) 特点:存储任意类型的Object对象,有序、有下标、元素允许重复。【基础重点】
下标的范围: 0 ~ 有效元素个数 - 1
(0 ~ size - 1)
(2) 方法:部分继承于父接口 Collection接口,其余为定义的方法:
a. boolean add(Object o):将元素存储到List集合,默认存储在集合的尾部。【重点】
b. add(int index,Object o):将指定的元素插入到集合对应的下标位置。
c. Object get(int index):返回指定下标对应集合元素。
d. Object remove(int index):删除指定下标对应的元素,返回值代表被删除的对象。
e. Object set(int index , Object o):将指定下标对应元素进行修改,修改为o对象。返回值代表被修改之
前的元素。
(3) 实现类:ArrayList,底层用数组实现的
a. ArrayList:底层数组实现的,查询操作时效率较高,增删操作效率较低。
JDK2.0版本,线程不安全,运行效率较高。
注意:JDK1.7版本,创建ArrayList对象时,并没有完成数组空间分配,而是第一次往集合中存储
元素(add方法时),才完成数组空间分配,数组的初始长度为10,每次扩充为1.5倍。
b. Vector: 底层数组实现的,查询操作时效率较高,增删操作效率较低。
JDK1.0版本,线程安全,效率较低。
c. LinkedList:底层链表实现,查询操作时效率较低,增删效率较高。
线程不安全,运行效率较高。
面试题目:写出ArrayList 和 LinkedList区别?
(4) 遍历:将集合中元素进行一一的访问。
a. 下标遍历:通过集合中的下标对集合元素进行一一访问
for(int i=0;i<集合名.size(); i++){
// 通过下标 i ,获取集合中每一个元素: get方法
}
b. forEach遍历:【开发应用重点】
for(数据类型 变量名 : 要遍历的集合名) {
// 直接利用变量名操作集合元素即可
}
注意:变量的数据类型取决于集合的泛型类型。
forEach遍历的底层原理:迭代器遍历
I. 获取迭代器对象:
Iterator it = 集合名.iterator();
II. 迭代器中方法:
① hasNext() : 判断迭代器中是否还有要操作的元素,有-true;没有-false。
② Object next() : 调用一次,返回迭代器中的下一个元素。
III.迭代器的遍历方式:
Iterator it = 集合名.iterator();
// 遍历迭代器
while(it.hasNext()){
// 通过next方法获取迭代器中下一个元素
System.out.println(it.next());
}
3. 泛型
(1) 泛型集合:安全性的集合,可以对集合中数据统一管理,并且强制约束集合的元素类型一致。【重点】
List<数据类型> 集合名 = new ArrayList<数据类型>();
(2) 泛型类:
a. 语法:
class 类名<泛型标识1,泛型标识2>{
// 将 泛型标识作为数据类型应用
}
注意:通常用:K/V/E/T等作为泛型标识。
b. 应用:在创建对象时,需要制定泛型的数据类型。
类名<数据类型> 对象名 = new 类名<数据类型>();
注意:前后数据类型要一致;
基本数据类型不能作为泛型的类型,需要应用基本数据类型对应的包装类型;
如果创建对象时,没有指定泛型的类型,则默认为Object类型;
如果定义类型有多个泛型标识,要么按顺序指定所有的泛型数据,要么都不指定。
4. 集合工具类:Collections
(1) Collections:用于操作集合元素的工具类,类中提供了大量的静态方法用于操作集合元素,例如元素排
序、倒置等操作。
(2) 常用的方法:
a. static void reverse(List list):将集合中元素进行倒置。
b. static void shuffle(List list):对集合中元素进行随机显示。
c. static void sort(List list): 对集合中元素进行排序。
注意:如果参与排序的集合中元素为自定义类型的对象,则对应的类需要实现
java.lang.Comparable接口,同时实现接口中compareTo方法,指定排序规则。
I. 第一种比较器 java.lang.Comparable接口,接口中有一个 int compareTo(T t) ,将当前对象this
和 t 进行比较,参与比较的对象对应的类需要实现此接口,同时实现此方法。-》内置比较器
II. 第二种比较器: java.util.Comparator 接口,接口中定义了 int compare(T o1, T o2) ,将o1和o2进
行比较,定义在参与比较对象的类的外面。 ---》外置比较器
a. 自定义类型的对象存储在HashSet中,如何保证 HashSet元素内容不重复?
i. 覆盖 hashCode方法
原则:必须保证相同内容的对象返回相同的哈希码值,为了提高效率,尽可能的做到,不同内容的
对象返回不同的哈希码值
覆盖准则:通常将所有的属性拼凑为一个 int 类型的结果进行返回。
案例: public int hashCode(){
return this.name.hashCode()+this.age.hashCode(); // age 包装类型
}
ii. 覆盖 equals方法
必须保证相同内容的对象返回true -> 拒绝添加到HashSet集合中。
b. HashSet保证元素不重复执行的原理:对象往HashSet集合中存储时,当前对象调用自身hashCode方
法,获取哈希码值,从而获取对应存储下标,如果存储下标上没有存储任何元素,则当前对象直接存
储,但是如果存储下标上已经有存储了其他对象,则调用equals方法,进行比较对象的内容是否相
同,equals方法的结果为true,代表相同内容的对象,则HashSet集合拒绝添加,equals方法结果为
false,则代表内容不同的对象,则成功添加到HashSet集合中。
(4) 遍历方式:forEach(底层原理迭代器遍历)
(5) SortedSet:是 Set的子接口,无序、无下标、对元素内容进行排序。【了解】
a. 常用的实现类TreeSet
注意:如果自定类型的对象存储在TreeSet中,需要实现 java.lang.Comparable 接口,同时实现:
compareTo方法,方法中指定排序的规则。compareTo返回值结果如果为0,则TreeSet视为
相同内容的对象。(TreeSet去除重复内容的对象,利用compareTo返回值,结果为0,相同对
象)
(6) LinkedHashSet:按照添加顺序进行集合元素存储,同时元素内容不允许重复。
注意:LinkedHashSet是 HashSet的子类,所以如果自定类型的对象存储在LinkedHashSet中,
为了保证元素内容不重复,则需要对象对应的类覆盖 hashCode方法 和 equals方法(要求
和 父类HashSet一致)。