String的基本特性

  • String是字符串,使用一对引号("")包装。

  • String声明是final的,不可被继承。

  • String实现了Serializable接口,表示字符串是支持序列化的;实现了Comparable接口,表示String可以比较大小。

  • String在jdk8及以前内部定义了final char[] value用于存储字符数据,jdk9时改为byte[]

  • String是不可变的字符序列。简称:不可变性。

    • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。

      /**
      * 第一次执行, 注释掉s1 = "hello";
      */
      @Test
      public void test1() {
      String s1 = "abc";
      String s2 = "abc";
      s1 = "hello"; System.out.println(s1 == s2); // 1st. true 2nd. false
      System.out.println(s1); // 1st. abc 2nd. abc
      System.out.println(s2); // 1st. abc 2nd. hello
      }
    • 当对现有的字符串进行连续操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

      @Test
      public void test2() {
      String s1 = "abc";
      String s2 = "abc";
      s2 += "def";
      System.out.println(s1); // abc
      System.out.println(s2); // abcdef
      }
    • 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

      @Test
      public void test3() {
      String s1 = "abc";
      String s2 = s1.replace('a', 'z');
      System.out.println(s1); // abc
      System.out.println(s2); // zbc
      }
package com.chinda.java.base;

/**
* @author Wang Chinda
* @date 2020/5/29
* @see
* @since 1.0
*/
public class StringExer { String str = new String("good");
char[] ch = {'t', 'e', 's', 't'}; public void change(String str, char[] ch) {
str = "test ok";
ch[0] = 'b';
} public static void main(String[] args) {
StringExer e = new StringExer();
e.change(e.str, e.ch);
System.out.println(e.str); // good
System.out.println(e.ch); // best
}
}
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

字符串拼接操作

  • 常量与常量的拼接结果在常量池,原理是编译期优化。
  • 常量池不会存在相同内容的常量。
  • 只要其中有一个是变量,结果就在堆中。变量拼接的原理是StringBuilder。(jdk1.5以前是StringBuffer)
  • 如果拼接的结果调用intern()方法,则主动将常量池中还有没有的字符串对象放入池中,并返回此对象地址。
package com.chinda.java.base;

import org.junit.Test;

/**
* @author Wang Chinda
* @date 2020/5/30
* @see
* @since 1.0
*/
public class StrJoin { @Test
public void test1() {
String s1 = "javaEE";
String s2 = "hadoop";
String s3 = "javaEEhadoop";
// 编译器优化
String s4 = "javaEE" + "hadoop";
// 用变量做拼接,相当于在堆中new String()
String s5 = s1 + "hadoop";
String s6 = "javaEE" + s2;
String s7 = s1 + s2;
String s8 = s7.intern(); // 编译期优化。 相当于String s4 = "javaEEhadoop";
System.out.println("s3 == s4 --> " + (s3 == s4));
System.out.println("s3 == s5 --> " + (s3 == s5));
System.out.println("s3 == s6 --> " + (s3 == s6));
System.out.println("s3 == s7 --> " + (s3 == s7));
// 将s7放入字符串常量池,但此时常量池中已经存在该常量,直接返回该常量的地址,即s3的地址赋值给s8
System.out.println("s3 == s8 --> " + (s3 == s8));
System.out.println("s5 == s6 --> " + (s5 == s6));
System.out.println("s5 == s7 --> " + (s5 == s7));
}
}

intern()在jdk1.6、jdk1.7、jdk1.8中的区别

    public static void main(String[] args) {
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println("s3 == s4 --> " + (s3 == s4));
}

jdk1.6中为false,jdk1.7、jdk1.8中是true。

jdk1.6 JMM

jdk1.8 JMM

