List,Set集合接口及实现类应用

List集合接口规范概述

List接口继承自————Collection————Iterable。Iterable仅定义了一个迭代器
Iterable接口循环迭代方式访问集合中的数据元素,定义了唯一一个返回指向集合的Iterator迭代器。它主要通过foreach方式处理集合中的元素,任何其实现类都可以通过获取指向集合的迭代实现对集合的遍历。
List接口间接继承自Iterable接口 并在 Collection直接父接口基础上定义更多的可操作方法,最典型就是定义了以索引方式操作集合元素的方法

List集合接口常用方法

  1. boolean add(Object e):添加Object对象e,判断添加是否成功并返回,除非JVM内存问题,一般不会失败
  2. void add(int index,Object element):在索引index处插入Object对象element,并非更改,插入后后方索引全部后移一位
  3. void clear():清空集合
  4. boolean contains(Object o):判断集合中是否包含Object对象o
  5. Object get(int index):取出index索引处的元素并返回Object
  6. boolean isEmpty():判断集合是否为空
  7. Iterator< E> iterator():获取集合迭代器
  8. Object remove(int index):移除索引index对应的对象,并返回该对象
  9. boolean remove(Object o):删除指定对象o,判断是否删除成功并返回
  10. Object set(int index,Object element):在索引index处以element替换原有对象
  11. int size():获取集合大小

List接口实现类ArrayList

ArrayList集合类是 List接口的大小可变数组的实现。实现了所有可选列表的操作,并允许包括null在内的所有元素。出来试下List接口外,此类还提供一些方法来操作内部 涌来的存储列表的数组的大小(此类大致上等于Vector类,出来此类是非线程同步的)。ArrayList查找访问集合元素速度比较快,删除,删除随机操作比较慢,经常在企业级开发中使用ArrayList处理数据应用。

		List l = new ArrayList();//以实例ArrayList创建List对象
		
		/*用于示例的对象*/
		int objint = 0;
		int objint2 = 1;
		int objint3 = 2;
		char ch = 'a';
		
		/*集合中元素的增删*/
		l.add(objint);//加入ojbint并判断是否成功,此处返回true
		l.add(0, objint2);//在索引0处加入objint2,原有的objint索引变为1
		l.remove(null);//删除指定对象null并判断是否成功,此处返回false
		l.remove(0);//删除索引0的对象并返回
		
		/*修改*/
		l.set(0, objint3);//将索引为0处的对象更改为objint3
		
		/*获取迭代器*/
		Iterator iterator = l.iterator();
		while(iterator.hasNext()) {//条件为当集合存在下一个元素时执行
			Object obj = iterator.next();
			int objint4 = (int)obj;
			System.out.print(objint4);
		}
		
		/*清空集合与空集判断*/
		l.clear();
		l.isEmpty();

List集合实现类Vector

Vector也被称为项量集合,和ArrayList非常类似都是可变的动态数组集合,最大区别是Vector是线程同步的,相对ArrayList处理可能被多个线程并发访问的数据。
Vector集合具有ArrayList的所有方法以外,增加了public Enumerationelements()方法,此方法返回Enumeration枚举接口,可使用此接口实现对集合的遍历

		/*创建元素*/
		Object obj = new Object();
		Object obj2 = new Object();
		Object obj3 = new Object();
		
		/*创建vector对象*/
		Vector list = new Vector();
		
		Enumeration enu = list.elements();//获取Vector独有的方法提供元素枚举迭代器
		
		while(enu.hasMoreElements()) {
			
		}

Set接口规范概述

Set接口继承自————Collection————Iterable。
Iterable接口循环迭代方向访问集合中的数据元素,定义了唯一 一个返回指向集合的Iterator迭代器 。它主要通过 foreach方式处理集合中的元素,任何其实现类都可以通过获取指向集合的迭代实现对集合的遍历。
Set接口只能存储不相等的对象,Set接口是数学Set的抽象描述,与ArrayList不同,它其中的元素不带有任何索引,不能使用索引方式访问集合中的元素。
Set接口通常追加,遍历元素比较慢,随机删除修改数据速度稍快。

Set集合接口常用方法

  1. boolean add(Object e):添加Object对象e,判断添加是否成功并返回,除非JVM内存问题,一般不会失败
  2. void clear():清空集合
  3. boolean contains(Object o):判断集合中是否包含Object对象o
  4. Iterator< E>iterater():获取集合迭代器
  5. boolean remove(Object o):删除指定对象o,判断是否删除成功并返回
  6. int size():获取集合大小
  7. boolean isEmpty():判断集合是否为空
  8. Object[] toArray():将集合转化为Object数组返回

Set接口实现类HashSet

此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是不保证该顺序恒久不变。此类允许使用null元素。
HashSet实现不是同步的。如果多个线程同时访问一个HashSet,而其中至少一个线程修改了该set,那么它必须保持外部同步。

下面只展示set与list不同之处

public class Goods {

	private String name;
	private int price;
	private String number;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	
}

