马士兵 J2SE第七章 容器 个人学习笔记.docx
- 文档编号:4624150
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:16
- 大小:1.42MB
马士兵 J2SE第七章 容器 个人学习笔记.docx
《马士兵 J2SE第七章 容器 个人学习笔记.docx》由会员分享,可在线阅读,更多相关《马士兵 J2SE第七章 容器 个人学习笔记.docx(16页珍藏版)》请在冰豆网上搜索。
马士兵J2SE第七章容器个人学习笔记
第七章.容器
1136
1图:
容器API类图结构图
1类:
Collection类
3知识点:
For,Generic(泛型),AutoBoxingandUnboxing.
6接口:
CollectionSetListMapIteratorComparable
重点比较
1.ArrayList与LinkedList区别(从数据结构考虑)与性能对比(读写数据)+Vector
1)ArrayList和Vector都是实现了基于动态数组的数据结构,其中Vector使用了synchronized方法(线程安全)通常性能上较ArrayList差;LinkedList基于链表的数据结构。
2)对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
a)这一点要看实际情况的。
若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。
但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。
4)查找操作indexOf,lastIndexOf,contains等,两者差不多。
5)随机查找指定节点的操作get,ArrayList速度要快于LinkedList。
a)这里只是理论上分析,事实上也不一定,ArrayList在末尾插入和删除数据的话,速度反而比LinkedList要快。
另外:
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
2.HashMap与HashTable是区别与性能对比
1)HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
2)HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
3)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
因为contains方法容易让人引起误解。
4)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。
5)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
6)Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
两句话总结:
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口.
HashMap=>不同步、允许空键值、效率高;
Hashtable=>同步、非空键值、效率略低
1.容器API
javaAPI所提供的一系列类的实例,用于在程序中存放对象
J2SDK所提供的容器API位于util包内
容器API的类图结构如图:
容器API
1.
Collection接口(一个一个的装):
定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
Set中的数据对象没有顺序并且不可以重复。
(两对象互相equals相等则重复)
SortedSet是一个按照升序排列元素的Set。
List中的数据对象有顺序并且可以重复。
2.Map接口(一对一对的装):
定义了存储“键(key)—值(value)映射对”的方法
SortedMap是一个按照升序排列key的Map。
2.Collection接口
Collection接口中所定义的方法:
例举1
2009-12-2120:
49:
57---------2010-3-2813:
10:
54
例举202_Collection_2.avicontainer\BasicContainer.java
importjava.util.*;
publicclassBasicContainer{
publicstaticvoidmain(String[]args){
Collectionc=newHashSet();
c.add("hello");
c.add(newName("f1","l1"));
c.add(newInteger(100));
c.remove("hello");//如果equals则去除
c.remove(newInteger(100));
System.out.println
(c.remove(newName("f1","l1")));
System.out.println(c);
}
}
classNameimplementsComparable{
privateStringfirstName,lastName;
publicName(StringfirstName,StringlastName){
this.firstName=firstName;this.lastName=lastName;
}
publicStringgetFirstName(){returnfirstName;}
publicStringgetLastName(){returnlastName;}
publicStringtoString(){returnfirstName+""+lastName;}
//重写equals方法
publicbooleanequals(Objectobj){
if(objinstanceofName){
Namename=(Name)obj;
return(firstName.equals(name.firstName))
&&(lastName.equals(name.lastName));
}
returnsuper.equals(obj);
}
publicinthashCode(){
returnfirstName.hashCode();
}
publicintcompareTo(Objecto){
Namen=(Name)o;
intlastCmp=
lastNpareTo(n.lastName);
return
(lastCmp!
=0?
lastCmp:
firstNpareTo(n.firstName));
}
}
注意:
1.重写equals方法必须重写hashCode方法(当一个类的某个对象当做索引(键),会使用hashcode方法)
2.两个对象互相equals则hashcode必须相等.
3.
publicbooleanequals(Objectobj){
if(objinstanceofName){
Namename=(Name)obj;
return(firstName.equals(name.firstName))
&&(lastName.equals(name.lastName));
}
returnsuper.equals(obj);
}
publicinthashCode(){
returnfirstName.hashCode();
}
3.Set接口
Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,且不可重复。
Set容器可以与数学中”集合”的概念想对应。
J2SDKAPI中所提供的Set容器类有HashSet,TreeSet等。
4.List接口类似数组(大小自动增加)
List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复。
List容器的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
J2SDK所提供的List容器类有ArrayList,LinkedList等。
例举
List常用算法:
类Java.util.Collections提供了一些静态方法实现了机遇List容器的一些常用算法。
voidsort(List)对List容器内的元素排序
voidshuffle(List)对List容器内的对象进行随机排序
voidreverse(List)对List容器内的对象进行逆序排序
voidfill(List,object)用一个特定的对象重写整个List容器
voidcopy(Listdest,Listsrc)将srcList容器内容拷贝到destList容器
intbinarySearch(List,Object)对于顺序的List容器,采用二分搜索法查找特定对象
例举
5.ArrayList
1)ArrayList:
我们可以将其看作是能够自动增长容量的数组。
2)利用ArrayList的toArray()返回一个数组。
3)Arrays.asList()返回一个列表。
4)迭代器(Iterator)给我们提供了一种通用的方式来访问集合中的元素。
6.Iterator接口(方便遍历)相当于指针、游标,每一种容器有自己的Iterator接口
例举
注意:
Iterator对象的remove方法是在迭代过程中删除元素的唯一安全方法
2010-3-2814:
44:
34-----2010-3-2820:
32:
23
知识点1:
JDK1.5增强For循环
7.Comparable接口2010-3-3013:
29:
46
实现了这个接口的类,他们之间的对象可以互相比较大小。
如何选择数据结构
衡量标准:
读的效率和改的效率
Array读快改慢
Linked改快读慢
Hash两者之间
8.Map接口
实现Map接口的类用来存储键----值对
Msp接口的实现类有HashMap和TreeMap等
Map类中存储的键---值对通过键来标识,所以键值不能重复
Objectput(Objectkey,Objectvalue);//将key的值改为value(如果存在key),并将对象返回
Objectput(Objectkey);//通过key找到value对象
Objectremove(Objectkey);//把key对应的value去掉
booleancontainsKey(Objectkey);//是不是包含key
booleancontainsValue(Objectvalue);//是不是包含value
intsize();//装了多少对对象
booleanisEmpty();//是不是空的
voidputAll(Mapt);//把另外一个Map里面的东西全部加进来
voidclear();//清除
知识点2:
自动打包解包(jdk1.5以后)AutoBoxingandUnboxing
打包:
自动将基础类型转换为对象
解包:
自动将对象转换为基础类型
例如:
Container\TestMap.java
importjava.util.*;
publicclassTestMap{
publicstaticvoidmain(Stringargs[]){
Mapm1=newHashMap();
Mapm2=newTreeMap();
//m1.put("one",newInteger
(1));
m1.put("one",1);
//m1.put("two",newInteger
(2));
m1.put("two",2);
//m1.put("three",newInteger(3));
m1.put("three",3);
//m2.put("A",newInteger
(1));
m2.put("A",1);
//m2.put("B",newInteger
(2));
m2.put("B",2);
System.out.println(m1.size());
System.out.println(m1.containsKey("one"));
System.out.println
//(m2.containsValue(newInteger
(1)));
(m2.containsValue
(1));
if(m1.containsKey("two")){
//inti=((Integer)m1.get("two")).intValue();
inti=(Integer)m1.get("two");//系统不知道是否能转换为Integer型,但是手动转换为Integer型后系统自动解包为相对应的值
System.out.println(i);
}
Mapm3=newHashMap(m1);
m3.putAll(m2);
System.out.println(m3);
}
}
练习1container\TestArgsWords.java显示每个单词重复个数!
importjava.util.*;
publicclassTestArgsWords{
//privatestaticfinalIntegerONE=newInteger
(1);
privatestaticfinalintONE=1;
publicstaticvoidmain(Stringargs[]){
Mapm=newHashMap();
for(inti=0;i //Integerfreq=(Integer)m.get(args[i]); intfreq=(Integer)m.get(args[i])==null? 0: (Integer)m.get(args[i]);//第一次为空值不能转换类型,需要这样写 //m.put(args[i],(freq==null? ONE: newInteger(freq.intValue()+1))); m.put(args[i],freq==0? ONE: freq+1); } System.out.println (m.size()+"distinctwordsdetected: "); System.out.println(m); } } 知识点3Generic泛型jdk1.5指定特定类型ArrayList 起因: jdk1.4以前的类型不明确: 装入集合的类型都被当做Object对待,从而失去自己的实际类型。 从集合中取出时往往需要转换类型,效率低,容易产生错误。 解决办法: 在定义集合的时候同时定义集合中对象的类型 例如: BasicGeneric.java 可以在定义Collection的时候指定 也可以在循环时使用Iterator指定 好处: 增强程序的可读性和稳定性 如API中有ArrayList 例举container\BasicGeneric.java importjava.util.*; publicclassBasicGeneric{ publicstaticvoidmain(String[]args){ List c.add("aaa"); c.add("bbb"); c.add("ccc"); for(inti=0;i Strings=c.get(i); System.out.println(s); } Collection c2.add("aaa");c2.add("bbb");c2.add("ccc"); for(Iterator Strings=it.next(); System.out.println(s); } } } classMyNameimplementsComparable intage; publicintcompareTo(MyNamemn){ if(this.age>mn.age)return1; elseif(this.age elsereturn0; } } 将前面讲的修改为泛型 TestMap2.java importjava.util.*; publicclassTestMap2{ publicstaticvoidmain(Stringargs[]){ Map m1.put("one",1); m1.put("two",2); m1.put("three",3); System.out.println(m1.size()); System.out.println(m1.containsKey("one")); if(m1.containsKey("two")){ //inti=((Integer)m1.get("two")).intValue(); inti=m1.get("two"); System.out.println(i); } } } TestArgsWords2.java importjava.util.*; publicclassTestArgsWords2{ privatestaticfinalintONE=1; publicstaticvoidmain(Stringargs[]){ Map for(inti=0;i if(! m.containsKey(args[i])){ m.put(args[i],ONE); } else{ intfreq=m.get(args[i]); m.put(args[i],freq+1); } } System.out.println (m.size()+"distinctwordsdetected: "); System.out.println(m); } } 2010-3-3021: 03: 24
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 马士兵 J2SE第七章 容器 个人学习笔记 士兵 J2SE 第七 个人 学习 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)