马士兵 J2SE第七章 容器 个人学习笔记Word文件下载.docx
- 文档编号:17559058
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:16
- 大小:1.42MB
马士兵 J2SE第七章 容器 个人学习笔记Word文件下载.docx
《马士兵 J2SE第七章 容器 个人学习笔记Word文件下载.docx》由会员分享,可在线阅读,更多相关《马士兵 J2SE第七章 容器 个人学习笔记Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
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("
//如果equals则去除
c.remove(newInteger(100));
System.out.println
(c.remove(newName("
)));
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.
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
publicclassTestMap{
publicstaticvoidmain(Stringargs[]){
Mapm1=newHashMap();
Mapm2=newTreeMap();
//m1.put("
one"
newInteger
(1));
m1.put("
1);
two"
newInteger
(2));
2);
three"
newInteger(3));
3);
//m2.put("
A"
m2.put("
B"
m2.put("
System.out.println(m1.size());
System.out.println(m1.containsKey("
//(m2.containsValue(newInteger
(1)));
(m2.containsValue
(1));
if(m1.containsKey("
)){
//inti=((Integer)m1.get("
)).intValue();
inti=(Integer)m1.get("
//系统不知道是否能转换为Integer型,但是手动转换为Integer型后系统自动解包为相对应的值
System.out.println(i);
Mapm3=newHashMap(m1);
m3.putAll(m2);
System.out.println(m3);
练习1container\TestArgsWords.java显示每个单词重复个数!
publicclassTestArgsWords{
//privatestaticfinalIntegerONE=newInteger
(1);
privatestaticfinalintONE=1;
Mapm=newHashMap();
for(inti=0;
i<
args.length;
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?
freq+1);
(m.size()+"
distinctwordsdetected:
"
System.out.println(m);
知识点3Generic泛型jdk1.5指定特定类型ArrayList<
E>
(当然是在能指定的情况下)
起因:
jdk1.4以前的类型不明确:
装入集合的类型都被当做Object对待,从而失去自己的实际类型。
从集合中取出时往往需要转换类型,效率低,容易产生错误。
解决办法:
在定义集合的时候同时定义集合中对象的类型
例如:
BasicGeneric.java
可以在定义Collection的时候指定
也可以在循环时使用Iterator指定
好处:
增强程序的可读性和稳定性
如API中有ArrayList<
则说明可以指定特定类型
例举container\BasicGeneric.java
publicclassBasicGeneric{
List<
String>
c=newArrayList<
();
//只能装Sring类型泛型的使用
c.add("
aaa"
bbb"
ccc"
for(inti=0;
i<
c.size();
i++){//遍历
Strings=c.get(i);
System.out.println(s);
Collection<
c2=newHashSet<
c2.add("
c2.add("
for(Iterator<
it=c2.iterator();
it.hasNext();
){
Strings=it.next();
classMyNameimplementsComparable<
MyName>
{
intage;
publicintcompareTo(MyNamemn){
if(this.age>
mn.age)return1;
elseif(this.age<
mn.age)return-1;
elsereturn0;
将前面讲的修改为泛型
TestMap2.java
publicclassTestMap2{
Map<
String,Integer>
m1=newHashMap<
String,Integer>
inti=m1.get("
TestArgsWords2.java
publicclassTestArgsWords2{
m=newHashMap<
if(!
m.containsKey(args[i])){
m.put(args[i],ONE);
else{
intfreq=m.get(args[i]);
m.put(args[i],freq+1);
2010-3-3021:
03:
24
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 马士兵 J2SE第七章 容器 个人学习笔记 士兵 J2SE 第七 个人 学习 笔记