String概述
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概述的更多相关文章
- java String概述
class StringDemo { public static void main(String[] args) { String s1 = "abc";//s1 是一个类类 ...
- JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较
JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...
- String StringBuilder 包装类
1. String 概述 程序中直接写上双引号的字符串就在字符串常量池中,new的不在池当中 java6之前常量池在方法区,java7以后将字符串常量池放在堆中 因为字符串是对象,应该在堆中 相同的字 ...
- String, StringBuffer and StringBuilder
一 String 概述: String 被声明为 final,因此它不可被继承. 在 Java 8 中,String 内部使用 char 数组存储数据. public final class Stri ...
- Java基础:(二)String字符串
一.String概述 String被声明为final,因为它不可被继承. 内部使用char数组存储数据,该数组被声明为final,这意味着value数组初始化之后就不能再引用其他数组.并且String ...
- 每天都在用String,你真的了解吗?
1.String概述 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc")都可以被看作是实现此类的实例 String 中包括用于检查各个 ...
- Java基础:String类详解,案例用户登录实现,案例手机号截取实现,案例敏感词替换实现;StringBuilder类详解,StringBuilder和String相互转换,附练习案例.
1.API 1.1 API概述-帮助文档的使用 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK ...
- 面试常备,字符串三剑客 String、StringBuffer、StringBuilder
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...
- NOSQL中的redis缓存数据库
NOSQL概述 什么是NOSQL? NoSql(NoSQL=Not Only SQL),意思为"不仅仅是SQL",是一个全新的数据库理念,泛指非关系型的数据库. 为什么需要NOSQ ...
随机推荐
- mimikatz使用
mimikatz使用 需要用管理员权限打开 privilege::debug sekurlsa::logonpasswords 已测试系统 Windows Server 2008 R2 Datacen ...
- python-网络安全编程第五天(爬虫模块BeautifulSoup)
前言 昨晚学的有点晚 睡得很晚了,今天早上10点多起来吃完饭看了会电视剧就瞌睡了一直睡到12.50多起来洗漱给我弟去开家长会 开到快4点多才回家.耽搁了不少学习时间,现在就把今天所学的内容总结下吧. ...
- 深度分析ReentrantLock源码及AQS源码,从入门到入坟,建议先收藏!
一.ReentrantLock与AQS简介 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:Reentra ...
- Vegas转场功能的妙用,让片头转场更酷炫
如今视频剪辑已经是一件非常平常的事情了,很多时候我们制作一段或者剪辑一段视频,其实都比较简单,但是如果想要视频显得高级些,这时候就可以给自己的视频制作一个好看的片头了,具体该怎么做呢? 用视频剪辑软件 ...
- 14.java设计模式之命令模式
基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...
- 关于Intege.valueOf()的使用
原文链接:https://blog.csdn.net/weixin_37650458/article/details/85212730 1.Integer. valueOf()方法的作用 In ...
- 数学分析理论(rudin版)笔记:实数系和复数系.1
导引 有理数集是"稀疏的"和"稠密的". 选择公理 考虑以下问题:容易找到两个无理数 a, b 使 a + b 为有理数,或者使 ab 为有理数,但是能否使得 ...
- yii2.0 删除文件夹
/** * 删除文件缓存 */public function actionDelfilecache(){ $cachePath = Yii::getAlias('@app/runtime/cache' ...
- JQuery案例:左右选
左右选 <head> <meta charset="UTF-8"> <title></title> <style> se ...
- SSM之Spring框架--->>墨盒案例
分析: 程序中包括打印机(Printer).墨盒(Ink).和纸张(Paper).三类组件 首先创建一个新项目文件Spring_Box 我们来定义墨盒和纸张的接口类 墨盒接口Ink.java文件内容如 ...