测试类

		/*创建需要存入的元素*/
		Goods good0 = new Goods();
		Goods good2 = new Goods();
		Goods good3 = new Goods();
		good0.setName("篮球");
		good0.setPrice(300);
		good0.setNumber(UUID.randomUUID().toString());//UUID.randomUUID()是指通过UUID算法得到一个随机数 
		good2.setName("足球");
		good2.setPrice(200);
		good2.setNumber(UUID.randomUUID().toString());
		good3.setName("乒乓球");
		good3.setPrice(5);
		good3.setNumber(UUID.randomUUID().toString());
		
		
		
		/*创建一个set集合*/
		Set set = new HashSet(3);//设定初始容量,开辟可存3个数据的空间,存满后再存则扩展
		
		/*添加元素*/
		set.add(good2);
		set.add(good0);
		set.add(good3);
		
		/*添加重复对象*/
		Goods good4 = good3;
		set.add(good4);//出现重复对象时,会覆盖 而不是 共存
		
		/*创建迭代器*/
		Iterator it = set.iterator();
		
		/*遍历 */
		while(it.hasNext()) {
			Goods goodp = (Goods)it.next();
			System.out.println(goodp.getName()+"\t"+goodp.getPrice()+"\t"+goodp.getNumber());
		}//无序的存储
		
		/*将元素封装放入Object数组*/
		Object []obj =  set.toArray();
		for(Object o:obj) {
			Goods goodp =(Goods)o;
			System.out.println(goodp.getName()+"\t"+goodp.getPrice()+"\t"+goodp.getNumber());
		}

Set接口实现类TreeSet

TreeSet是基于TreeMap的NavigableSet实现并实现了SortedSet排序接口。使用元素的自然顺序对元素进行排序或者根据创建set时提供的Comparator进行排序。
TreeSet实现不是同步的。如果多个线程同时访问一个TreeSet,而其中至少一个线程修改了该set,那么它必须与外部同步。
由于排序,通常此类比HashSet效率要低。

TreeSet常用方法

  1. public TreeSet(Comparator< E> comparator):构造器,内含一个comparator排序器,所以会升序排序集合,也可自定义排序方式作为排序器
  2. public Iterator< E> descendingIterator():降序排序迭代器
  3. public E last():获取最后一个元素
  4. public E first():获取第一个元素
		/*创建TreeSet实例对象*/
		TreeSet set = new TreeSet();
		
		/*添加元素*/
		set.add(new Integer(100));
		set.add(new Integer(300));
		set.add(new Integer(400));
		set.add(new Integer(200));
		set.add(new Integer(500));
		
		/*默认遍历 */
		Iterator iterator = set.iterator();
		while(iterator.hasNext()) {
			int i = (int)iterator.next();
			System.out.print(i+" ");
		}//输出为100 200 300 400 500 升序排序
		
		System.out.print("\n");
		
		/*倒序遍历*/
		Iterator it = set.descendingIterator();
		while(it.hasNext()) {
			int i = (int)it.next();
			System.out.print(i+" ");
		}//输出为500 400 300 200 100 倒序排序

自定义排序方式(根据商品价格降序排序)
排序方式类

public class GoodsSort implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		
		Goods goodPrice = (Goods)o1;
		Goods goodPrice2 = (Goods)o2;
		
		if(goodPrice.getPrice()>goodPrice2.getPrice())
			return -1;//第一个大于第二个,返回-1,不执行交换位置,降序
		else
			return 1;
	}

}

商品类

public class Goods {

	private String name;
	private int price;
	private String number;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	
}

测试类

		/*创建需要存入的元素*/
		Goods good0 = new Goods();
		Goods good2 = new Goods();
		Goods good3 = new Goods();
		good0.setName("篮球");
		good0.setPrice(300);
		good0.setNumber(UUID.randomUUID().toString());//UUID.randomUUID()是指通过UUID算法得到一个随机数 
		good2.setName("足球");
		good2.setPrice(200);
		good2.setNumber(UUID.randomUUID().toString());
		good3.setName("乒乓球");
		good3.setPrice(5);
		good3.setNumber(UUID.randomUUID().toString());
		
		/*创建一个采用默认树形集合排序的集合对象*/
		TreeSet tree = new TreeSet(new GoodsSort());//将默认排序器改为重写的GoodsSort
		
		/*添加数据*/
		tree.add(good2);
		tree.add(good3);
		tree.add(good0);
		
		/*创建迭代器*/
		Iterator it = tree.iterator();
		
		/*遍历 */
		while(it.hasNext()) {
			Goods goodp = (Goods)it.next();
			System.out.println(goodp.getName()+"\t"+goodp.getPrice()+"\t"+goodp.getNumber());
		}

Set接口实现类LinkedHashSet

基于哈希表和链接列表的Set接口的实现类,与HashSet无序集合相比,LinkedHashSet的迭代是一个可以被预知的访问操作,它以添加到集合中的顺序为迭代最终顺序。
由于LinkedHashSet需要维护元素顺序,因此其效率比HashSet要稍低一些
通常在需要保证使用Set接口并安装存储顺序迭代时食用此类
用法与HashSet相同

不同集合及其实现类的选择

  • List:需要随时能够查找到指定元素,即需要索引查找元素
  • Set:集中删除或者修改大量元素时,效率更高
  • ArrayList:非线程应用中,无需线程同步
  • Vector:需要保证线程同步
  • HashSet:无特殊目的时可用
  • TreeSet:需要自定义元素的排序方式
  • LinkedHashSet:需要保证取出数据的顺序与存入的顺序相同
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值