JAVA学习笔记StringStringBufferStringBuilder

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA学习笔记StringStringBufferStringBuilder相关的知识,希望对你有一定的参考价值。

一、String

1.String的特点

  • String类声明为final,说明该类不可被继承

  • String类实现了Serializable接口:说明字符串是支持序列化的。

    String类还实现了Comparable接口:说明String可以比较大小

  • String底层用final char[] value存储字符串数据,说明其不可变性

2.String不可变性

当对字符串重新赋值或者进行连接还有替换操作时,实际上不会对当前字符串做出修改,而是将修改的值指向另一个地址。具体我们来看代码。

//重新赋值操作
String s1 = "abc";//字面量的定义方式
String s2 = "abc";
s1 = "hello";
System.out.println(s1);//hello
System.out.println(s2);//abc
System.out.println(s1 == s2);//false;因为s1指向了另外一个地址

//连接操作
String s3 = "abc";
s3 += "def";
System.out.println(s3);//abcdef

//替换操作
String s4 = "abc";
String s5 = s4.replace('a', 'm');
System.out.println(s4);//abc;所有操作对原字符串都不会产生影响
System.out.println(s5);//mbc
System.out.println(s4 == s5);//false;因为s5指向了另外一个地址

内存示意图(有机会最好学习一下JVM)
在这里插入图片描述

3.String实例化的两种方式对比

第一种方式:直接使用字面量来定义
第二种方式:使用new + 构造器来定义

//直接使用字面量来定义,s1的数据储存在字符串常量池中
String s1 = "abc";
String s2 = "abc";
//使用new + 构造器来定义,此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false

内存示意图:
在这里插入图片描述

4.字符串拼接方式赋值

  • 常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量
  • 只要其中一个是变量,结果就在堆中
  • 如果拼接的结果调用intern()方法,返回值就在常量池中
  • 用final修饰的变量是常量
String s1 = "abc";
String s2 = "def";
String s3 = "abcdef";
String s4 = "abc" + "def";
String s5 = s1 + "def";
String s6 = "abc" + s2;
String s7 = s1 + s2;
final String s8 = "abc";//s8:常量
String s9 = s8 + "def";
String s10 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“abcdef”

System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
System.out.println(s3 == s9);//true
System.out.println(s3 == s10);//true

5.String与其他类型的转换

①与基本数据类型、包装类之间的转换

  • String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
  • 基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)

②与字符数组之间的转换

  • String --> char[]:调用String的toCharArray()
  • char[] --> String:调用String的构造器

③与StringBuffer、StringBuilder之间的转换

  • String -->StringBuffer、StringBuilder:调用StringBuffer、StringBuilder构造器
  • StringBuffer、StringBuilder -->String:①调用String构造器;②StringBuffer、StringBuilder的toString()

二、StringBuffer、StringBuilder

1. 【面试题】String、StringBuffer、StringBuilder三者的对比

  • String:不可变的字符序列;底层使用final char[]存储
  • StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
  • StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储

相同:三个类都是用final修饰的。

2.String、StringBuffer、StringBuilder三者的执行效率

从高到低排列:StringBuilder > StringBuffer > String

以上是关于JAVA学习笔记StringStringBufferStringBuilder的主要内容,如果未能解决你的问题,请参考以下文章

java JDK8 学习笔记——助教学习博客汇总

2022年Java学习笔记目录

2022年Java学习笔记目录

Java程序猿的JavaScript学习笔记(1——理念)

01-Java学习笔记

Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)