- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1. 第十六天的回顾,集合是容器,专门存储对象,长度可变。顶层的接口Collection,下面所有的小弟,都具备顶层接口的方法。add size contains iterator。存储add方法,获取用的就是迭代器。List派系,重复,下标,有序。ArrayList:长度可变数组,线程不安全,每次增长原基础50%,查询快,增删慢
2. 第十七天的学习内容:List集合中的另外两个小弟,Vector LinkedList(实现结构,本身特点,自己的独有方法). 泛型技术:由来,实际的作用,好处,自定义泛型
3. ArrayList去掉重复对象,自定义对象
存储的是字符串,功能可以实现
存储的是Person,功能失败
原因在contains方法上,该方法根据什么,判断对象是否存在集合中。
判断因素是对象中的equals方法
String类,重写equals,建立了字符串自己的比较方法
Person类,重写equals方法,建立Person对象自己的比较方式,比较的是类中的姓名和年龄 name age.
contains方法实现的时候,自动调用集合中存储的对象的equals方法,如果equals方法返回真,判断集合中包含这个对象。否则不包含
4. Vector类
开始版本JDK1.0 , 升级到JDK1.2的时候,才出现了集合框架的概念。类Vector在JDK1.2版本后,改为实现List接口。类名不该呢 VectorList,版本的兼容性。
Vector类底层实现,也是可变数组,增长率100%,线程安全,运行速度慢
从JDK1.2版本开始,Vector被ArrayList取代
5. LinkedList类
特点和List接口,一致,重复,有序,下标
LinkedList底层实现原理:链表结构,查询慢,增删快,线程不安全,运行速度快
存储和取出,实现代码,和ArrayList完全一致
6. LinkedList特有方法
l 在列表的开头或者结尾添加元素 addFirst(Object o ) addLast(Object o)
l 获取列表的开头或者结尾Object getFirst() Object getLast()
l 移除列表的开头或者结尾Object removeFirst() Object removeLast()
l 以上的获取和移除,列表中是空的,出现没有元素被取出异常
在LinkedList中,1.6版本开始,添加了几个新的方法,来操作集合
l offerFirst() offerLast() 替换的了addFirst()addLast()
l Object peekFirst() ObjectpeekLast() 替换了 getFirst() getLast().如果集合中是空的,获取后返回null不会出现异常
l Object pollFirst() Object pollLast()替换了 removeFirst() removeLast().如果集是空的返回null,不会出现异常
7. 数据的存储结构队列和堆栈
堆栈:内存中的数据,先进去的,后出来
队列:内存中的数据,先进去的,先出来
特点:符合LinkedList类的特点,存储对象的时候,开头结尾,获取对象的时候,可以在开头和结尾获取。
使用LinkedList,模拟数据的先进后出,先进先出
8. 模拟堆栈和队列
用户方,不直接面对LinkedList,我们程序人员,把LinkedList中的功能实现,交给用户的是别的功能。
定义类,实现先进先出,先进后出,提供给用户
9. 泛型技术的由来
泛型是JDK1.5出现的安全机制
安全隐患出现,数据类型的问题,导致程序发生类型转换异常
1.5开发出了,泛型技术,解决程序中的安全问题
10. 泛型如何解决安全问题
泛型的出现,可以强制集合,存储指定的数据类型,其他类型不允许存储
如果指定集合只能存储String,其他类型是存不进来的
书写格式:通用格式
集合类<数据类型> 变量 = new 集合类<数据类型>();
强制集合存储指定的数据类型,如果数据类型不符号要求,编译失败
写泛型的时候,前后的类型一致
JDK7新特性,泛型前后自动匹配,后面的可以不写 , 空菱形语法
11. 泛型的好处
保证安全:将问题,由运行时期,提前到了编译时期
简化书写,代码量减少
使用泛型,避免了类型的强制转换
ArrayList<E> 源代码,E就是一个变量而已,在这个类的方法中,写了E,同一个变量。
传递什么值,就是什么值
ArrayList<String> array =new ArrayList<String>();
源代码中的E,就全部变成了,String
迭代器接口 Iterator<E> 方法next()返回值,也是E,如果迭代器中指定泛型是String类型,Iterator<String>next方法返回值,跟着变成了String类型
以后,如果你需要用一个类,发现类的右边写了一个尖括号<>写泛型了,指定具体的数据类型。存储基本数据类型,泛型写包装类
12. 泛型案例
集合存储Person,带泛型,迭代器的获取,带泛型,强制转换的避免
13. 自定义泛型
可以保证程序的安全性<>自定义泛型
写一个类(工厂类),创建对象,并返回对象,两种写法,有泛型和无泛型
体现出安全机制
14. 定义泛型类,泛型方法,泛型接口
泛型类:将泛型,定义在类上,如果类中的任何位置出现了个泛型,和类上的泛型是相同的。工厂类案例 E==定义了一个变量
泛型方法:跟随类的泛型走的。定义泛型不跟着类的走的.在方法的声明上,在返回值类型之前,定义泛型,这个泛型属于方法自己,不属于类上的泛型
静态泛型方法:不可以和类上的泛型相同,如果相同,出现静态不能访问非静态,自定义一个泛型,这个泛型只属于这个静态方法。静态方法的泛型,写在返回值类型前
泛型接口:接口上定义泛型,实现类实现接口不指定泛型,实现类实现接口的同时,就实现了泛型
ArrayList实现List接口
interfaceList<E>{} class ArrayList<E>implements List{}
不需要你亲自写泛型类,方法,接口,但是别人写的,你要能看懂就O了
15. Java泛型,假泛型
假泛型:写程序的时候,明确了泛型,编译的时候,数据类型不对,编译失败,但是编译后的class文件,字节码文件,发现根本没有泛型
C++,编译后obj,带泛型
16. 泛型的通配符
文件系统中,通配符 * 匹配任意的文件名,或者是后缀名 del *.* del *.java
定义方法,做集合的遍历,但是要求的是遍历任意的一个Collection下的子类集合
泛型中,有一个通配符号? 问号,匹配所有的泛型类型,好处方便遍历集合,弊端在于不能进行强转
17. 泛型的限定
抽象类中有一个案例,员工和经理,最终形成一个父类公司类
两个集合,一个存储员工对象,一个存储经理对象,一个方法遍历2个集合,遍历过程中,调用工作方法 job
泛型的限定问题,写泛型的时候,只需要确定子类,或者父类就可以使用泛型的限定,案例员工和经理,实现了限定操作,提高了安全性,避免了数据类型的强制转换
泛型上限限定 ?extends E 传递E类型 和E的子类
泛型下限限定 ?super E 传递E类型 和E的父类
18. 增强for循环
JDK1.5新特性:是一个简化书写的循环格式,前提是泛型技术。接口Iterable,凡是实现这个接口的类,都可以使用增强for循环进行遍历,包括数组。
有好处,就有弊端
好处:简化书写,方便遍历
弊端:想操作数组或者是集合中的元素是不行的,只能看不能摸
格式:
for(数据类型 变量 : 数组或者集合){
}