java集合类代码_java集合类

0.参考文献

1.java集合类图

1.1

94a4ad7d3117d3aeb37aae8343eb9916.png

1.2

f49505609855ba745ecdedc3073db44b.png

上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。

发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。

还有一个特点就是抽象类的使用。如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添加一些方法就可以实现自己需要的集合类,工作流昂大大降低。

1.3

342d25dd97cfef00c98b9a97deee75d6.png

2.详解

2.1HashSet

HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致。

代码实例:HashSetDemo

packageedu.sjtu.erplab.collection;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;public classHashSetDemo {public static voidmain(String[] args) {

Set set=new HashSet();

set.add("a");

set.add("b");

set.add("c");

set.add("c");

set.add("d");//使用Iterator输出集合

Iterator iter=set.iterator();while(iter.hasNext())

{

System.out.print(iter.next()+" ");

}

System.out.println();//使用For Each输出结合

for(String e:set)

{

System.out.print(e+" ");

}

System.out.println();//使用toString输出集合

System.out.println(set);

}

}

代码实例:SetTest

packageedu.sjtu.erplab.collection;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Scanner;importjava.util.Set;public classSetTest {public static void main(String[] args) throwsFileNotFoundException {

Set words=new HashSet();//通过输入流代开文献//方法1:这个方法不需要抛出异常

InputStream inStream=SetTest.class.getResourceAsStream("Alice.txt");//方法2:这个方法需要抛出异常//InputStream inStream = new FileInputStream("D:\\Documents\\workspace\\JAVAStudy\\src\\edu\\sjtu\\erplab\\collection\\Alice.txt");

Scanner in=newScanner(inStream);while(in.hasNext())

{

words.add(in.next());

}

Iterator iter=words.iterator();for(int i=0;i<5;i++)

{if(iter.hasNext())

System.out.println(iter.next());

}

System.out.println(words.size());

}

}

2.2ArrayList

ArrayList是List的子类,它和HashSet想法,允许存放重复元素,因此有序。集合中元素被访问的顺序取决于集合的类型。如果对ArrayList进行访问,迭代器将从索引0开始,每迭代一次,索引值加1。然而,如果访问HashSet中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元素被访问的次序。

代码实例:ArrayListDemo

packageedu.sjtu.erplab.collection;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;public classArrayListDemo {public static voidmain(String[] args) {

List arrList=new ArrayList();

arrList.add("a");

arrList.add("b");

arrList.add("c");

arrList.add("c");

arrList.add("d");//使用Iterator输出集合

Iterator iter=arrList.iterator();while(iter.hasNext())

{

System.out.print(iter.next()+" ");

}

System.out.println();//使用For Each输出结合

for(String e:arrList)

{

System.out.print(e+" ");

}

System.out.println();//使用toString输出集合

System.out.println(arrList);

}

}

2.3 ListIterator

ListIterator是一种可以在任何位置进行高效地插入和删除操作的有序序列。

代码实例:LinkedListTest

packageedu.sjtu.erplab.collection;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importjava.util.ListIterator;public classLinkedListTest {public static voidmain(String[] args) {

List a=new ArrayList();

a.add("a");

a.add("b");

a.add("c");

System.out.println(a);

List b=new ArrayList();

b.add("d");

b.add("e");

b.add("f");

b.add("g");

System.out.println(b);//ListIterator在Iterator基础上添加了add(),previous()和hasPrevious()方法

ListIterator aIter=a.listIterator();//普通的Iterator只有三个方法,hasNext(),next()和remove()

Iterator bIter=b.iterator();//b归并入a当中,间隔交叉得插入b中的元素

while(bIter.hasNext())

{if(aIter.hasNext())

aIter.next();

aIter.add(bIter.next());

}

System.out.println(a);//在b中每隔两个元素删除一个

bIter=b.iterator();while(bIter.hasNext())

{

bIter.next();if(bIter.hasNext())

{

bIter.next();//remove跟next是成对出现的,remove总是删除前序

bIter.remove();

}

}

System.out.println(b);//删除a中所有的b中的元素

a.removeAll(b);

System.out.println(a);

}

}

2.4HashMap

2.5WeekHashMapDemo

