文件名称:java集合知识-map、set等
文件大小:7KB
文件格式:ZIP
更新时间:2016-01-03 14:27:56
java 集合
Set:元素不可以重复,是无序。p508 Set接口中的方法和Collection一致。 |--HashSet: 内部数据结构是哈希表 ,是不同步的。 如何保证该集合的元素唯一性呢? 是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。 import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; public class HashSetTest { public static void main(String[] args) { HashSet hs = new LinkedHashSet(); hs.add("hahah"); hs.add("hehe"); hs.add("heihei"); hs.add("xixii"); hs.add("hehe"); Iterator it = hs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } 例子2-1: import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override//覆盖hasCode() public int hashCode() { // System.out.println(this+".......hashCode"); return name.hashCode()+age*27; // return 100; } @Override//覆盖equals方法 public boolean equals(Object obj) { if(this == obj) return true; if(!(obj instanceof Person)) throw new ClassCastException("类型错误"); // System.out.println(this+"....equals....."+obj); Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } //import cn.itcast.p.bean.Person; /* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */ public class HashSetTest { /** * @param args */ public static void main(String[] args) { HashSet hs = new HashSet(); /* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 * */ hs.add(new Person("lisi4",24)); hs.add(new Person("lisi7",27)); hs.add(new Person("lisi1",21)); hs.add(new Person("lisi9",29)); hs.add(new Person("lisi7",27)); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); //it.next()是Object对象,必须要强转,如果不强转的话,则会输出对象的哈希码 System.out.println(p); System.out.println(p.getName()+"...."+p.getAge()); } } } /* 结果如下: f:\tang>javac HashSetTest.java 注: HashSetTest.java使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 f:\tang>java HashSetTest Person@6236515 lisi9....29 Person@6236435 lisi1....21 Person@62364dd lisi7....27 Person@6236489 lisi4....24 */ 例子2-2 package test; import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override//覆盖hasCode() public int hashCode() { // System.out.println(this+".......hashCode"); return name.hashCode()+age*27; // return 100; } @Override//覆盖equals方法 public boolean equals(Object obj) { if(this == obj) return true; if(!(obj instanceof Person)) throw new ClassCastException("类型错误"); // System.out.println(this+"....equals....."+obj); Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { // TODO Auto-generated method stub return "姓名: "+this.name+"; 年龄"+this.age; } } //import cn.itcast.p.bean.Person; /* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */ public class HashSetDemo { public static void main(String[] args) { HashSet hs = new HashSet(); /* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 * */ hs.add(new Person("lisi4",24)); hs.add(new Person("lisi7",27)); hs.add(new Person("lisi1",21)); hs.add(new Person("lisi9",29)); hs.add(new Person("lisi7",27)); System.out.println(hs); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); //it.next()是Object对象,必须要强转,如果不强转的话,则会输出对象的哈希码 //System.out.println(p); //System.out.println(p.getName()+"...."+p.getAge()); } } } 输出结果如下:(和例子2有所不同,下面的结果是覆盖了父类Object的toString方法,所运行出来的结果。如果不覆盖,则输出每个对象的哈希码) [姓名: lisi9; 年龄29, 姓名: lisi1; 年龄21, 姓名: lisi7; 年龄27, 姓名: lisi4; 年龄24] 例子2-3: package test; import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override//覆盖hasCode() public int hashCode() { // System.out.println(this+".......hashCode"); return name.hashCode()+age*27; // return 100; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { // TODO Auto-generated method stub return "姓名: "+this.name+"; 年龄"+this.age; } } //import cn.itcast.p.bean.Person; /* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */ public class HashSetDemo { /** * @param args */ public static void main(String[] args) { HashSet hs = new HashSet(); /* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 * */ //hs.add(new Demo("abc")); hs.add(new Person("lisi4",24)); hs.add(new Person("lisi7",27)); hs.add(new Person("lisi1",21)); hs.add(new Person("lisi9",29)); hs.add(new Person("lisi7",27)); //System.out.println(hs); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); //it.next()是Object对象,必须要强转,如果不强转的话,则会输出对象的哈希码 //System.out.println(p); System.out.println(p.getName()+"...."+p.getAge()); } } } 结果如下:(由于没有覆盖equals方法的原因) lisi9....29 lisi1....21 lisi7....27 lisi7....27 lisi4....24 例子3: import java.util.HashSet; import java.util.Iterator; public class HashSetTest { public static void main(String[] args) { HashSet hs = new HashSet(); hs.add("hehe"); hs.add("heihei"); hs.add("hahah"); hs.add("xixii"); hs.add("hehe"); Iterator it = hs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } f:\tang>javac HashSetTest.java 注: HashSetTest.java使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 f:\tang>java HashSetTest heihei hehe hahah xixii //重复的元素只会输出一次,而且无序 f:\tang> 例子4: package test; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; public class HashSetDemo { public static void main(String[] args) { HashSet hs = new HashSet(); hs.add("hahah"); hs.add("hehe"); hs.add("heihei"); hs.add("xixii"); hs.add("hehe"); hs.add(1.2);//浮点型 hs.add(1234);//整型 Iterator it = hs.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } 以上程序不会报错,运行结果如下: (是由于没有使用泛型造成的) heihei hehe 1234 hahah 1.2 xixii
【文件预览】:
java集合知识
----HashSet类.txt(9KB)
----TreeSet类.txt(5KB)
----Map.txt(6KB)
----泛型.txt(2KB)