关于hashCode 分析还有有序集合与无序集合的存取条件,避免造成内容泄露
来源:互联网 发布:淘宝分期免息怎么设置 编辑:程序博客网 时间:2024/05/21 09:02
package AdvanceJava;
import static java.lang.System.out;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.TreeSet;
class My implements Comparator
{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return 0;
}
}
class Person_Hash implements Comparable
{
public String name;
public int age;
public Person_Hash(String name,int age)
{
this.name = name;
this.age = age;
}
public boolean equals(Object obj)
{
Person_Hash p = (Person_Hash)obj;
if(obj==null || !(p instanceof Person_Hash))
return false;
if(p.name.equals(this.name)&&(p.age == this.age))
return true;
else
return false;
}
public int hashCode()
{
return name.hashCode()+age*9;
}
public int compareTo(Object o) {
return 1;
}
}
/*
* 对于 存入到 hash 表中的元素(HashSet HashMap)如果存入后
* 就不要再改变有可以影响hashCode 结果的成员的值,
* 如果你在存入后改变了它的该对象的HashCode 的值,那么
* 该对象则不是你已经存入的那个,所以那个对象则不会再被使用,
* 日积月累,造成内在的泄露
*
*
*/
public class HashCodeTest {
public static void main(String args[])
{
Collection col = new HashSet();
Person_Hash p1 = new Person_Hash("boy",22);
Person_Hash p2 = new Person_Hash("boy",22);
Person_Hash p3 = new Person_Hash("boy",22);
Person_Hash p4 = new Person_Hash("boy",22);
col.add(p1);
col.add(p2);
col.add(p3);
col.add(p4);
out.println(col.size()); //输出结果为1,对于set 集合,其存取的条件在于hashcode 与 equals 两个方法的
//的返回值,在源代码里有这样一个条件
// e.hash == hash &&(e.key == k || key.equals(e.key))
//trytree();
memeryOut();
}
public static void trytree()
{
Collection col = new TreeSet();
Person_Hash p1 = new Person_Hash("boy",22);
Person_Hash p2 = new Person_Hash("boy",22);
Person_Hash p3 = new Person_Hash("boy",22);
Person_Hash p4 = new Person_Hash("boy",22);
col.add(p1);
col.add(p2);
col.add(p3);
col.add(p4);
out.println(col.size()); //其结果为4.因为它们的comparator 一直相等,所以都被存入进集合
// 可知,对于 有序集合来说,其存取的责任都落在了comparator 上,无论hashcode
//与equals 是否相等,只要comparator 返回不等于0,那它都将会被存入集合
}
public static void memeryOut()
{
Collection set = new HashSet();
Person_Hash p1 = new Person_Hash("boy",22);
Person_Hash p2 = new Person_Hash("girl",21);
Person_Hash p3 = new Person_Hash("person",222);
set.add(p1);
set.add(p2);
set.add(p3);
out.println(set.size());// 现在的结果是3
p1.name = "dog";
set.remove(p1);
out.println(set.size());// 现在的结果然后是3,因为我们在前面改变了p1的name.也就是间接改变了hashcode值
// 而hash 在取值的时候,依靠的就是hashcode,而我们改变了它的hashcode ,所以也就找不到了
//修改生的 p1 对象,所以:
// 我们对已经存入set 集合中的对象不要再修改其影响hashcode 计算的属性,不然会
//造成内在泄露,这个很重要,而且不容易检查出来
}
}
- 关于hashCode 分析还有有序集合与无序集合的存取条件,避免造成内容泄露
- 有序集合与无序集合
- 有序集合与无序集合
- 有序集合与无序集合
- 【Java集合框架】Map与Set的有序与无序
- JAVA 有序集合 无序集合
- 有序集合和无序集合
- 【转载】java集合的有序和无序
- java之有序集合/无序集合
- 重写对象的hashCode()方法来对无序集合排序
- Java集合的有序、无序、排序性质讨论
- Java集合中有关有序,无序的概念
- 集合的排序 一个集合中存储无序元素 使其有序化(字典顺序) 不去重
- 集合中 hashcode 与 equals 的关系
- 集合无序性的体验
- 四:redis的sets类型相关操作(有序和无序集合)
- Java中的集合存储数据后,输出数据的有序和无序问题
- 避免引用Context造成的内存泄露
- 迭代器失效问题
- Windows 7 Java 环境变量的设置
- vmware上安装centos4.5
- C#2.0泛型学习
- 搜索引擎网络推广方式(一)
- 关于hashCode 分析还有有序集合与无序集合的存取条件,避免造成内容泄露
- JNDI、JDBC、Connection Pool的关系
- 谁说只有外企办公环境好?come on !带你看传智播客新家喽
- 当一个女人做到这样,她已经变了
- 使用ShellExecute打开目标文件所在文件夹并选中目标文件
- 时间格式的转换
- 关于SQL语句中的双引号、单引号和&
- lock-free/wait-free算法以及ABA问题
- 如何实现截取无规则字符串中的数字部分