packageedu.sjtu.erplab.collection;importjava.util.WeakHashMap;public classWeekHashMapDemo {public static voidmain(String[] args) {int size = 100;if (args.length > 0) {

size= Integer.parseInt(args[0]);

}

Key[] keys= newKey[size];

WeakHashMap whm = new WeakHashMap();for (int i = 0; i < size; i++) {

Key k= newKey(Integer.toString(i));

Value v= newValue(Integer.toString(i));if (i % 3 == 0) {

keys[i]= k;//强引用

}

whm.put(k, v);//所有键值放入WeakHashMap中

}

System.out.println(whm);

System.out.println(whm.size());

System.gc();try{//把处理器的时间让给垃圾回收器进行垃圾回收

Thread.sleep(4000);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(whm);

System.out.println(whm.size());

}

}classKey {

String id;publicKey(String id) {this.id =id;

}publicString toString() {returnid;

}public inthashCode() {returnid.hashCode();

}public booleanequals(Object r) {return (r instanceof Key) &&id.equals(((Key) r).id);

}public voidfinalize() {

System.out.println("Finalizing Key " +id);

}

}classValue {

String id;publicValue(String id) {this.id =id;

}publicString toString() {returnid;

}public voidfinalize() {

System.out.println("Finalizing Value " +id);

}

}

输出结果

{50=50, 54=54, 53=53, 52=52, 51=51, 46=46, 47=47, 44=44, 45=45, 48=48, 49=49, 61=61, 60=60, 63=63, 62=62, 65=65, 64=64, 55=55, 56=56, 57=57, 58=58, 59=59, 76=76, 75=75, 74=74, 73=73, 72=72, 71=71, 70=70, 68=68, 69=69, 66=66, 67=67, 85=85, 84=84, 87=87, 86=86, 81=81, 80=80, 83=83, 82=82, 77=77, 78=78, 79=79, 89=89, 88=88, 10=10, 90=90, 91=91, 92=92, 93=93, 94=94, 95=95, 96=96, 97=97, 98=98, 99=99, 20=20, 21=21, 12=12, 11=11, 14=14, 13=13, 16=16, 15=15, 18=18, 17=17, 19=19, 8=8, 9=9, 31=31, 4=4, 32=32, 5=5, 6=6, 30=30, 7=7, 0=0, 1=1, 2=2, 3=3, 29=29, 28=28, 27=27, 26=26, 25=25, 24=24, 23=23, 22=22, 40=40, 41=41, 42=42, 43=43, 38=38, 37=37, 39=39, 34=34, 33=33, 36=36, 35=35}

Finalizing Key98Finalizing Key97Finalizing Key95Finalizing Key94Finalizing Key92Finalizing Key91Finalizing Key89Finalizing Key88Finalizing Key86Finalizing Key85Finalizing Key83Finalizing Key82Finalizing Key80Finalizing Key79Finalizing Key77Finalizing Key76Finalizing Key74Finalizing Key73Finalizing Key71Finalizing Key70Finalizing Key68Finalizing Key67Finalizing Key65Finalizing Key64Finalizing Key62Finalizing Key61Finalizing Key59Finalizing Key58Finalizing Key56Finalizing Key55Finalizing Key53Finalizing Key52Finalizing Key50Finalizing Key49Finalizing Key47Finalizing Key46Finalizing Key44Finalizing Key43Finalizing Key41Finalizing Key40Finalizing Key38Finalizing Key37Finalizing Key35Finalizing Key34Finalizing Key32Finalizing Key31Finalizing Key29Finalizing Key28Finalizing Key26Finalizing Key25Finalizing Key23Finalizing Key22Finalizing Key20Finalizing Key19Finalizing Key17Finalizing Key16Finalizing Key14Finalizing Key13Finalizing Key11Finalizing Key10Finalizing Key8Finalizing Key7Finalizing Key5Finalizing Key4Finalizing Key2Finalizing Key1{54=54, 51=51, 45=45, 48=48, 60=60, 63=63, 57=57, 75=75, 72=72, 69=69, 66=66, 84=84, 87=87, 81=81, 78=78, 90=90, 93=93, 96=96, 99=99, 21=21, 12=12, 15=15, 18=18, 9=9, 6=6, 30=30, 0=0, 3=3, 27=27, 24=24, 42=42, 39=39, 33=33, 36=36}

疑问:为什么value没有被回收。

3.比较

是否有序

是否允许元素重复

Collection

List

Set

AbstractSet

HashSet

TreeSet

是(用二叉排序树)

Map

AbstractMap

使用key-value来映射和存储数据,key必须唯一,value可以重复

HashMap

TreeMap

是(用二叉排序树)

转载内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值