Java的一些高级特性(四)——集合

Java的集合类型主要有如下几种:

Set/Queue/List/Set/Tree/Stack等。


我们首先来看一个HashSet的用法:

package com.freesoft.javaadvanced;

import java.util.HashSet;

import com.freesoft.testentity.Kalamata;
import com.freesoft.testentity.Ligurio;
import com.freesoft.testentity.Olive;
import com.freesoft.testentity.Picholine;

public class TestHashSet {
	public static void printSize(HashSet<Olive> olives){
		System.out.println("There are " + olives.size() + " olives in the set.");
	}
	public static void main(String[] args) {
		HashSet<Olive> olives = new HashSet<>();
		Olive k = new Kalamata();
		Olive l = new Ligurio();
		Olive p = new Picholine();
		olives.add(k);
		olives.add(l);
		printSize(olives);
		olives.add(p);
		printSize(olives);
		// 由于HashSet内部元素需要通过Hash Value识别,所以同一个元素无法保存两次
		olives.add(p);
		printSize(olives);
		// HashSet中可以添加null
		olives.add(null);
		printSize(olives);
		// 删除元素
		olives.remove(k);
		printSize(olives);
		
	}

}


注意每次运行的时候HashSet内元素的顺序不是一成不变的。



接下来我们看看如何使用TreeSet。TreeSet是一个自动排序的集合,所以我们需要对泛型对象的类实现Comparable接口:

package com.freesoft.testentity;

public class Olive implements Comparable<Olive>{
	public static final long BLACK = 0x000000;
	private String name;
	private long color = BLACK;
	
	public Olive(){
	}

	public Olive(String name) {
		// 由于字段color已经被设置为默认值为BLACK,故这里无需再次设置
		this.name = name;
	}
	
	public Olive(String name, long value) {
		super();
		this.name = name;
		this.color = value;
	}
	
	@Override
	public String toString() {
		return "Olive [name=" + name + ", color=" + color + "]";
	}

	@Override
	public int compareTo(Olive arg0) {
		String s1 = this.name;
		String s2 = arg0.name;
		
		return s1.compareTo(s2);
	}
}

我们再按照如下的规则实现子类:

package com.freesoft.testentity;

public class Kalamata extends Olive {
	public Kalamata() {
		super("Kalamata");
	}
}

最后我们的测试程序是这样:

package com.freesoft.javaadvanced;

import java.util.HashSet;
import java.util.TreeSet;

import com.freesoft.testentity.Kalamata;
import com.freesoft.testentity.Ligurio;
import com.freesoft.testentity.Olive;
import com.freesoft.testentity.Picholine;

public class TestTreeSet {
	public static void printSize(TreeSet<Olive> olives){
		System.out.println("There are " + olives.size() + " olives in the set.");
	}
	public static void main(String[] args) {
		Olive l = new Ligurio();
		Olive p = new Picholine();
		Olive k = new Kalamata();
		
		TreeSet<Olive> olives = new TreeSet<>();
		try {
			olives.add(k);
			olives.add(l);
			olives.add(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println(olives);
	}

}

从上面的程序可以看出,随便我们添加的时候的元素顺序是什么,TreeSet在添加的过程中会自动按照排序顺序插入元素。



我们在来看看LinkedList这个列表:

package com.freesoft.javaadvanced;

import java.util.LinkedList;

import com.freesoft.testentity.Kalamata;
import com.freesoft.testentity.Ligurio;
import com.freesoft.testentity.Olive;
import com.freesoft.testentity.Picholine;

public class TestLinkedList {
	public static void main(String[] args) {
		Olive k = new Kalamata();
		Olive l = new Ligurio();
		Olive p = new Picholine();
		
		LinkedList<Olive> list = new LinkedList<>();
		list.add(k);
		list.add(l);
		list.add(p);
		System.out.println(list);
		// 这里的add实际上是执行插入操作,且列表中的元素可以反复添加
		list.add(2, k);
		System.out.println(list);
		// 改变元素属性,该对象在列表中的引用也会及时更新
		k.setColor(0xff0000);
		System.out.println(list);
	}

}

最后我们看看队列。队列的方法比较简单,就是一个先进先出(FIFO)的操作:

我们先看一下之前的list,我们通过帮助得知LinkedList实现了Queue接口。注意体会peek和poll的区别,一个删除元素一个不删除。

package com.freesoft.javaadvanced;

import java.util.LinkedList;

import com.freesoft.testentity.Kalamata;
import com.freesoft.testentity.Ligurio;
import com.freesoft.testentity.Olive;
import com.freesoft.testentity.Picholine;

public class TestLinkedList {
	public static void main(String[] args) {
		Olive k = new Kalamata();
		Olive l = new Ligurio();
		Olive p = new Picholine();
		
		LinkedList<Olive> olives = new LinkedList<>();
		olives.add(k);
		olives.add(l);
		olives.add(p);
		System.out.println(olives);
		// 这里的add实际上是执行插入操作,且列表中的元素可以反复添加
		olives.add(2, k);
		System.out.println(olives);
		// 改变元素属性,该对象在列表中的引用也会及时更新
		k.setColor(0xff0000);
		System.out.println(olives);
		Olive o1 = olives.poll();
		System.out.println(o1);
		System.out.println(olives);
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值