快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

金沙贵宾官网下载:JAVA提高教程(2)认识Set集合之HashSet



聚拢在Java里面的感化不凡,我们常用的有Set,List和Map三种,我们先认识一下Set,分外是HashSet的应用

package collection.lession2;

import java.util.HashSet;

import java.util.Set;

/**

* 老紫竹JAVA前进教程(2)-熟识Set聚拢之HashSet。

* Set用来保存不容许重复的数据。可所以任何工具类型。

* JDK5今后,主类型可以经由过程autobox 放入Set里面。

*

* @author 老紫竹

*

*/

public class Lession2 {

public static void main(String[] args) {

// 通俗测试

testNormal();

// 测试HashSet的特殊性

testForHashSet();

testForHashSet2();

}

/**

* 测试保存混杂类型的数据.

*/

public static void testNormal() {

System.out.println("---金沙贵宾官网下载-- testNormal -----------");

// Set有多个实现,我们先看看最常用的HashSet

Set set = new HashSet();

// 添加一个字符串

set.add("字符串");

// 添加一个整数工具

set.add(new Integer(1));

// 使用JDK5的特点,增添一个浮点数

set金沙贵宾官网下载.add(123.45);

// 我们看看聚拢里工具的数量

System.out.println(set.size());

// 我们考试测验增添一个重复的字符串

set.add("字符串");

// 我们再次看看聚拢里工具的数量

System.out.println(set.size());

// 我们来测试看看是否聚拢里包孕了某个数据

System.out.println(set.contains(123.45));

// 我们从里面把这个浮点数删除

set.remove(123.45);

// 我们再次看看聚拢里工具的数量

System.out.println(set.size());

}

/**

* 专门针对HashSet的测试。

*/

public static void testForHashSet() {

System.out.println("----- testForHashSet -----------");

HashSet set = new HashSet();

// 增添一个null工具

set.add(null);

// 我们再次看看聚拢里工具的数量

System.out.println(set.size());

// 再次增添一个null看看

set.add(null);

// 我们再次看看聚拢里工具的数量

System.out.println(set.size());

MyObject obj = new MyObject("java2000", 2);

set.add(obj);

obj = new MyObject("csdn", 10);

set.add(obj);

// 我们再次看看聚拢里工具的数量

System.out.println(set.size());

// 判断是否包孕某个工具

System.out.println(set.contains(obj));

obj = new MyObject("java2000_net",金沙贵宾官网下载 2);

set.add(obj);

// 我们再次看看聚拢里工具的数量

System.out.println(set.size());

// 我们考试测验把obj再次放入set看看

// 并没有增添,由于是重复的

set.add(obj);

System.out.println(set.size());

// 我们构造一个新的工具,内容和前面的相同

obj = new MyObject("java2000_net", 2);

set.add(obj);

System.out.print金沙贵宾官网下载ln(set.size());

// 我们改动一下obj里面的年岁,再看看

obj.setAge(3);

// 我们再测试看看是否包孕此工具。

// 请留意,我们这个obj和前面的obj是同一个工具

// 我们仅仅改动了一下我们的年岁

System.out.println(set.contains(obj));

// 我们考试测验把obj再次放入set看看

// 我们又增添了长度

set.add(obj);

System.out.println(set.size());

}

/**

* 专门针对HashSet的测试2。

*/

public static void testForHashSet2() {

System.out.println("----- testForHashSet2 -----------");

HashSet set = new HashSet();

MyObject2 obj = null;

for (int i = 0; i < 3; i++) {

obj = new MyObject2("java2000" + i, i);

set.add(obj);

System.out.println(set.size());

}

}

}

class MyObject {

private int age;

private String name;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

MyObject(String name, int age) {

this.name = name;

this.age = age;

}

public boolean equals(Object obj) {

System.out.println("equals");

if (obj == null || !(obj instanceof MyObject)) {

return false;

}

MyObject o = (MyObject) obj;

return this.age == o.age && this.name.equals(o.name);

}

public int hashCode() {

int hashCode = name.hashCode() + String.valueOf(age).hashCode();

return hashCode;

}

}

class MyObject2 {

private int age;

private String name;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

MyObject2(String name, int age) {

this.name = name;

this.age = age;

}

public boolean equals(Object obj) {

System.out.println("equals");

if (obj == null || !(obj instanceof MyObject2)) {

return false;

}

MyObject2 o = (MyObject2) obj;

return this.age == o.age && this.name.equals(o.name);

}

public int hashCode() {

return 1;

}

}

class MyObject3 {

private int age;

private String name;

// 金沙贵宾官网下载采纳一个变量进行节制

// 一旦天生了hashCode,则不再更改

private int HASHCODE = Integer.MIN_VALUE;

public int hashCode() {

if (HASHCODE == Integer.MIN_VALUE) {

// 从新生资源类的hashCode

HASHCODE = name.hashCode() + String.valueOf(age).hashCode();

}

return HASHCODE;

}

}

阐明,针对HashSet:

Set不容许重复

容许 null,重复的null只算一个

判断是否存在一个数据(是否重复),先判断其hashCode是否存在,若存在再逐个判断hashCode相同的数据是否相等

判断是否相等,除了hashCode相等外,还要判断工具引用相等(==),或者 equals

假如一个工具的hashCode更改了,会造成找不到这个工具,也就呈现了内存透露的危险。

hashCode 措施是HashSet里面工具的关键,它的算法影响到了数据的分散和查找效率。某个确认工具的hashCode不应该更改,避免呈现内存透露,可以采纳如下措施,来要领属性变更造成hashCode变更

class MyObject3 {

private int age;

private String name;

// 采纳一个变量进行节制

// 一旦天生了hashCode,则不再更改

private int HASHCODE = Integer.MIN_VALUE;

public int hashCode() {

if (HASHCODE == Integer.MIN_VALUE) {

// 从新生资源类的hashCode

HASHCODE = name.hashCode() + String.valueOf(age).hashCode();

}

return HASHCODE;

}

}

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: