asp.net+Android+IOS开发 、Net培训、期待与您交流!
(前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频 百度网盘链接地址:http://pan.baidu.com/s/1o6mwDzO)
目录:1、集合概述 2、Collection、Iterator接口 3、List接口与其ArrayList、LinkedList、Vector子类 4、Set接口及其HashSet、TreeSet子类
1、集合概述
下图为JDK中集合的框架设计图,我们主要使用的集合为黑色方框中的四种集合。
数组和集合的不同:集合中对象数量不定,而数组中对象数量必须是确定的。
ArrayList 底层数据存储结构是数组结构 特点:查询速度快,增删稍慢,线程不同步
LinkedList 底层数据结构是链表结构 特点:查询稍慢,增删快
Vector 底层是数组数据结构 特点:都很慢,线程同步,出现最早,已经被ArrayList替代了现在很少用
Set 集合中的元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。
HashSet 底层数据结构是hash表
TreeSet 底层数据结构是二叉树\红黑树
2、Collection、Iterator接口
迭代器 Iterator 是为了方便集合操作元素而定义。而且专门为List集合定义了特有的迭代器ListIterator(为Iterator接口的子接口)
注意:使用迭代器时,不可以再通过集合对象的方法操作集合中的对象,会发生ConcurrentModification异常。
两个基本接口中的方法很重要
代码演示了Collection方法的使用以及遍历的操作方式(例子很普通,主要看下遍历的操作方法)
1publicclassCollectionTest {2publicstaticvoidmain(String[] args) {3List d=newArrayList();//新建集合、向集合中添加对象4d.add("jake");5d.add("alean");6d.add("sam");7iteratorTest(d);8}9//如何使用ListIterator进行遍历操作对象10publicstaticvoiditeratorTest(List c){11ListIterator it=c.listIterator();12while(it.hasNext()){13//ListIterator中添加14if(it.next()!=null){15it.add("nanjing");16}17//ListIterator中修改18//if(it.next()=="jake"){19//it.set("beokj");20//}21}22System.out.PRintln(c);23}24//collection接口方法使用25publicstaticvoidcollectionMethods(){26Collection c=newArrayList();27Collection d=newArrayList();28//增加29d.add("jake"); d.add("alean");d.add("sam");30c.addAll(d);31//删除32//c.remove("jake");33//c.removeAll(c);34//c.clear();35System.out.println(c.isEmpty());36System.out.println(c+":size="+c.size());37}38}
3、List接口与其ArrayList、LinkedList、Vector子类
ArrayList中涉及到比较集合中对象是否相同中用到的底层方法是集合中对象的equals()方法
LinkedList中的方法 JDK1.6以后出现了替代getFirst()\getLast()\removeFirst()\removeLast()方法的
offerFirst\offerLast\peekFirst()\peekLast()新方法,新方法的优势是集合中没有元素了不会出现NoSuchElementException异常
Vector 有特有的枚举方式取数据。其实枚举和迭代是一样的,枚举的名称和方法名称过长,所以被迭代器取代了,仅做了解
ArrayList 演示代码(除去集合中的重复对象)
1publicclassArrayListDemo {23publicstaticvoidmain(String[] args) {4//新建一个ArrayList类型集合,向其中添加Person对象5ArrayList al=newArrayList();6al.add(newPerson("jack",12));7al.add(newPerson("jack",12));8al.add(newPerson("jack",11));9al.add(newPerson("jack2",12));10al.add(newPerson("jack",12));
//除去al集合中的相同对象,打印结果11System.out.println(singleElement(al));12}13//删除ArrayList集合中重复的元素14publicstaticArrayList singleElement(ArrayList arrays){15ArrayList al=newArrayList();16Iterator ite=arrays.iterator();17//通过while循环,在其中用ArrayList的contains方法判断是否重复18while(ite.hasNext()){19Object obj=ite.next();20if(!al.contains(obj))21al.add(obj);22}23returnal;24}2526}27//Person类28classPerson{29privateString name;30privateintage;31//共有全参构造方法32publicPerson(String name,intage) {33super();34this.name =name;35this.age =age;36}37publicString getName() {38returnname;39}40publicvoidsetName(String name) {41this.name =name;42}43publicintgetAge() {44returnage;45}46publicvoidsetAge(intage) {47this.age =age;48}49//重写equals方法,自定义比较的依据,这里我们定义对象的姓名、年龄都相同时,对象才相等50publicbooleanequals(Object obj) {51Person per=(Person)obj;52if(!(objinstanceofPerson))53returnfalse;54else55returnper.name.equals(name) && per.age==age;56}57//重写toString方法,便于查看程序的运行结果58publicString toString() {59returnname+"::"+age;60}6162}
LinkedList示例代码(用LinkedList模拟堆栈(先进后出)和队列(先进先出)数据结构)
1publicclassLinkedListDemo {2publicstaticvoidmain(String[] args) {34Queue queue=newQueue();5queue.set("红");6queue.set("黄");7queue.set("蓝");8queue.set("紫");910while(!queue.isNull()){11System.out.println(queue.get());12}13}14}15//模拟队列,先进先出16classQueue{17privateLinkedList ll;18publicQueue(){19ll=newLinkedList();20}21publicObject get(){22returnll.removeFirst();23}24publicvoidset(Object obj){25ll.addLast(obj);26}27publicbooleanisNull(){28returnll.isEmpty();29}30}31//模拟堆栈-先进后出32classStack{33privateLinkedList ll;34publicStack(){35ll=newLinkedList();36}37publicObject get(){38returnll.removeLast();39}40publicvoidset(Object obj){41ll.addLast(obj);42}43publicbooleanisNull(){44returnll.isEmpty();45}46}
4、Set接口及其HashSet、TreeSet子类
HashSet中比较的底层原理 : 先调用hashcode方法判断对象hash值是否相同,若相同,再调用对象那个的equels()方法,判断对象是否相同
实际开发中,新建集合中的对象时,都要重写对象的hashcode和equals方法
TreeSet: 可以对TreeSet集合中的元素进行自然排序。
第一种排序方式:比较原理是在集合元素中实现CompareTo接口
第二种排序方式:当元素自身不具备比较性时,可让集合具有比较性。方法:定义比较器(即实现了Comparator接口的类),将比较器对象作为参数传递给TreeSet集合的构造函数。
总结:两种方式中,第二种方式基于接口编程,拓展性好,比较常用。如果两种排序方式同时存在,系统使用第二种方式
HashSet集合的代码示例
1publicclassHashSetDemo{23publicstaticvoidmain(String[] args) {45HashSet hs=newHashSet();6hs.add(newPersons("Tom1",24));7hs.add(newPersons("Tom1",25));8hs.add(newPersons("Tom1",24));9//遍历器来查询集合中对象10Iterator ite=hs.iterator();11while(ite.hasNext())12System.out.println(ite.next());13}14}15//Person类16classPersons{17privateString name;18privateintage;19//共有全参构造方法20publicPersons(String name,intage) {21super();22this.name =name;23this.age =age;24}25publicString getName() {26returnname;27}28publicvoidsetName(String name) {29this.name =name;30}31publicintgetAge() {32returnage;33}34publicvoidsetAge(intage) {35this.age =age;36}37//重写hashCode方法,自己定义判断38publicinthashCode(){39returnname.hashCode()+age;40}41//重写equals方法,自定义比较的依据,这里我们定义对象的姓名、年龄都相同时,对象才相等42publicbooleanequals(Object obj) {43Persons per=(Persons)obj;44if(!(objinstanceofPersons))45returnfalse;46else47returnper.name.equals(name) && per.age==age;48}49//重写toString方法,便于查看程序的运行结果50publicString toString() {51returnname+"::"+age;52}53}
TreeSet代码示例
同时实现了两种排序方式。验证了两种排序方式共存是,系统采用何种方式
1publicclassTreeSetDemo {2//两种比较方式共存,系统采用比较器的比较方式3publicstaticvoidmain(String[] args) {45TreeSet ts=newTreeSet(newcomparator());6ts.add(newPersont("bbama1",22));7ts.add(newPersont("abama3",22));8ts.add(newPersont("abama2",24));9ts.add(newPersont("abama3",21));1011Iterator ite=ts.iterator();12while(ite.hasNext()){13System.out.println(ite.next());14}15}1617}18//实现比较器,规定元素按照姓名排序,姓名相同的按年龄排序19classcomparatorimplementsComparator{20@Override21publicintcompare(Object o1, Object o2) {22Persont p1=(Persont)o1;23Persont p2=(Persont)o2;24inti=p1.getName().compareTo(p2.getName());25if(i==0)26returnp1.getAge()-p2.getAge();27elsereturni;28}29}30//Person类,规定元素按照年龄排序,年龄相同的按姓名排序31classPersontimplementsComparable<Persont>{32privateString name;33privateintage;34//共有全参构造方法35publicPersont(String name,intage) {36super();37this.name =name;38this.age =age;39}40publicString getName() {41returnname;42}43publicvoidsetName(String name) {44this.name =name;45}46publicintgetAge() {47returnage;48}49publicvoidsetAge(intage) {50this.age =age;51}5253//重写toString方法,便于查看程序的运行结果54publicString toString() {55returnname+"::"+age;56}57@Override58publicintcompareTo(Persont per) {59if(age>per.age)60return1;61if(age==per.age){62returnname.compareTo(per.name);63}64else65return-1;66}67}
初学者难免错误,欢迎评判指教,持续更正ing...........
ASP.Net+Android+IOS开发 、Net培训、期待与您交流!