final关键字

对于final的使用,我们通常是希望能够保证变量的值不被改变,这时候我们就需要了解变量引用。

1、String类型。在Java中,String类的设计本身就是不可变的。这时候我们可能会想,不用final修饰的String变量的值不是可以随便修改吗。

是的,但这里说的String的不可变指的创建对象本身,比如

String test= "test";
test = "666";

/**
*这时候其实在内存中就创建了两个对象 
*1)test 2)666 只不过变量test的变量引用改变了,由test变为666
**/

所以final修饰符,是禁止改变变量引用

举个例子来描述的话,就好比你开了一局王者荣耀匹配,本来选定了马可波罗,但是后面觉得可能公孙离会更好点,就更换为公孙离了。你的选用的英雄改变了,但是不代表是把马可波罗改变为公孙离了,而是选用了一个新英雄,马可波罗本身没有发生任何变化。并且,对于字面量,Java编译器和JVM会进行优化,通过字符串常量池来复用相同的字符串字面量,避免不必要的对象创建。就像你后面还是觉得想要选择你的老伙计马可波罗手法操作对面,这时候就还是使用原来的马可波罗,而不是创建一个新的

当你使用final修饰的时候,就好比你开了一局王者荣耀排位当你选定马可波罗的时候,这时候就算你想要选择公孙离,也是没有办法已经不可修改了。

2、Map类型。 Map类型用final修饰,有点不一样的是,该Map变量的引用不会改变,指向的始终是同一个Map对象。但是,这并不阻止Map内部的键值对被修改,除非你采取额外的措施。

为了防止Map内容的修改,可以使用Collections.unmodifiableMap()来创建一个不可变的Map视图。这会阻止对Map的任何修改,包括添加、删除或修改键值对。

 Map<String, Integer> tempMap = new HashMap<>();
   tempMap.put("key", 1);
   final Map<String, Integer> myMap = Collections.unmodifiableMap(tempMap);
   myMap.put("newKey", 2); // 运行时抛出UnsupportedOperationException

最后记录一下,为什么会涉及到这些。因为我需要用到一些键值对常量。

/**
 * 展厅会议室(id与名称的对应关系)
 */
public class ShowroomConstant {
	public static final Map<String, String> MY_CONSTANTS;

	static {
		Map<String, String> tempMap = new HashMap<>();
		tempMap.put("C101", "zGidkDDfk8LR3oXgw");
		tempMap.put("C102", "hNExJQNGzy9L3kz7G");
		tempMap.put("C103", "2F8aXcCwiJiorJG2q");
		tempMap.put("C104", "AzGi2waAWmh9kpJ2i");
		tempMap.put("C105", "syHm5WMBwyw5N4k3Z");
		tempMap.put("C106", "9Jh3PCqdLMXbQ9ezr");
		tempMap.put("C107", "arvnGb754bMB28rQy");
		tempMap.put("C1-TheaterRoom", "B559jNqGeJniXiGeo");
		//使用Collections.unmodifiableMap()可以创建一个内容也不可变的Map
		MY_CONSTANTS = Collections.unmodifiableMap(tempMap);
	}

	private ShowroomConstant() {
		// 私有构造器,防止实例化
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值