如鹏网JAVA培训笔记30晓伟整理Word下载.docx
《如鹏网JAVA培训笔记30晓伟整理Word下载.docx》由会员分享,可在线阅读,更多相关《如鹏网JAVA培训笔记30晓伟整理Word下载.docx(17页珍藏版)》请在冰点文库上搜索。
由于采用了二叉树结构,添加操作只需要定位位置,效率很快。
●删除:
由于采用二叉树结构,删除操作只需要定位位置,效率很快。
●获取:
Set集合无法直接获得某个元素,只能遍历的取出所有元素(无索引值,只能通过通过一一遍历了)
在向TreeSet添加数据的时候,已经实现了数据由小到大的排序(利用排序性)
存在的两个问题:
●有这样一种情况,有一个List集合对象,我们只希望这个集合对象只用来存储String类型的元素,但实际上这个集合是可以存储任意类型的元素的,那么这时候我们把所有元素当做String来处理就可能会出现错误。
●还有一种情况,我们从集合对象中取出元素后得到的是Object类型的对象,这时候我们就必须使用显示类型转换,把取得的元素对象转换为需要的类型,每次都进行转换操作很麻烦。
解决办法:
采用泛型!
泛型机制:
●泛型javaSE1.5的新特性,泛型的本质是参数化类型,也就是说一个类操作的另外一个类被指定为一个参数,就像方法的参数一样。
在使用时传递具体的类型值,那么这时就明确了这个类所操作的另外一个类的类型了。
通常使用
<
T>
表示泛型。
(代表任意类型)
●泛型的语法:
在声明类时一同声明泛型<
表示一个参数化类型,在声明类变量和实例化类对象时,需要给泛型参数传递一个具体的类型值,比如:
classDemo<
{}(在声明类时一同声明泛型)
Demo<
String>
demo=newDemo<
();
(传递具体类型值)
●这种参数类型可以声明在类、接口和方法的定义中,分别称为泛型类、泛型接口、泛型方法。
//创建泛类方法
public<
StringsayHello(Tt)
{
return("
HelloWorld!
"
);
}
//泛型接口
interfaceInter<
{
voidshow(Tt);
}
//使用一个类,实现泛型接口
classInter2implementsInter<
publicvoidshow(Stringt)
System.out.println(t);
}
●使用泛型的步骤:
1.定义泛型类2.使用泛型类
●好处:
安全、把运行时发生的异常提前到编译时期,
简单,不需要进行显示类型转换
●泛型不协变:
List<
Object>
list=newArrayList<
();
是不正确的(不具有继承关系的,泛型类型具体实现时必须相同)
结果为:
abc
●向后兼容:
Listlist=newArrayList<
是正确的
泛型:
●类型通配符:
?
>
(任意类型)这个?
相当于Object,Integer,String等,可以用来给<
赋值表示T的类型值是任意的
注:
只在泛型具体化的时候使用,为参数传具体参数值,不在泛型定义的时候使用
Integer>
●有限制泛型:
在声明泛型的时候,给这个可以接受的类型一个约束,比如:
TextendsNumber>
{}表示Demo类只能操作数值类型的对象,如:
Integer,Double,float,byte等。
☉<
TextendsCollection>
extends指定Collection是上限
superStudent>
super指定Student是下限,说明
Student这个类是个下限,?
可以接受Student及其父类。
ExtendsCollection>
类型通配符和限制泛型合作,使得可以使用addAll方法将Collection<
的内容添加到Collection<
Number>
classDemo<
{}
List>
listDemo=newDemo<
list>
Set>
setDemo=newDemo<
集合的泛类操作:
JDK1.4以前:
●装入集合的数据都会被当做Object对象来存放,从而失去了自己的实际类型
●从集合中取出元素时,需要进行强制类型转换。
效率低,容易产生错误。
●JDK5.0之后,可以用泛型来解决这个问题:
⊙在定义一个集合时就指定集合存储的对象的数据类型
eg:
Collection<
coll=newArrayList<
⊙从集合中取出元素时,无需转型了。
Stringstr1=it.next();
●优点:
简化集合的使用,增强代码的可读性和稳定性。
●泛型的作用和意义:
⊙可以将泛型理解为“占位符”:
在定义的地方,用一个<
E>
来表示某个值,这个值的类型未知(当然值也未知),而在后面用到<
的地方,都是同一样东西
⊙它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处。
⊙ArrayList<
al=newArrayList<
al.add(“hahaha”);
al.add(newDate());
//编译时提示错误
Iterrator接口:
●所有实现了Collection接口的集合类有一个iterator()方法用以返回一个实现了Iterator接口的对象。
●Iterator接口的操作原理:
Iterator是专门的迭代输出借口。
所谓的迭代输出就是将元素进行判断,判断是否有内容,如果有内容则把内容取出。
●Iterator对象称作迭代器,用以方便实现对集合内元素的遍历操作。
iterator()只能删除,不能添加、修改
●Iterator接口定义如下:
booleanhasNext();
//判断游标右边是否有元素
Objectnext();
//返回游标右边元素并将游标移动到下一个位置
voidremove();
//删除游标左边的元素
泛型高级:
●自定义泛型和受限制的泛型目的是:
在自定义类时,就说明在使用类中的某个方法的时候,参数(或返回值)要使用一些类型(或其子类型)
●当希望定义一个变量去接受某个类型或者其子类型时可以这样声明:
需要注意,一个static方法,无法访问泛型类的类型参数,所以,若要static方法需要使用泛型能力,必须使其成为泛型方法。
受限制的泛型:
●让类型参数继承一个类或者实现接口
//限制了T必须是List或者它的子类型
staticvoiddieDai(Collection<
a)
//是对<
的一种简化,如果是方法上定义的泛型,用?
可以避免使用<
在方法头部。
但<
不能造型,不能使用子类中的特定方法。
Map<
K,V>
定义了两个泛型:
●key(键),value(值)操作一对(键值对)
Map没有Iterator方法,只能通过其他方法进行遍历
HashMap的数据结构和特点:
●数据结构:
元素为Map.Entry对象的哈希表,和HashSet相似。
●特点:
⊙由于Map把key和value封装了Entry对象中,所以并不会对key和value直接操作,故key和value可以为null
即Map可以存储null值
⊙在Map的设计目录上,是用来通过key找到value,所以在一个Map中key的值是不能重复的,但value可以重复。
⊙因为内部结构为哈希表,所以添加删除查询等操作都很快。
(内部存储的是键值对)
⊙由内部结构决定了HashMap不能直接遍历,需要使用Set集合的遍历方式进行遍历,所以就有了keySet(),values(),
entrySet()三个方法,其中keySet(),values()是依赖entrySet()的。
Entry(inth,Kk,Vv,Entry<
n)
value=v;
next=n;
key=k;
hash=h;
HashSet内部结构是HashMap,因此HashSet是在HashMap基础上获取的
TreeMap的结构和特点:
(利用其排好的顺序)
●和TreeSet相似,TreeMap内部也是一个二叉树结构,只是二叉树的元素类型是Map.Entry
特点:
1.由于是二叉树结构,所以元素在存储时候已经排序了
2.由于是二叉树结构,TreeMap的添加删除查找等都很快。
publicstaticinterfaceMap.Entry<
映射项(键-值对):
Map.entrySet方法返回映射的collection视图,其中的元素属于此类。
获得映射项引用的唯一方法是通过此collection视图的迭代器来实现。
这些Map.Entry对象仅在迭代期间有效;
更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过setValue在映射项上执行操作之外。
HashTable和Properties:
●HashTable是jdk老版本的遗留类,内部也是哈希表,因为是线程安全的,所以各种操作都相对较慢,已经被HashMap替代,现在几乎不再使用,但需要知道这个类。
●HashTable还有一个子类Properties(配置文件)内部是键值对,具有集合的特点又可以进行文件的读写操作,会在讲javaIO时讲解。
(内部是:
键值对)
uername=zhangshan
password=123
Java集合框架的线程安全问题:
●java集合类的线程安全是指多个线程可以正确的同时对一个集合对象进行添加,删除等修改操作,但是这样就必须保证集合对象操作的同步,会导致效率降低,常见的线程安全的集合类有Vector,HashTable
●为了单个线程时操作的高效性,新的集合类如ArrayList,HashSet等没有集合方法进行同步,为了保证数据的安全,当多个线程对这些对象同时修改时,就会抛出异常。
Java集合框架的工具类:
●Collections(既然是工具类,方法全是静态的)
对Set及其子类(TreeSet、HashSet)不进行排序的
(List及其两个子类:
ArrayList和LinkedList)
sort、binarySearch是配合着使用的
sort:
只能对List集合及其子类(ArrayList和LinkedList)进行排序
binarySearch方法,使用二分查找法查找元素,要求必须是List集合,而且必须已经排好序
fill方法:
使用指定元素填充List集合
replaceAll方法:
使用指定元素替换所有的另一个元素,只对List有效,(Set集合元素是不重复,唯一的,对Set集合进行替换没有意义)
max方法:
返回一个集合中最大的元素
min方法:
返回一个集合中最小的元素
shuffle:
洗牌,打乱集合元素的顺序
synchronizedList:
返回指定集合的线程安全的包装集合
unmodifiableList:
返回指定集合的不可修改的包装集合
●Arrays:
提供了一些专门用来操作数组工具方法:
给数组的元素排序
binarySearch:
二分查找法查找元素
copyOf:
数组复制
equals:
判断两个数组的元素是否相等
fill:
填充数组
hashCode:
计算数组的元素的哈希值
toString:
返回每个数组元素组成的字符串
asList:
把数组转化为结构不可变化,但可以查询的集合
String,Map<
Integer,Double>
学生id,Map<
课程名,Map<
年份,成绩>
Jdk1.5新增特性:
增强for循环:
所有的集合类以及数组都可以使用
格式:
for(Typep:
types){......}
特点:
只能进行遍历操作,不能进行添加删除等操作
好处:
使集合遍历操作更简洁
作业需求:
保存所有学生所有学科所有学年的成绩,请设计一个数据结构可以满足此需求(提示:
可以嵌套Java集合框架的集合类,如Map<
String,List<
)
答案为:
Map<
Map<