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():4setTests2.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;}@Overridepublic 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;}@Overridepublic 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():4setTests2.size():3

由上可知,Set集合的非重复是取决于哈希值的,默认情况下的hashCode算出的值是加上了内存地址等数值,所以第一次Set的集合输出也为4,第二次则是3

今天不想走,明天就要跑了。

java集合框架的学习

相关文章:

你感兴趣的文章:

标签云: