为什么字符串String是不可变字符串

实际上String类的实现是char类型的数组

虽然说源码中设置的是private final char[] value;

final关键词表示不可变动

但是只是不能直接在value这个数组的引用地址入手

还是可以在数组value中进行更改

像是value[2] = 1;

但是设计者巧妙地避开了这个坑

还把数组设为final

public static void main(String[] args) {
  final char[] value = {1,2,3,4};
  char[] v = new char[4];
  value = v;
}
public static void main(String[] args) {
    final char[] value = {1,2,3,4};
    value[2] = 6;
    System.out.println(value);
}

虽然字符串本身不能改

但是可以改字符串变量指向另一个字符串的地址

而且字符串是有一个共享的字符串常量池(这里等我读《深入Java虚拟机》之后再填坑)

所以如果复制一个字符串变量

原始字符串与复制的字符串共享相同的字符

其实也是因为java的特性之一------没有可以直接改变内存变量的指针

"".equals(str)与str.equals("")的区别

"".equals(str)这种写法可以规避系统报空指针异常错误

 class Solution {
   private static String a;
   public static void main(String[] args) {
     if("".equals(a))
       System.out.println("''.equals(a)");
     if(a.equals(""))
7       System.out.println("a.equals('')");
   }
 }

为什么字符串String是不可变字符串&&"".equals(str)与str.equals("")的区别的更多相关文章

  1. Python_字符串的映射与可变字符串的应用

    ''' maketrans().translate() maketrans()方法用来生成字符映射表,而translate()方法则按映射表中定义的对应关系转换并替换其中的字符,使用这两个方法的组合可 ...

  2. Java 中的字符串(String)与C# 中字符串(string)的异同

    1. C# 中比较两个字符串字面量是否相等,可以使用 “==”比较运算符,是因为string 类型重写(override)了“==” 和 “!=” 运算符,在使用“==” 和 “!=” 进行字符串比较 ...

  3. [转]标准C++字符串string以及MFC6.0字符串CString的tokenize和split函数

    标准字符串的方法: /******************************************** the tokenize function for std::string ****** ...

  4. lua中 string.find(查找获取字符串) string.gsub(查找替换字符串) string.sub(截取字符串)

    > aaa='/p/v2/api/winapi/adapter/lgj'> print(string.find(aaa, "^/.+/adapter/(.*)"))1 ...

  5. Java基础——数组应用之字符串String类

    字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...

  6. 自定义实现字符串string的接口

    用char*管理String类的内存,new动态分配,在析构函数中delete char*指向的new出来的内存,一个string类需要实现那些接口可参考标准库里的string:  http://ww ...

  7. 不可变字符串String与可变字符串StringBuilder、StringBuffer使用详解

    String字符串 char类型只能表示一个字符,而String可以表示字符串,也就是一个字符序列.但String不是基本类型,而是一个定义好的类,是一个引用类型.在Java中,可以将字符串直接量赋给 ...

  8. Java中String被称为不可变字符串的原因

    很多东西,看似可变,实际上不过是是新桃换旧符罢了. 代码: /** * String之所以被称为不可变字符串 */ static void testString(){ String str = &qu ...

  9. Java之字符串String,StringBuffer,StringBuilder

    String类: String类即字符串类型,并不是Java的基本数据类型,但可以像基本数据类型一样使用,用双引号括起来进行声明.在Java中用String类的构造方法来创建字符串变量. 声明字符串: ...

随机推荐

  1. Qt .pro文件配置大全!

    避免以后的无意义重复劳动,将用过的所有的头文件库文件的配置都放在这里,以后要用的话直接copy就好. eigen3: INCLUDEPATH += \ /usr/local/include/eigen ...

  2. 快速打开和关闭SQL服务

    将下面文本复制到txt中,然后将文本文件另存为bat @echo off for /f "skip=3 tokens=4" %%i in ('sc query MSSQLSERVE ...

  3. 让group tableview每个section拥有阴影和圆角

    #import <UIKit/UIKit.h> @class GroupShadowTableView; @protocol GroupShadowTableViewDelegate &l ...

  4. [Xcode 实际操作]三、视图控制器-(1)使用UIScrollView展示多个视图可控制器

    目录:[Swift]Xcode实际操作 本文将演示使用滚动视图创建多个页面. [Create a new Xcode project]->[Single View App]->[Next] ...

  5. Jquery | 基础 | .hover()

    https://api.jquery.com/hover/#hover-handlerIn-handlerOut http://jquery.cuishifeng.cn/hover.html

  6. [題解]luogu P1156 垃圾陷阱

    前言:[數據刪除] 來源:題解 不發題面了 首先我们来分析题目,“每个垃圾都可以用来吃或堆放”,浓浓的透露出一个背包气息.我们可以类比背包问题的放或不放.于是dp[i][j]dp[i][j]dp[i] ...

  7. SRE思想

    1 规模效应 业务越庞大,服务器就越多,服务越多,就越需要拆分成分布式架构.架构越复杂,对运维的能力要求就越高.出错的概率就越大,运维的工作量就越大.因此就要更多开发提升效率的工具. 而在小企业,业务 ...

  8. C# 基础之构造函数

    什么是构造函数? 构造函数主要用于创建类的实例对象,当调用一个构造函数创建对象时,构造函数会为对象分配内存空间并初始化类的成员. 构造函数分为:1.实例构造函数.2.静态构造函数 1.实例构造函数 使 ...

  9. HDU6441(费马大定理)

    听队友说过结论:a^n + b^n = c^n在n > 2时无解. 勾股那里本菜数学不好直接暴举了Orz. 跟大家学一波勾股数的构造:a是奇数时,tmp = a / 2; b = (tmp + ...

  10. Hive_Hive的数据模型_数据存储

    Hive的数据模型_数据存储 web管理工具察看HDFS文件系统:http://<IP>:50070/ 基于HDFS没有专门的数据存储格式,默认使用制表符存储结构主要包括:数据库,文件,表 ...