java集合框架的学习

-------android培训java培训、期待与您交流! ----------

java集合架构支持3种类型的集合:规则集(Set),线性表(List),和图(Map),分别定义在Set,List,Map中。Set实例存储一组互不相同的元素(集合),List实例存储一组顺序排列的元素(表),Map存储一组 对象---关键值的映射




总的架构如下,非常重要,包含继承关系,实现的分类,一目了然:


Collection接口: 
Set接口:
HashSet具体类
LinkedHashSet具体类
TreeSet具体类
List接口: 
ArrayList具体类
LinkedList具体类
向量类Vector具体类
Stack具体类
Map接口:
HashMap类
LinkedHashMap类
TreeMap类

Collection接口,它是处理对象集合的根接口,提供了一些公用方法,例如iterator(),size(),toArray(),clear()等。

Set和List接口都扩展自Collection,Set集合是不允许重复的、无序的,而List集合是允许重复的、有序的

然后来说Set接口的3种实现:
HashSet的对象必须实现hashCode方法,其中Set集合的不重复性,是在判断hashCode的基础上的,如果hashCode相同,则视为重复,反之为不重复。
LinkedHashSet 此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)。

TreeSet使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。


以下,对Set和List做个比较:

package com.hu;
//未实现hashCode方法
public class Test {
	String name;
	String nickName;
	int age;
	int sex;
	public Test(String name, String nickName, int age, int sex) {
		super();
		this.name = name;
		this.nickName = nickName;
		this.age = age;
		this.sex = sex;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	
}

package com.hu;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CollectionText {
	public static void main(String[] args) {
		Test test = new Test("zhangsan", "xiaozhang", 18, 1);
		Test test2 = new Test("lisi", "xiaoli", 18, 0);
		Test test3 = new Test("wangwu", "xiaowang", 19, 0);
		Test test4 = new Test("zhangsan", "xiaozhang", 18, 1);
		List<Test> listTests = new ArrayList<Test>();
		listTests.add(test);
		listTests.add(test2);
		listTests.add(test3);
		listTests.add(test4);
	
		Set<Test> setTests2 = new HashSet<Test>();
		setTests2.add(test);
		setTests2.add(test2);
		setTests2.add(test3);
		setTests2.add(test4);
		System.out.println("listTests.size():"+listTests.size());
		System.out.println("setTests2.size():"+setTests2.size());
	}
}
输出的结果:
listTests.size():4
setTests2.size():4


当实现hashCode方法:

package com.hu;

public class Test {
	String name;
	String nickName;
	int age;
	int sex;
	public Test(String name, String nickName, int age, int sex) {
		super();
		this.name = name;
		this.nickName = nickName;
		this.age = age;
		this.sex = sex;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result
				+ ((nickName == null) ? 0 : nickName.hashCode());
		result = prime * result + sex;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Test other = (Test) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (nickName == null) {
			if (other.nickName != null)
				return false;
		} else if (!nickName.equals(other.nickName))
			return false;
		if (sex != other.sex)
			return false;
		return true;
	}
	
}
输出的结果:
listTests.size():4
setTests2.size():3
由上可知,Set集合的非重复是取决于哈希值的,默认情况下的hashCode算出的值是加上了内存地址等数值,所以第一次Set的集合输出也为4,第二次则是3








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值