HashMapKey&Lmmutable类型使用原理

思考,为什么我们在HashMap put key 的时候经常使用String 或者Integer?

为北海街道等地区用户提供了全套网页设计制作服务,及北海街道网站建设行业解决方案。主营业务为成都做网站、成都网站设计、北海街道网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

A:String 、Integer 都是final 修饰的累,都很好的重写了 hashCode 和 equals方法,最关键的他们是Immutable类,为不可变类。可以保证hashCode的稳定性。

不可变类的优点与用途

1. 线程安全,省去了加锁的过程,因为对象内容不可变就不用担心线程同时对对象做修改

2. 拷贝效率高。当类不可变时, 拷贝其对象只需拷贝指针即可,而不用拷贝对象本身,不用担心会被修改

3. 可以作为HashMap的key,类不可变保证了Hashcode的稳定性。

如果让你实现一个自定义的class作为HashMap的key该如何实现?

A:主要关注两点即可

覆写hashCode以及equals方法应该遵循的原则

实现一个Immutable的类,那么如何实现一个不可变类呢。

1)类需要用final修饰

2)成员变量使用 private final 修饰、对外不提供set方法。

3)如果成员函数使用构造函数去接受外部的数据,成员变量,需要使用接受对象的拷贝(copy)

4)Get方法返回外部接受的成员变量,返回成员变量的拷贝(copy)

package com.jessyframe.learn;

import java.lang.String;
import java.utils.Arrays;
/**
*
* Created by jessy on 2022/12/24.
*/
public final class Immutable {
private final int identity;
private final String value;
private final int[] arr;

public Immutable(int identity, String value, int[] outArr) {
this.identity = identity;
this.value = value;
//this.arr = outArr; //不正确
this.arr = outArr.clone();//使用传入数组的copy初始化
}

public int[] getArr() {
//return arr; //不正确
return arr.clone(); //返回数组的copy
}


public static void main(String[] args) {
int[] arr = new int[]{12,34};
Immutable im = new Immutable(123,"jessyframe", arr);
int[] arr1 = im.getArr();
Arrays.stream(arr1).forEach((e) -> {System.out.println(e);});
arr[0] = 56;
arr[1] = 78;
Arrays.stream(arr1).forEach((e) -> {System.out.println(e);});
}

}

当前标题:HashMapKey&Lmmutable类型使用原理
网站链接:http://www.shufengxianlan.com/qtweb/news42/177742.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联