java equals和==以及hashmap原理

本文详细介绍了Java中equals方法与==操作符的区别,特别是针对String类型的行为差异。此外,还深入探讨了HashCode的作用及其实现原理,并对比了HashMap与Hashtable的不同之处,包括它们对null键值的支持情况及线程安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

equals方法和==
对于String字符串

  1. equals用来判断字符串的内容是否相同
  2. ==用来判断引用地址是否相同
public class testequals {
    public static void main(String[] args) {
//      User u1 = new User(0, "zym");
//      User u2 = new User(0, "zym");
//      System.out.println("test equals method: "+u1.equals(u2));
//      System.out.println("test == : "+(u1==u2));

        String s = new String("zym");
        String s2 = new String("zym");
        System.out.println("test equals method: "+s.equals(s2));
        System.out.println("test == : "+(s==s2));



    }

}

对于非String字符串所有其他
都是用来判断引用,地址

//Uers 类用于测试
class User{
    private int id;
    private String name;
    //构造方法
    public User(int id,String name) {
        this.id = this.id;
        this.name = this.name;
    }

}
public class testequals {
    public static void main(String[] args) {
        User u1 = new User(0, "zym");
        User u2 = new User(0, "zym");
        System.out.println("test equals method: "+u1.equals(u2));
        System.out.println("test == : "+(u1==u2));

    }

}

引申
HashCode和hashmap
首先hashmap底层是数组+链表。每一个K-V可以看成是一个整体Entry。数组是Entry[],这个Entry中是一个链表。
插入时,根据Key的HashCode,找到内存中对应的位置,插入。如果冲突,即HashCode相同,调用equals方法判断key是不是相同,如果相同返回true,那么对象插入失败,新value覆盖原来的value。否则在key的value链上插入对象,记住是插入到value的链头,我一直以为是链尾。。。重写时equals时参数必须是Object

@Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return true;
    }

取出数据,首先根据key的HashCode找出位置,根据equals方法找出需要的Entry。其实每一个Entry[i]就是一个解决哈希冲突的链表。

  1. Hashmap与hashtable区别
    Hashmap可允许key和value为null,Hashtable不允许。
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;

//测试hashmap的key 和 value是不是可以为空
public class second{
    public static void main(String[] args) {
        HashMap<String, String> mymap = new HashMap<String, String>();
        mymap.put(null, null);
        for (Iterator iterator = mymap.entrySet().iterator(); iterator.hasNext();) {
            Entry<String, String> type = (Entry<String, String>) iterator.next();
            System.out.println(type.getKey()+type.getKey());

        }
        System.out.println("测试hashtable");
        //报错at java.util.Hashtable.put(Unknown Source)
        Hashtable<String, String> mytable = new Hashtable<String, String>();
        mytable.put(null, null);
        for (Iterator iterator = mytable.keySet().iterator(); iterator.hasNext();) {
            Entry<String, String> type = (Entry<String, String>) iterator.next();
            System.out.println(type.getKey()+type.getKey());
        }
    }
}

Hashmap不是线程安全的(fail-fast快速失败),Hashtable 是线层安全的。
Hashtable在jdk1.2就有是Dictionary,hashtable是在jdk1.2引入的,实现map接口
这个博客讲的特比好,我是引用哦
http://www.importnew.com/16301.html

ConcurrentHashmap
分段锁Segment
ConcurrentHashMap采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个Map加锁的设计,分段锁大大的提高了高并发环境下的处理能力。
见博客[http://www.importnew.com/22007.html]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值