-------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
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