为什么final类型map和list内容可以修改


1

   final List<String> list =  new ArrayList<String>();
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        list1 = list2;
        list = list1;//这行是不能通过编译的

list定义为final是指该引用是final啦,但是list里面的值不是final的,所以可以修改。



2.

final 类型的map活arrList中 put 或添加数据并不是修改原有变量的内存指向地址。只是给这个地址中加了更多的值而已。 但是
final String s ="123"  s = " 456"; 这等于指向了两个内存地址。 final的意思是不可变最终的  是指他内存中所指向的内存地址是不可变是最终的


对List或map的add或put操作,没有修改引用。而对字符串的修改,是整个引用都要指向一个不同的字符串了。

### 含义 `private static final List<Map<String, String>> MOUDLES` 声明了一个变量,下面对各修饰符类型进行详细解释: - `private`:此为访问修饰符,意味着该变量只能在声明它的类内部被访问,其他类无法直接访问,保证了数据的封装性。 - `static`:表明这个变量是类级别的,而非实例级别的。无论创建多少个该类的实例,这个变量都仅有一份,可通过类名直接访问,无需创建类的实例。 - `final`:表示该变量是一个常量,一旦被赋值,其引用就不能再指向其他对象。不过,如果该变量引用的是一个可变对象(如 `List` 及其内部的 `Map`),那么对象本身的内容是可以修改的,但不能让该变量引用其他 `List` 对象。 - `List<Map<String, String>>`:这是变量的类型,`List` 是 Java 中的一个接口,代表一个有序的集合。`<Map<String, String>>` 是泛型的使用,限定了这个 `List` 中只能存储 `Map<String, String>` 类型的元素,即每个元素是一个键值对都为 `String` 类型的 `Map`。 - `MOUDLES`:是变量的名称,按照 Java 的命名规范,常量名使用全大写字母,多个单词之间用下划线分隔。 ### 用法 #### 声明初始化 ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ModuleExample { private static final List<Map<String, String>> MOUDLES; static { MOUDLES = new ArrayList<>(); Map<String, String> module1 = new HashMap<>(); module1.put("key1", "value1"); MOUDLES.add(module1); Map<String, String> module2 = new HashMap<>(); module2.put("key2", "value2"); MOUDLES.add(module2); } public static void main(String[] args) { for (Map<String, String> module : MOUDLES) { for (Map.Entry<String, String> entry : module.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } } ``` #### 访问修改元素 虽然 `final` 修饰的 `List` 引用不能改变,但 `List` 中的 `Map` 元素是可以修改的,`Map` 中的键值对也可以修改。 ```java if (!MOUDLES.isEmpty()) { Map<String, String> firstModule = MOUDLES.get(0); firstModule.put("newKey", "newValue"); } ``` #### 提供公共访问方法 由于使用了 `private` 修饰符,该变量只能在声明它的类内部被访问。如果其他类需要使用这个 `List` 中的元素,可以提供公共的访问方法。 ```java public static List<Map<String, String>> getModules() { return new ArrayList<>(MOUDLES); // 返回一个副本,避免外部修改原始 List } ``` #### 不可变处理 如果需要一个真正不可变的 `List` 及其内部的 `Map`,可以使用 `Collections.unmodifiableList` `Collections.unmodifiableMap` 方法。 ```java import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class ImmutableListExample { private static final List<Map<String, String>> MOUDLES; static { List<Map<String, String>> tempList = new ArrayList<>(); Map<String, String> tempMap = new HashMap<>(); tempMap.put("key1", "value1"); tempList.add(Collections.unmodifiableMap(tempMap)); MOUDLES = Collections.unmodifiableList(tempList); } public static void main(String[] args) { // 以下代码会抛出 UnsupportedOperationException // MOUDLES.add(new HashMap<>()); // MOUDLES.get(0).put("newKey", "newValue"); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值