Collection&Map集合框架

来源:互联网 发布:苏州十大网络教育机构 编辑:程序博客网 时间:2024/04/30 12:39
 Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap

└WeakHashMap

示意图↑

1.List的特性有序(输入的顺序),可重复
2.类似数组,可以根据长度一个一个访问,从0到i-1;
3.可以直接用x.get(i)方法调用该位置的元素内容

4.ArrayList底层是数组实现的,而LinkedList是链表实现的。Vector和ArrayList一样是数组实现的,二者的差别在于:Vector是线程安全的,所以性能上不如ArrayList 

public class Mytest {public static void main(String[] args) {//Set1 x=new Set1();List x=new List();x.List1();x.List2();x.List3();}}
上面是主方法,下面是LinkedList  ArrayList  Vector各自的使用方法,只写了add方法

public class List {public void List1(){ArrayList x=new ArrayList();x.add(1);x.add(2);x.add(3);x.add(4);x.add("abc");x.add(1);System.out.println("链表的长度为"+x.size());for(int i=0;i<x.size();i++){System.out.println(x.get(i));}System.out.println("XXXXXXXXXXXXXX");}public void List2(){LinkedList y=new LinkedList();y.add(1);y.add(2);y.add(3);y.add(4);y.add("abc");y.add(1);System.out.println("链表的长度为"+y.size());for(int i=0;i<y.size();i++){System.out.println(y.get(i));}System.out.println("YYYYYYYYYY");}public void List3(){Vector z=new Vector();z.add(1);z.add(2);z.add(3);z.add(4);z.add("abc");z.add(1);System.out.println("链表的长度为"+z.size());for(int i=0;i<z.size();i++){System.out.println(z.get(i));}}}
输出结果
<pre name="code" class="java">链表的长度为61234abc1XXXXXXXXXXXXXX链表的长度为61234abc1YYYYYYYYYY链表的长度为61234abc1
这三个结果输出来的是一样的

<strong><span style="color:#ff6666;"><span style="font-family: 宋体; line-height: 28px;">ArrayList </span><span style="font-family: 宋体; line-height: 28px;">是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.</span><br style="font-family: 宋体; line-height: 28px;" /><span style="font-family: 宋体; line-height: 28px;">LinkedList </span><span style="font-family: 宋体; line-height: 28px;">是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.</span><br style="font-family: 宋体; line-height: 28px;" /><span style="font-family: 宋体; line-height: 28px;">当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义.</span><br style="font-family: 宋体; line-height: 28px;" /><span style="font-family: 宋体; line-height: 28px;">Vector </span><span style="font-family: 宋体; line-height: 28px;">和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。</span><br style="font-family: 宋体; line-height: 28px;" /><span style="font-family: 宋体; line-height: 28px;">Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.</span><br style="font-family: 宋体; line-height: 28px;" /><span style="font-family: 宋体; line-height: 28px;">而</span><span style="font-family: 宋体; line-height: 28px;"> LinkedList </span><span style="font-family: 宋体; line-height: 28px;">还实现了 </span><span style="font-family: 宋体; line-height: 28px;">Queue</span><span style="font-family: 宋体; line-height: 28px;"> 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.</span><br style="font-family: 宋体; line-height: 28px;" /><span style="font-family: 宋体; line-height: 28px;">注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。</span></span></strong>
<strong><span style="font-family: 宋体; line-height: 28px;"><span style="color:#333333;">Set</span></span></strong>
<strong><span style="font-family: 宋体; line-height: 28px;"><span style="color:#333333;"> *1.Set是无序不重复序列 *2.如有数据是相同的,则是后一个覆盖前一个; *3.要用迭代器才能访问里面的元素,他不是按数组下标排列 *4.Iterator i= x.iterator();迭代器</span></span></strong>
<strong><span style="font-family: 宋体; line-height: 28px;"><span style="color:#333333;"></span></span></strong><pre name="code" class="java">public class Set1 {public Set1() {Set x=new HashSet();x.add(1);x.add(2);x.add(3);x.add("abc");x.add(3);System.out.println("set长度为"+x.size());Iterator i= x.iterator();while(i.hasNext()){System.out.println(i.next());}}}
这是结果:
set长度为4
1
2
3
abc
<strong><span style="font-family: 宋体; line-height: 28px;"><span style="color:#333333;">很明显add了两个元素,但是输出却只有一个,前一个是被后一个覆盖了。而不是先判断,不满足条件就不进行保存。</span></span></strong>
<strong><span style="font-family: 宋体; line-height: 28px;"><span style="color:#333333;">Map</span></span></strong>
<strong><span style="font-family: 宋体; line-height: 28px;"><span style="color:#333333;">1、Map是一种一一对应的关系,例如x和y一一对应,同一个x可能有多个y与之对应,一个y却只有唯一的一个x与之对应,在这里x就相当于key键值,y相当于value,一个MAP里,同一个x只允许出现一次</span></span></strong>
public class Map1 {public static void main(String[] args) {Map1 x=new Map1();x.map();}public void map() {Map y=new HashMap();y.put(1, "aaa");y.put(2, "bbb");y.put(3, "ccc");
<span style="white-space:pre"></span>y.put(2, "ddd");System.out.println("他的长度"+y.size());Set set=y.keySet();Iterator i=set.iterator();while(i.hasNext()){Object key=i.next();Object value=y.get(key);System.out.println("key     "+key+"    value    "+value);}}}
运行结果
他的长度3key     1    value    aaakey     2    value    dddkey     3    value    ccc
很显然,后一个值为2的数吧前一个2覆盖掉了,因为2对应的value是变成了ddd;
y.put(3, "ccc");
y.put(1, "aaa");
y.put(2, "bbb");
y.put(2, "ddd");

当添加顺序如上的时候,他的输出结果已经变成了

他的长度3
key     1    value    aaa
key     2    value    ddd
key     3    value    ccc
他输出的东西是经过排序了的,就是键值从小到大的顺序


关于同步和异步:


1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
  也就是必须一件一件事做,等前一件做完了才能做下一件事
 2.异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
做一件事情的同事,不影响做其他的事情,可同时进行。

0 0
原创粉丝点击