如鹏网JAVA培训笔记30晓伟整理.docx
- 文档编号:9975308
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:17
- 大小:1.21MB
如鹏网JAVA培训笔记30晓伟整理.docx
《如鹏网JAVA培训笔记30晓伟整理.docx》由会员分享,可在线阅读,更多相关《如鹏网JAVA培训笔记30晓伟整理.docx(17页珍藏版)》请在冰豆网上搜索。
如鹏网JAVA培训笔记30晓伟整理
写在前边的话:
2015年2月4日如鹏线上训练营第四十二天
年轻人不要随便否定自己的价值!
在这个城市,总有那么一些人,习惯否定自己,充满了挫败,抑郁。
看不到自己的价值,这也不好,那也不好。
然后羡慕别人的好或者幻想着一种理想的状态发呆。
我曾今是其中的一个,在北京挣扎,找不到方向,找不到出路,更找不到价值。
每月领着两千块的薪水,不敢随便请人吃饭甚至不敢轻易吃肉,更不敢去谈朋友。
在理想面前,所有的现实生活都很奢侈。
更可怕的是,没有阅历没有能力没有任何积累,而最让自己难受的,则是性格懒散不思进取不够努力,许久来却没有一丝改变的迹象。
我们身上每样东西都是资源,只是看到的角度却不一样。
有的人会因为胖而自卑,有的人则会称自己“唐朝美人”,后者更容易招人喜欢。
有的人会阻抗自己不善言辞不善交际,有的人则欣赏自己的文静和羞涩,后者就懂得欣赏自己。
有的人会痛恨自己太固执失去了太多机会,有的人则欣赏自己的坚持。
我们都是半杯水,没有人会一满杯。
有空的部分,也有有的部分。
看到什么,则就有什么。
TreeSet:
内部数据结构:
二叉树(二叉树的元素在存入到树种时就已经排序了)
●TreeSet内部实际上是一个二叉树,父节点的左孩子节点比父节点小,右节点比父节点大
●添加元素时,需要进行一系列的比较,先和根节点比较,如果比根结点小,继续和根结点的左孩子比较,否则,和有孩子比较,重复此过程直到没有可以比较的元素
●当两个元素比较时相同,添加失败!
TreeSet:
各种操作效率分析
●遍历:
每种集合的遍历都是从前到后依次取出每个元素,效率都相同。
●添加:
由于采用了二叉树结构,添加操作只需要定位位置,效率很快。
●删除:
由于采用二叉树结构,删除操作只需要定位位置,效率很快。
●获取:
Set集合无法直接获得某个元素,只能遍历的取出所有元素(无索引值,只能通过通过一一遍历了)
在向TreeSet添加数据的时候,已经实现了数据由小到大的排序(利用排序性)
存在的两个问题:
●有这样一种情况,有一个List集合对象,我们只希望这个集合对象只用来存储String类型的元素,但实际上这个集合是可以存储任意类型的元素的,那么这时候我们把所有元素当做String来处理就可能会出现错误。
●还有一种情况,我们从集合对象中取出元素后得到的是Object类型的对象,这时候我们就必须使用显示类型转换,把取得的元素对象转换为需要的类型,每次都进行转换操作很麻烦。
解决办法:
采用泛型!
泛型机制:
●泛型javaSE1.5的新特性,泛型的本质是参数化类型,也就是说一个类操作的另外一个类被指定为一个参数,就像方法的参数一样。
在使用时传递具体的类型值,那么这时就明确了这个类所操作的另外一个类的类型了。
通常使用
(代表任意类型)
●泛型的语法:
在声明类时一同声明泛型
classDemo
Demo
●这种参数类型可以声明在类、接口和方法的定义中,分别称为泛型类、泛型接口、泛型方法。
//创建泛类方法
public
{
return("HelloWorld!
");
}
//泛型接口
interfaceInter
{
voidshow(Tt);
}
//使用一个类,实现泛型接口
classInter2implementsInter
{
publicvoidshow(Stringt)
{
System.out.println(t);
}
}
●使用泛型的步骤:
1.定义泛型类2.使用泛型类
●好处:
安全、把运行时发生的异常提前到编译时期,
简单,不需要进行显示类型转换
●泛型不协变:
List
结果为:
HelloWorld!
abc
●向后兼容:
Listlist=newArrayList
泛型:
●类型通配符:
>(任意类型)这个?
相当于Object,Integer,String等,可以用来给
注:
只在泛型具体化的时候使用,为参数传具体参数值,不在泛型定义的时候使用
List
>list=newArrayList
List
>list=newArrayList
●有限制泛型:
在声明泛型的时候,给这个可以接受的类型一个约束,比如:
classDemo
Integer,Double,float,byte等。
☉
☉
superStudent>super指定Student是下限,说明
Student这个类是个下限,?
可以接受Student及其父类。
☉
ExtendsCollection>类型通配符和限制泛型合作,使得可以使用addAll方法将Collection
classDemo
DemolistDemo=newDemo
();
Demo
Demo
ExtendsCollection>demo=newDemo
Demo
>demo=newDemo
集合的泛类操作:
JDK1.4以前:
●装入集合的数据都会被当做Object对象来存放,从而失去了自己的实际类型
●从集合中取出元素时,需要进行强制类型转换。
效率低,容易产生错误。
●JDK5.0之后,可以用泛型来解决这个问题:
⊙在定义一个集合时就指定集合存储的对象的数据类型
eg:
Collection
⊙从集合中取出元素时,无需转型了。
eg:
Stringstr1=it.next();
●优点:
简化集合的使用,增强代码的可读性和稳定性。
泛型:
●泛型的作用和意义:
⊙可以将泛型理解为“占位符”:
在定义的地方,用一个
来表示某个值,这个值的类型未知(当然值也未知),而在后面用到
⊙它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处。
⊙ArrayList
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)
{
//是对
可以避免使用
但
>不能造型,不能使用子类中的特定方法。
}
staticvoiddieDai(Collection
>a)
{
//是对
可以避免使用
但
>不能造型,不能使用子类中的特定方法。
}
Map
●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
{
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时讲解。
eg:
(内部是:
键值对)
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集合,而且必须已经排好序
sort、binarySearch是配合着使用的
fill方法:
使用指定元素填充List集合
replaceAll方法:
使用指定元素替换所有的另一个元素,只对List有效,(Set集合元素是不重复,唯一的,对Set集合进行替换没有意义)
max方法:
返回一个集合中最大的元素
min方法:
返回一个集合中最小的元素
shuffle:
洗牌,打乱集合元素的顺序
synchronizedList:
返回指定集合的线程安全的包装集合
unmodifiableList:
返回指定集合的不可修改的包装集合
●Arrays:
提供了一些专门用来操作数组工具方法:
sort:
给数组的元素排序
binarySearch:
二分查找法查找元素
copyOf:
数组复制
equals:
判断两个数组的元素是否相等
fill:
填充数组
hashCode:
计算数组的元素的哈希值
toString:
返回每个数组元素组成的字符串
asList:
把数组转化为结构不可变化,但可以查询的集合
Map
Map<学生id,Map<课程名,Map<年份,成绩>>>
Jdk1.5新增特性:
增强for循环:
所有的集合类以及数组都可以使用
格式:
for(Typep:
types){......}
特点:
只能进行遍历操作,不能进行添加删除等操作
好处:
使集合遍历操作更简洁
作业需求:
保存所有学生所有学科所有学年的成绩,请设计一个数据结构可以满足此需求(提示:
可以嵌套Java集合框架的集合类,如Map
答案为:
Map
Map<学生id,Map<课程名,Map<年份,成绩>>>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如鹏网 JAVA 培训 笔记 30 整理