众所周知,String是不可变的。

但是为什么String不可变呢?String不可变是指的什么不可变呢?哪里又可以变呢?接下来我总结一下我学习String的心得(大佬勿喷!

一些东西从源码的角度进行学习更容易使人理解。首先我们进入到String.java(本人使用的是JDK1.8)当中,①我们会看到String的类被final修饰,说明String是不能够被继承的,所以无法从类继承的角度去改变其中的值。②接下来就是重要的一个变量value,如下图,从上面的注释中能够看到这个就是String中用来存储字符的工具---char数组。

再看其前面的修饰符private:只能在本类中访问。同时并没有像我们写User类一样,对于一些成员变量生成相对应的get、set方法。造成只能够本类当中为他赋值。同时他也被fianl修饰,也就意味着本char数组在赋完值之后,value的指向地址(char数组地址)将不会改变,将不会再次被赋值。虽然指向地址不变。但是char数组当中的值理论上是可以被改变的,但是String为了安全仅能够支持自身或Java官方包当中的一些类对其进行操作。并且当我们传入char数组进行构造String实例时,String会将我们提供的数组进行复制。使用自己复制之后的数组进行构造实例看下图。所以对我们来说String就是不可变的啦。总的来说就是String不信任除了官方开发之外的其他人提供的信息。String的构造方法都对不安全因素进行了处理保证value的值不受外界干扰。所以String最终就是不变的。总结:String是不变的。不变的是char数组的地址,以及其中的内容是不变的。

下面是我使用char数组进行的测试:

下面这个图是String的构造方法。StringBuffer的一个toString方法中使用。

这里没有对char数组进行处理会不会导致String是可变的??你们有这个疑问吗?有就对啦哈哈,看下面的StringBuffer的toString方法看一眼就明白啦。

看到了吧,你想到的java官方都已经替你想好了,在使用之前我们已经在StringBuffer方法中对其处理了。然后才调的String的方法。

到这里肯定又会有疑问了,他可以调用String的不用处理的方法,那么我们不能掉用吗?(可恶)

答案是,当然不能掉了。让我们回头看一下有没有发现什么不同?对啦聪明的你肯定发现了这个构造方法竟然不是用public来修饰的,而是用默认的修饰符修饰,那么也就意味着此构造方法只对java.lang包开放,所以我们就不要费力气使用这个构造方法啦!

所以对String来说可变的,StringBuffer可以改变char数组来改变String的值,但是StringBuffer并没有这么做,这也是对String的安全做的保障。

以上就是我对String老生常谈的可不可变进行的总结学习!有不对的大家可以提出来,共同学习!

String可不可变???相关推荐

  1. java string的作用_浅谈java String不可变的好处

    一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable, C ...

  2. 灵魂拷问:java的String到底可不可变?

    从认识java的那天起,就被告知String是不可变的,因为源码上是这样写的 public final class Stringimplements java.io.Serializable, Com ...

  3. java object怎么拿字段_「Java面试秘籍」String不可变,如何理解

    Java中最常见的就是String类,那么很多人都说String是不可变类型,那么如何解释下面的代码? public class StringTest { public static void mai ...

  4. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  5. 你有没有想过: 为什么Java中String是不可变的?

    有一种学得快的方法,就是一次不要学太多. public final class String implements Serializable, Comparable<String>, Ch ...

  6. String类为什么被设计为不可变的?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:都说了多少遍,不要再学 JSP 了!个人原创100W+访问量博客:点击前往,查看更多 从哪看出来String类是 ...

  7. String的内存模型,为什么String被设计成不可变的

    String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源 ...

  8. string转为char数组_StringBuilder的区别是什么?String是不可变?一点课堂(多岸学院)...

    String和StringBuffer.StringBuilder的区别 可变性 简单的来说:String 类中使用 final 关键字字符数组保存字符串,private final char val ...

  9. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串

    目录 一.创建字符串 二.字符串比较相等 三.字符串常量池 3.1 直接赋值的内存情况 3.2 采用构造方法的内存情况 四.理解字符串不可变 五.字符.字节与字符串 5.1 字符与字符串 5.2 字节 ...

最新文章

  1. 报错解决:error: this statement may fall through [-Werror=implicit-fallthrough=]
  2. Java连接Oracle数据库示例
  3. 关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)
  4. win7 iis7 配置如何让局域网内其它用户访问
  5. poj 1338 Ugly Numbers(丑数模拟)
  6. Linux学习之Ubuntu安装Java
  7. selenium 安装报错问题
  8. bind()的实现(持续更新中)
  9. Java 程序连接 Informix 数据库方法实例介绍
  10. python输出unicode对应字符_python unicode字符串
  11. 零基础CSS入门教程(29)–CSS下拉菜单实例
  12. Python实现截图AI文字识字小工具
  13. marlin固件烧录教程_Marlin固件配置教程
  14. uniapp访问服务器缓存文件,uni-app浏览历史记录功能实现
  15. 【Tools系列】Windows下一款好用的文件搜索工具:XSearch
  16. 深度:企业为什么需要一个平台级的OA产品?
  17. manjaro Linux yay常用命令整理大全
  18. Unity bug error CS1703: Multiple assemblies with equivalent identity have been imported...
  19. python办公自动化(4)拆分表格
  20. 多功能搜索友联自助交换多色彩皮肤网站图片本地化附带交易系统网址导航源码蜘蛛

热门文章

  1. 不合格高校教师的自我总结(成绩统计和课程总结)
  2. python 简单实例训练(1~10)-从零开始的Python学习 -- 简单的练习题
  3. 计算离散点曲率的方法
  4. Linux:df -h
  5. 开发中的“通盘可以无妙手”
  6. 「镁客·请讲」图鸭科技武俊敏:打造从压缩、通信到分析的完整视频解决方案...
  7. Vue和Elementui的关系
  8. 程序设计语言正交特性的一点思考
  9. 《魔法黎明(Dawn of Magic)》修改存档魔法技能、工匠技能、属性点、金币数量(一)
  10. java实现哈密顿回路问题