集合Word格式文档下载.docx
《集合Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《集合Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
判断在集合中是否包含特定的对象的引用
booleanisEmpty()
判断集合是否为空
Iteratoriterator()
返回一个Iterator类型的对象,用它来遍历集合
booleanremove(Object
从集合中删除一个对象
intsize()
返回集合中元素的数量
Object[]toArray()
返回一个对象的数组,该数组中包含集合中所有的元素
见例子1使用字符串进行各种方法的演示添加元素打印集合可以看到有序无序(显然集合类是重写过tostring方法了)重复不重复
能不能存储基本数据类型集合中可以存储各种类型数据但一般我们不这么做人的天性总是会分类存放比较清楚
例子二继续演示其他方法删除等
•Iterator接口封装了底层的数据结构,向用户提供了统一遍历集合的
方法,在Iterator接口中声明了如下的方法
booleanhasNext()
判断集合中是否还有下一个元素
Objectnext()
返回下一个元素
voidremove()
从集合中删除一个由next()方法返回的元素
例子三迭代注意使用if(oinstanceofPerson)因为集合允许添加不同元素实际上是无法保证数据是同一类型的删除!
例子四自定义对象的删除判断等方法必须重写equals方法;
否则无法正常工作显然字符串是重写过这个方法的
publicbooleanequals(Objecto){
Stus=(Stu)o;
booleanb=false;
if(sid==s.sid){
b=true;
}
returnb;
}
练习:
学生管理:
实现增删改查stuManager类(不用再写db类简化一点直接在管理类中定义个集合)使用arraylist即可
Add(stu)使用contains方法
Serarch(id)
Delete(intid)根据id来删除
Delete(stu)使用对象来删除remove方法规则还是id相同则视为相同;
Update(stu)
总结
对于集合来说重要的方法无非是增删改查
没有改的方法
查:
迭代
改查出来直接修改就可以了
删除包含等方法需要覆盖equals方法;
到这里集合类的基本操作就完毕了另外每个子接口还都扩展了一些方法
补充一些不重要的方法
booleancontainsAll(Collectioncollection)
booleanaddAll(Collectioncollection)
voidremoveAll(Collectioncollection)
voidretainAll(Collectioncollection)
containsAll()方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是否是当前集合的
子集。
其余方法是可选的,因为特定的集合可能不支持集合更改。
addAll()方法确保另一个集合中的所有
元素都被添加到当前的集合中,通常称为并。
clear()方法从当前集合中除去所有元素。
removeAll()方法类似于
clear(),但只除去了元素的一个子集。
retainAll()方法类似于removeAll()方法,不过可能感到它所做的与前
面正好相反:
它从当前集合中除去不属于指定集合的元素,即交。
vList接口
最大的特点是有下标添加了按下标操作的方法可以将list简单理解为一个动态的数组
voidadd(intindex,Objectelement)
Objectget(intindex)
Objectset(intindex,Objectelement)
intindexOf(Objecto)返回首次出现的对象的索引也必须重写equals方法和contans方法差不多返回值不一样
Objectremove(intindex)
使用list的方法改造学生管理
添加方法不变
在增加一个删除指定位置元素的删除方法remove(intindex)
Update方法输入学生编号使用set()
查询使用for循环get()
A实现类:
Arraylist类没有做出新的扩展就是实现了collection和list接口中的所有方法
Linkedlist除了实现List接口外,LinkedList类还为在列表的开头及结尾get、remove和insert元素提供了统一的命名方法。
Get[first][last]
练习
创建一个类Stack,代表堆栈(其特点为:
后进先出),添加方法add(Objectobj)、以及get(),添加main方法进行验证,要求:
使用LinkedList实现堆栈
在向LinkedList中添加时,使用addLast方法
在从LinkedList中取出时,使用removeLast方法
importjava.util.*;
publicclassStack{
privateLinkedListlist=newLinkedList();
publicvoidadd(Objectobj){
list.addLast(obj);
}
publicObjectget(){
returnlist.removeLast();
publicstaticvoidmain(String[]args){
Stackstack=newStack();
stack.add("
1"
);
2"
System.out.println(stack.get());
}
Vector,
这是一个老版的集合对象以前使用的比较多他基本上和arraylist的实现一样但是他是线程安全的数据安全性比较高但是性能会受到影响
可以实现可增长的对象数组。
与数组一样,它包含可以使用整数索引进行访问的组件。
线程安全,
publicVector()
publicObjectelementAt(intindex)-----get
publicvoidaddElement(Objectobj)----add
publicvoidremoveElementAt(intindex)----remove
publicvoidinsertElementAt(Eobj,intindex)----set
publicbooleanremoveElement(Objectobj)
publicvoidremoveAllElements()
publicObject[]toArray()
集合类的选择
当元素数量不确定的时候就考虑使用集合类当需要有序而且可重复的时候就考虑使用list
ArrayListvector是基于数组来实现的内部就是一个数组而已默认值是10而且可以在构造的时候指定当超过的时候就自动创建出一个新的数组,因为他们的存储时数组是一块连续的空间所以进行查找的时候很快可以根据索引来查找即便是循环也非常快但是如果有频繁的在指定位置插入删除操作就非常的消耗性能
LinkedList是基于链表来实现这样的结构决定了他的删除和添加非常的快特别是对头尾元素的操作特别的快
简单介绍一下原理(大家首先明白一件事添加进去的元素到底放到了哪里是放到了一个叫做entry的类对象里了
这个对象分为三部分就是有三个属性
第一个entry叫做头元素(实际上他是空的不包括数据)
里面有个内部元素类
Entry也叫头元素属性随后每添加一个元素就会在集合外部创建一个entry类对象以包含值对象而且内部有两个引用指向前后两个元素形成一个双向的循环链表结构)导致前面的随即访问较后者要快,但是插入、移除操作不及后面的快,另后者操作方法也更灵活,
包括前者没有的add,get,remove-([First][Last]),这些方法可以作为堆栈,队列,双向队列使用。
最后考虑一个问题:
如果使用集合类对象应该使用什么什么类型来声明尽量来使用父类来声明这样就降低了耦合比如程序变成多线程的需要线程安全那么就可以换成vector但是这样又有一个问题就是声明为父类的时候子类特有的方法就不能使用了所以这就要根据实际情况来做决定了如果不需要使用特用方法的时候就一定把它声明为父类只有好处没有坏处啊
vSet接口:
继承collection,没有添加任何新的方法,但是他有自己的特殊之处就是,不允许重复的项(equals)以及无序没有下标
例子1set允许空值无序不允许重复元素方法同collection
这个特点非常的有用比如我们的学生管理的程序在添加的时候就不能有相同的对象如果使用list来做的话list本身并没有放重复的功能你给他什么他就存什么
所以你必须在添加之前做遍历或者使用constanse方法来判断是否包含这个对象
而使用set就不需要了
实验的结果很凄凉啊
实现类:
HashSet:
⏹HastSet的add方法在对象加入的适时候,不光会调用equals()方法判断对象是否相同,而且还调用hashCode方法进一步判断对象是否相同
⏹如果在Student类中只覆盖了equals()方法,而没有覆盖hashCode()方法,会导致HashSet工作不正常.所以在自定义的类中,如果覆盖了equals()方法,最好也要覆盖hashCode()方法必须保证如果equals为true那么hashcode也相等;
显然string又进行了hashcode的改写他保证了两个字符串对象如果内容相等那么hashcode也相等所以内容相同的字符串对象就无法添加进来
例子2改造学生管理重写hashcode方法
练习1,定义一个Course类,代表课程;
定义一个Student类,
代表学生,在Student类中包含一个属性是一个HashSet
的对象,用来存储该学生所选的所有课程,并提供相
应的addCourse(Coursec)方法和removeCourse(Stringname)
方法,表示添加一门选课和删除一门选课
(删除选课时通过传课程名参数来确定)。
2,定义一个类SchoolClass代表班级,该类中包含一个
属性是一个HashSet的对象,用来存储该班级中所有
的Student,并提供相应的addStudent(Students)方
法和removeStudent(Stringname)方法,表示添加一
名学生和删除一名学生
(删除学生时通过传学生姓名参数来确定)。
3,在主方法中生成一个SchoolClass对象,添加若干个
学生,并且为每个学生添加若干门课程,
4,最后要统计出每门课程的选课人数。
TreeSet:
保持次序的Set,可以根据指定的规则进行排序
例子一使用stringinteger发现可以排序
而使用自定义类型student结果同样是非常悲惨
你要让treeset为你排序就必须告诉他一个排序的规则否则的话他怎么知道按照什么来排序是按照学号还是年龄?
指定规则就必须实现一个借口
1.一部分类实现Comparable接口,如String,Integer,Double等.Comparable有个
intcompareTo()方法
对于表达式:
x.compareTo(y),如果返回值为0,表示x,y相等;
如果返回值大于0,表示x大于y;
如果返回值小于0,表示x小于y.
TreeSet是调用对象的compareTo方法来比较对象的,然后进行升序排列
例子2自定义类型;
inti=0
Students=(Student)o;
if(id>
s.id){
i=1;
}
elseif(id<
s.id){
i=-1;
else{
i=pareTo(s.name);
returni;
如果是按照降序排列呢?
注意:
在使用自然排序时,只能向TreeSet集合中加入同类型的对象,并且这些类必须实现Comparable接口否则你也无法转型啊!
而且你觉得人和狗作比较有意义吗
【程序3】
1,定义一个Teacher类,包含3个属性:
name,age,salary。
并且定义若两个对象的name和age都相同,则认为这
两个对象相同。
要求该Teacher类对象能比较大小,
按照age的大小来排序,如果age相同的则按salary大
小来排。
要求age是逆序排列就是大的排在前面最后,生成一些Teacher对象,加入到
HashSet和TreeSet中验证以上程序的正确性。
vMap接口:
首先说明的是与collection没有任何关系,反映的是一对映射关系的集合,该接口描述了从不重复的键到值(可重复)的映射。
我们可以把这个接口方法分成三组操作:
改变查询和提供可选视图。
英文名--user
Key不重复意味着key对象必须重写equalshashcode两个方法一下方法的讲解的前提都是两个方法已经重写否则某些方法将不能正常工作
改变操作从映射中添加和除去键-值对。
Map本身也可作为键或者值
加给map。
Objectput(Objectkey,Objectvalue)
Objectremove(Objectkey)
voidputAll(Mapmapping)
voidclear()
查询操作用来检查映射内容:
Objectget(Objectkey)
booleancontainsKey(Objectkey)
booleancontainsValue(Objectvalue)
intsize()
booleanisEmpty()
最后一组方法用来把键或值的组作为集合来处理。
publicSetkeySet()
publiccollectionvalues()
publicSetentrySet()
最后一个方法返回一个实现Map.Entry接口的元素Set。
Hashtable不允许null键同步
hashmap可以null键值不同步
TreeMap:
排序,键排序;
不允许有不同类型keykey必须实现比较接口
建立一个词典类
•java.util.Collections提供了一些静态方法实现了基于List容器的一些常用算法。
•voidsort(Listl)对List容器内的元素排序
•voidshuffle(Listl);
随机排序
•voidreverse(Listl);
逆序排序
•voidfill(Listl,Objectobj);
用一个特定的对象重写整个List容器
•voidcopy(Listdest,Listsrc);
将srcList容器内容拷贝到destList容器中;
•voidintbinarySearch(List,Object);
对于顺序的List容器,采用折半查找的方法查找特定对象;
publicstaticvoidmain(String[]args){
Listl1=newLinkedList();
for(inti=0;
i<
=9;
i++){
l1.add("
a"
+i);
System.out.println(l1);
Collections.shuffle(l1);
Collections.reverse(l1);
l1.add("
b2"
Collections.sort(l1);
System.out.println(Collections.binarySearch(l1,"
a5"
));
}}
vforeach循环在listset中的使用
复习迭代器和remove的使用迭代器指针默认在第一个元素前next后指针走一次随后可使用remove来删除但只能使用一次;
for非常方便而且可以避免迭代器只能单向使用的问题但是他不能删除只适合遍历