前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java 面试题系列 04】Final 与 String

【Java 面试题系列 04】Final 与 String

作者头像
方才编程_公众号同名
发布2020-11-13 10:39:23
3880
发布2020-11-13 10:39:23
举报
文章被收录于专栏:方才编程
决定每天上午8点整,分享一道 Java 面试题。厚积薄发,每天进步一点点!

【第 4 天】题目

final 的作用,与 String 的不变性!

参考答案

final 在 java 中的作用,我相信大家都知道!

  • final 修饰的类叫最终类,该类不能被继承。
  • final 修饰的方法不能被重写。
  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改【对基本类型来说是其值不可变;对引用变量来说其引用不可变,即不能再指向其他的对象】。

String 的不变性

HashMap 的 key 建议使用不可变类,什么叫不可变类呢?这里说的不可变指的是类值一旦被初始化,就不能再被改变了,如果被修改,将会是新的类

比如说 String 这种不可变类,我们写个 demo 来演示一下。

代码语言:javascript
复制
String s ="hello";
s ="world";

从代码上来看,s 的值好像被修改了,但从 debug 的日志来看,其实是 s 的内存地址已经被修改了,也就说 s =“world” 这个看似简单的赋值,其实已经把 s 的引用指向了新的 String,debug 的截图显示内存地址已经被修改,两张截图如下:

我们从源码上查看一下原因:

代码语言:javascript
复制
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
}    

我们可以看出来两点:

  1. String 被 final 修饰,说明 String 类绝不可能被继承了,也就是说任何对 String 的操作方法,都不会被继承覆写;
  2. String 中保存数据的是一个 char 的数组 value。我们发现 value 也是被 final 修饰的,也就是说 value 一旦被赋值,内存地址是绝对无法修改的,而且 value 的权限是 private 的,外部绝对访问不到,String 也没有开放出可以对 value 进行赋值的方法,所以说 value 一旦产生,内存地址就根本无法被修改。

以上两点就是 String 不变性的原因,充分利用了 final 关键字的特性,如果你自定义类时,希望也是不可变的,也可以模仿 String 的这两点操作。

因为 String 具有不变性,所以 String 的大多数操作方法,都会返回新的 String,如下面这种写法是不对的:

代码语言:javascript
复制
String str ="hello world !!";
// 这种写法是替换不掉的,必须接受 replace 方法返回的参数才行,这样才行:str = str.replace("l","dd");
str.replace("l","dd");

留言区

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方才编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • final 在 java 中的作用,我相信大家都知道!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档