【文件属性】:
文件名称: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)
网友评论
- 呵呵,还不错