您好,欢迎访问三七文档
前言还是那句话我所说的都是一些概念方便理解每个类原理,但是其真正原理必须要自己研究,可以看JAVA源码,反编译工具、百度之类的。集合数组首先我们还是得研究为何要有集合?假设我们遇到了下面的情况,我们需要定义100个变量,并且第一个变量存储的是1,第二个变量存储的是2。。。第一百个变量存储的是100,我们不可能在程序中这么定义packagecollection;publicclassFirstSample{publicstaticvoidmain(String[]args){inta1=1,a2=2,a3=3,a4=4;}}要是这么定义得写100次,万一要是1000条10000条记录呢?所以这样做是肯定不行的,于是数组就诞生了,数组就是为存储一系列相同类型的变量而诞生的数组的用法是int[]a=newint[100];int[]a表示a是一个存储int数组类型的变量newint[100]就是创建一个100个长度的int型变量数组packagecollection;publicclassFirstSample{publicstaticvoidmain(String[]args){int[]a=newint[100];a[0]=1;}}我们这样就定义好了一个a[0]a[1]..a[99]100个int型的数组了这里一定要记住数组的标志是从0开始的,还可以定义多维数组int[][]a=newint[100][];int[][][]a=newint[100][][];这个就自己百度学习下吧,实际开发中用的较少,但是要掌握其原理,即三维数组在计算机中是如何存储的。现在我们就来完成一开始的题目吧packagecollection;publicclassFirstSample{publicstaticvoidmain(String[]args){int[]a=newint[100];for(inti=0;ia.length;i++){a[i]=i+1;}for(inti=0;ia.length;i++){System.out.println(a[i]);}}}a[i]=i+1;a[数组位置也可以使用变量]链表数据LISTlist是顶级接口,ARRAYLIST和LINKEDLIST都实现了LIST接口因此我们可以用下面方式来使用ARRAYLIST和LINKEDLISTListarrayList=newArrayList();ArrayListarrayList=newArrayList();当有些数据是不规则的类型,比如有int,有String,有double时我们使用数组就不行了,这时我们就需要另外一种工具来帮我们处理这种问题,List就是这样一种工具,至于其原理百度下吧,写起来太长,我简单的说下,List就是一个链表,何为链表呢,就是一个链连着一个链,比如我们平时的钥匙扣,一个钥匙扣可以再套一个,这样一个套一个,而每个钥匙扣里都可以放上各种东西,在我们JAVA世界里所有的对象都是可以放在这个钥匙扣上的。我们的List有2种,一种是LinkList,另外一种是ArrayListLinkList就是一个套一个每个链都是活动的,即前一个链子只管下一个链子是谁,这样当一个新的链子加入进来,也只要将这个新的链子套到自己,然后再把自己套向后面的链子就可以了我们打开我们的帮助手册找到importjava.util.LinkedList;里面有LinkedList的属性以及方法size(),这个就是返回一共有多少个链子linkedList.add(0);System.out.println(linkedList.size());System.out.println(linkedList.get(0));这里的add方法就是往这个链子里加入一个对象,并且将List的长度增加一size()方法返回当前的linkedList一共有多少个链子linkedList.get(0)表示返回linkedList中存放的链表位置中的第几个位置上的对象,这里和数组一样,0就是表示第一链子上的对象,帮助手册里面的每个方法都有详细注解,一定要了解清楚再来说说ArrayList,Array就是数组,ArrayList就等于是一个Object[]他们2者主要的区别就在于,当数据量达到一定程度的时候,链表的查询速度较慢,因为你要根据一个节点去寻找下一个节点,比如我们要找第十个记录,那么会开始往下找一直找到第九条记录,发现第下一条记录就是所需要的记录,于是就将第十条记录返回给我们,我们可以用这种方式理解为何要用list.get(0)来返回第一条记录。而ArrayList是Object[]对象,所以其查询速度会很快,因为在每个链表中都存储了自己相应的位置两者的区别,2者如果是增加数据到末尾速度是一样快的,但是如果要往中间插入一条数据是arrayList比较快,2者定位纪录的速度是arrayList较快第一个例子用来比较2者往链表中间插入数据速率对比packagecollection;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;publicclassFirstSample{publicstaticvoidmain(String[]args){ListlinkedList=newLinkedList();ListarrayList=newArrayList();for(inti=0;i1000000;i++){linkedList.add(i);}longstart=System.currentTimeMillis();for(inti=10000;i20000;i++){linkedList.add(i,i);}longend=System.currentTimeMillis();System.out.println(end-start);for(inti=0;i1000000;i++){arrayList.add(i);}longstart1=System.currentTimeMillis();for(inti=10000;i20000;i++){arrayList.add(i,i);}longend1=System.currentTimeMillis();System.out.println(end1-start1);}}System.currentTimeMillis();可以用帮助手册查看java.lang.System第二个例子用来反应两者的查询定位纪录速度packagecollection;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;publicclassFirstSample{publicstaticvoidmain(String[]args){ListlinkedList=newLinkedList();ListarrayList=newArrayList();for(inti=0;i1000000;i++){linkedList.add(i);}longstart=System.currentTimeMillis();for(inti=10000;i20000;i++){linkedList.get(i);}longend=System.currentTimeMillis();System.out.println(end-start);for(inti=0;i1000000;i++){arrayList.add(i);}longstart1=System.currentTimeMillis();for(inti=10000;i20000;i++){arrayList.get(i);}longend1=System.currentTimeMillis();System.out.println(end1-start1);}}还有一种集合Vector,和ArrayList类似,但是它是线程安全的,后面学到线程会说,简单描述下就是,假设现在有5个人都要使用同一个集合,但是我要保证每个人使用的时候别的人都不能使用,而且vector里面存储的所有对象也不能改变键值对MAPMap有hashMap和treemap这里我们要说下Hash(哈希)算法,这个先百度学习下,Map中的HashMap,Set中的HashSet都会去使用哈希算法,Map里的键默认排序方式就是使用Hash算法排序首先说Map,为何要有Map,我们在使用数组的时候会对每个数组进行定义,存储的值,其标识是多少,但是如果我们要存储,比如人名,个人所有信息,的这种数据我们怎么办?用我们的数组LIST虽然也可以实现,但是很麻烦,所以我们的JAVA设计者为我们想好了一种简单的集合方式MAP,这样我们就不用痛苦的去自己一个个的实现他们了Map可以存储key键,键就是标识,value值,值就是对应的具体值。比如我们刚才说的存储人名和个人信息我们可以这样packagecollection;publicclassUser{Stringname;publicUser(Stringname){this.name=name;}}packagecollection;importjava.util.HashMap;importjava.util.Map;publicclassSecondSample{publicstaticvoidmain(String[]args){Mapmap=newHashMap();map.put(zhangsan,newUser());}}这样我们就往map中放入了一个键为zhangsan,值为一个newUser()的对象。我们要获取对象只要通过map.get(相应的值);packagecollection;importjava.util.HashMap;importjava.util.Map;publicclassSecondSample{publicstaticvoidmain(String[]args){Mapmap=newHashMap();map.put(null,newUser(zhangsan));Useruser=(User)map.get(null);System.out.println(user.name);}}这里我们map.get(null);出来对象是Object类型的,即是一个对象类型,但是不知道具体会是那种类型的,所以我们需要将它转化成我们所需要的类型User类型,然后才可以使用User类型所拥有的方法Map必须存储同一类型的变量,不像List,list可以存储Object,但是Map如果存储了int类型如果再存储String类型就会报错packagecollection;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Set;importjava.util.TreeMap;importjava.util.Map.Entry;publicclassThirdSample{publicstaticvoidmain(String[]args){TreeMaptreeMap=newTreeMap();treeMap.put(123,321);treeMap.put(123,123);treeMap.put(311,311);treeMap.put(aaaa,aaa);SettreeSet=treeMap.entrySet();for(Iteratoriterator=treeSet.iterator();iterator.hasNext();){Entryentry=(Entry)iterator.next();System.out.println(entry.getValu
本文标题:第十章集合
链接地址:https://www.777doc.com/doc-2166165 .html