Collection
List: 元素有序,可重复
ArrayList
Vector
LinkedList
Set:元素无序,唯一
HashSet
TreeSet
一、ArrayList
1、去除ArrayList中重复字符串元素方式
["aa", "bb", "cc", "aa", "aa", "dd", "aa"]
定义新集合的方式:
定义一个新的ArrayList集合;
遍历旧集合,获取到每一个元素,将其添加到新集合,
在添加之前做判断,判断新集合是否已经包含了该元素,如果不包含,才添加。
2、去除ArrayList中重复自定义对象元素
思路与上面相同。
注意事项:contains方法底层依赖元素所属类的equals方法,所以去重写equals方法,实现具体属性值的比较。
补充练习1:
去除ArrayList中所有的指定元素。
ArrayList al = new ArrayList();
al.add("aaa");
al.add("aaa");
al.add("aaa");
al.add("bbb");
al.add("ccc");
al.add("aaa");
al.add("aaa");
al.add("ccc");
需求:去除所有的字符串“aaa”
实现方式1:
列表迭代器遍历集合,并使用列表迭代器删除匹配的元素
实现方式2:
用普通for循环正向遍历集合,一旦删除元素,循环索引--,保证元素全部能遍历到。
实现方式3:
用普通for循环倒着遍历集合,删除匹配的元素。这样不会有遗漏。
。。。(多种方式,欢迎思考)
练习2:
有一个存储字符串的ArrayList集合,请删除集合中包含数字字符的元素。(提示:.*\\d.*)
二、LinkedList
1、LinkedList的特有功能
void addFirst(Object obj) -- 添加到开头
void addLast(Object obj) -- 添加到结尾
Object removeFirst() -- 删除第一个元素,并返回
Object removeLast() -- 删除最后一个元素,并返回
Object getFirst() -- 获取第一个元素
Object getLast() -- 获取最后一个元素
2、栈和队列数据结构
栈:后进先出(LIFO表)
队列:先进先出(FIFO表)
3、用LinkedList模拟栈数据结构的集合并测试
要提供自定义的类,实现元素的添加和删除等功能,这些功能要符合栈的结构特点。
而底层采用谁来实现,那是你自己的事了,我不关心。而这个案例恰好可以用LinkedList来实现。
注意事项:不要把自定义的类起名字为Stack。API上有。
三、泛型
1、泛型(generic)概述和基本使用
泛型把明确数据类型的操作放到创建对象或者调用方法的时候再明确。
JDK1.5之后的新特性。
格式:
<引用数据类型>
好处:
泛型保证集合中的数据类型一致,提高安全性。把运行期异常提前到编译期。
那么在JDK1.5之前怎么实现参数的任意化呢?
是通过接收Object类型的参数实现的。因为任意类直接或间接继承自Object。
但这样实现的缺点就是,还是不能保证数据类型的安全一致。
Object obj1 = new Student();
Object obj2 = new Teacher();
上面两个对象都声明为Object类型,那获取元素的时候到底该如何转型呢?还是存在问题。
应用:
泛型类
泛型接口
泛型方法
2、ArrayList存储字符串和自定义对象并遍历泛型版
3、泛型的由来
补充:泛型擦除
查看下述两个方法:
public void show(ArrayList<String> list) {}
public void show(ArrayList<Integer> list){}
/*
* 上述两个方法是不会形成方法的重载的,会报方法已存在的错误。 原因:泛型擦除
* 泛型是1.5中引入的一个新的概念,由于不用进行强制转换类型了,所以具有较高的安全性和易用性。
* 因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型
* ,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。
* 擦除是将泛型类型以其父类代替,如String变成了Object等。
* 其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。
*/
4、泛型类的概述及使用
明确数据类型的工作放到了创建对象的时候
5、泛型方法的概述和使用
明确数据类型的工作放到了调用方法的时候
方法泛型 <> 加在返回值前面。
6、泛型接口的概述和使用
一种是子类实现接口的时候明确数据类型
interface Fu<T>{}
class Zi implements Fu<String>{}
一种是子类继续使用泛型:
class Zi<T> implements Fu<T>{}
7、泛型高级之通配符
<?> -- 泛型通配符
<? extends E> -- 向下限定,接收E及其子类类型
<? super E> -- 向上限定,接收E及其父类类型
原理:多态。 -- 父类引用指向子类对象。 Fu fu = new Zi();
四、集合加强
1、增强for的概述和使用(foreach)
格式:
for(数组或者Collection集合中元素类型 变量名 :数组或者Collection集合对象){
//直接使用变量名即可
}
注意:增强for底层是迭代器实现的,不要使用增强for的同时用集合改变结构,会报并发修改异常。
2、ArrayList存储自定义对象并遍历增强for版
3、三种迭代的能否删除
a.普通for正向遍历,可以删除,但要注意,一旦删除了元素,索引要减1.
for(int i = 0; i < list.size();){
if("b".equals(s)){
list.remove(i);
continue;
}
i++;
}
b.迭代器遍历,也可删除,但是注意要使用迭代器的删除方法。
c.增强for遍历时,不能删除元素。
4、静态导入的概述和使用
对于静态方法,导入到方法的级别
格式:
import static 包名.类名.方法名;
5、可变参数的概述和使用
适用于参数类型明确但个数不确定的情况。
注意:方法里面有多个参数,那么可变参数必须放到最后。
6、Arrays工具类的asList()方法的使用
数组转换成集合; -- Arrays工具类的功能
public static <T> List<T> asList(T... a)
转成集合后大小固定,不支持增加或者删除操作。
引用数据类型数组 -- 把数组中的元素作为集合中的元素。
基本数据类型数组 -- 把数组对象作为一个元素添加到了集合中。
集合转数组: -- Collection
Object[] toArray() -- 把集合转换成Object[]
<T> T[] toArray(T[] a) -- 把集合转换成指定数据类型(必须是集合中的元素类型,否则报异常)的数组
-- 如果数组长度小于等于集合,那么返回数组的长度是集合的长度
-- 如果数组长度大于集合,那么返回的数组长度是指定的长度,前面保存集合中的元素,后面存储的是null。
7、集合嵌套之ArrayList嵌套ArrayList
// 创建学科集合对象
// 创建班级1集合对象
// 创建几个学生对象放进班级1
// 创建班级2集合对象
// 创建几个学生对象放进班级2
// 把班级1和2放进学科集合对象
// 遍历
// 遍历学科对象得到的是每一个班级集合
// 遍历每一个班级集合得到的是每一个学生
|
|