String概述的更多相关文章

  1. java String概述

    class StringDemo { public static void main(String[] args)  {  String s1 = "abc";//s1 是一个类类 ...

  2. JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

    JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...

  3. String StringBuilder 包装类

    1. String 概述 程序中直接写上双引号的字符串就在字符串常量池中,new的不在池当中 java6之前常量池在方法区,java7以后将字符串常量池放在堆中 因为字符串是对象,应该在堆中 相同的字 ...

  4. String, StringBuffer and StringBuilder

    一 String 概述: String 被声明为 final,因此它不可被继承. 在 Java 8 中,String 内部使用 char 数组存储数据. public final class Stri ...

  5. Java基础:(二)String字符串

    一.String概述 String被声明为final,因为它不可被继承. 内部使用char数组存储数据,该数组被声明为final,这意味着value数组初始化之后就不能再引用其他数组.并且String ...

  6. 每天都在用String,你真的了解吗?

    1.String概述 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc")都可以被看作是实现此类的实例 String 中包括用于检查各个 ...

  7. Java基础:String类详解,案例用户登录实现,案例手机号截取实现,案例敏感词替换实现;StringBuilder类详解,StringBuilder和String相互转换,附练习案例.

    1.API 1.1 API概述-帮助文档的使用 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK ...

  8. 面试常备,字符串三剑客 String、StringBuffer、StringBuilder

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  9. NOSQL中的redis缓存数据库

    NOSQL概述 什么是NOSQL? NoSql(NoSQL=Not Only SQL),意思为"不仅仅是SQL",是一个全新的数据库理念,泛指非关系型的数据库. 为什么需要NOSQ ...

随机推荐

  1. mysql 不常用备忘

    # group_concat 函数语法: group_concat( [DISTINCT]  要连接的字段   [Order BY 排序字段 ASC/DESC]   [Separator '分隔符'] ...

  2. [原题复现+审计][RoarCTF 2019]Easy Calc(http协议走私、php字符串解析漏洞)

    简介  原题复现:  考察知识点:http协议走私.php字符串解析漏洞  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到 ...

  3. 转化dataframe中一组序列为时间序列的方法-to_datetime()的最新用法

    一.to_datetime()的最新用法: hs300_hf['date'] = pd.to_datetime(hs300_hf['date']) hs300_hf.set_index('date', ...

  4. MindManager导出Word文档功能介绍

    Mindmanager思维导图软件作为一款能与Microsoft office软件无缝集成的思维导图软件,支持Word文档的快速导入与导出,并支持Word文档的目录生成.模板套用等,极大地方便了用户完 ...

  5. 需要登录才能下载的文件可以用Folx下载吗

    用苹果电脑的小伙伴有没有发现,有时候文件即时有下载链接也还是要先登录才能下载,那这样的文件用下载器Folx还能下载码?下面小编将在Mac系统平台上,通过一篇教程教大家利用Folx 5的密码管理来保存网 ...

  6. 【数据结构模版】可持久化线段树 && 主席树

    浙江集训Day4,从早8:00懵B到晚21:00,只搞懂了可持久化线段树以及主席树的板子.今天只能记个大概,以后详细完善讲解. 可持久化线段树指的是一种基于线段树的可回溯历史状态的数据结构.我们想要保 ...

  7. 4. Eclipse集成Git

    4.1 Git插件 Eclipse中已经内置了Git插件 4.2 把工程初始化为本地库 初始化 设置本地库范围的签名 4.3 Git图标 4.4 Eclipse特定文件 Eclispe特定文件介绍 为 ...

  8. 【不尽如人意的redisTemplete封装】

    线下项目里对spring redisTemplete进行了简单的封装,但是项目里关于其序列化的配置真的有点一言难尽: 可以看到这里用了JdkSerializationRedisSerializer去对 ...

  9. 第一次UML作业

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/f ...

  10. 网络最大流 Dinic算法

    前言 看到网上好多都用的链式前向星,就我在用 \(vector\) 邻接表-- 定义 先来介绍一些相关的定义.(个人理解) 网络 一个网络是一张带权的有向图 \(G=(V,E)\) ,其中每任意一条边 ...