一、String
package com.javabase;
public class Test {
/*
String类代表字符串,所有双引号字符串,都是String类的对象
特点:1、字符串不可变,它的值在创建后不能被更改,但可以被共享
2、字符串效果上相当于字符数组(char[]),但底层原理是字节数组(byte[])
JDK8及之前是字符数组,从9开始是字节数组
*/
public static void main(String[] args) {
//可以创建一个空白字符串对象,不含任何内容
String s1 = new String();
System.out.println("s1:" + s1);
//如下三种结果虽然输出内容都是abc,但是前两个创建的对象各是各的,在堆中有不同的地址
//第三种直接赋值(推荐)的方式,都是直接指向堆中常量池中的“abc”,因此地址相同
//通过字符数组创建字符串对象
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
System.out.println("s2:" + s2);
//通过字节数组创建字符串对象
byte[] bys = {97, 98, 99};//分别是a b c的ASCII码
String s3 = new String(bys);
System.out.println("s3:" + s3);
//通过直接赋值创建字符串对象
String s4 = "abc";
String s5 = "abc";
//字符串的比较:
//1、地址的比较:
if(s1==s2 || s1==s3 || s2==s3){
System.out.println("s1 s2 s3存在地址相同");
}else{System.out.println("s1 s2 s3不存在地址相同");}
if(s4==s5){
System.out.println("s4 s5地址相同");
}else{ System.out.println("s4 s5地址不同");}
//2、字符串的内容相同
if(s1.equals(s2) || s1.equals(s3) || s2.equals(s3)){
System.out.println("s1 s2 s3存在内容相同");
}else{System.out.println("s1 s2 s3不存在内容相同");}
if(s4.equals(s5)){
System.out.println("s4 s5内容相同");
}else{System.out.println("s4 s5内容不同");}
}
}
二、StringBuilder
package com.javabase;
public class Test {
/*
在字符串的拼接操作中,以s1(hello) 和 s2(100) 拼接为例,堆内存中的操作为:
1、常量池中分配hello的地址001,"100"的地址002,额外需要分配003的内存地址存储最后结果。
实际只需要003的内存地址就行,所以001和002地址浪费了。
StringBuilder解决这个问题:StringBuilder是内容&长度可变的字符串类,可看成容器
*/
public static void main(String[] args) {
//通过StringBuilder的构造方法可以创建空白(无参)和有内容及对应长度的字符串
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder("hello");
System.out.println("sb1:" + sb1 + ", sb1.length:" + sb1.length());
System.out.println("sb2:" + sb2 + ", sb2.length:" + sb2.length());
//StringBuilder添加
//链式编程,等价于连写三行append
sb2.append(1).append(0).append(0);
System.out.println("sb2:" + sb2 + ", sb2.length:" + sb2.length());
//StringBuilder反转,reverse方法
sb2.reverse();
System.out.println("sb2:" + sb2 + ", sb2.length:" + sb2.length());
/*
StringBuilder -> String: toString()
反之,通过把String当成StringBuilder的参数,通过构造方法实现
*/
//将刚才翻转后的sb2 : 001elleh 通过toString()方法转换为String
String s = sb2.toString();
System.out.println("s:" + s + ", s.length:" + s.length());
//将s通过StringBuilder带参的构造方法转换为StringBuilder
StringBuilder sb3 = new StringBuilder(s);
System.out.println("sb3:" + sb3 + ", sb3.length:" + sb3.length());
}
}