目录
字符串相关的类
一、String
String的特性
String不可变性的体现
String的实例化方式一:字面量的定义方式
String实例化方式二:通过new构造器的方式
字符串的特性
String使用陷阱
面试题
String的常用方法
编辑 String与基本数据类型转换
String与字符数组的转换
String与字节数字转换
二、StringBuffer类(线程安全)
源码分析
StringBuffer扩容问题
StringBuffer常用方法
三、StringBuilder类(线程不安全)
String、StringBuffer、StringBuilder的区别
String类:代表字符串。Java程序中所有字符串字面值都作为此类的实例实现。
字符串是常量,用双引号引起来表示,它的值在创建后不能更改。
import org.junit.Test;public class StringTest {@Testpublic void test1(){String s1="abc";//字面量的定义方式String s2="abc";s1="hello";System.out.println(s1 == s2);//比较地址值System.out.println(s1);//helloSystem.out.println(s2);//abc}
}
输出结果为

内存解析

import org.junit.Test;public class StringTest {@Testpublic void test2(){//* 方式一:通过字面量定义的方式String s1="JavaEE";String s2="JavaEE";//* 方式二:通过new+构造器的方式String s3=new String("JavaEE");String s4=new String("JavaEE");System.out.println(s1 == s2);//trueSystem.out.println(s1 == s3);//falseSystem.out.println(s3 == s4);//falseSystem.out.println(s1 == s4);//false}
}
运行结果为

内存解析
import org.junit.Test;
public class StringTest {@Testpublic void test3(){String s1="java";String s2="ee";String s3="javaee";String s4="java"+"ee";String s5=s1+"ee";String s6="java"+s2;String s7=s1+s2;System.out.println(s3 == s4);//trueSystem.out.println(s3 == s5);//falseSystem.out.println(s3 == s6);//falseSystem.out.println(s4 == s5);//falseSystem.out.println(s3 == s7);//falseString s8=s5.intern();//返回值的得到的s8使用的常量值中已经存在的"javaee "System.out.println(s3 == s8);//true}
}
运行结果
true
false
false
false
false
true
String s=new String("abc");方式创建对象,在内存中创建了几个对象?
答:两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"

String与基本数据类型转换字符串--->基本数据类型、包装类
基本数据类型、包装类---->字符串
字符数组--->字符串
调用String类的构造器:String(char[]) String(char[],int offset,int length)分别用字符数组中的全部自负和部分字符创建字符串对象
字符串--->字符数组
字节数组--->字符串(调用String的构造器)
字符串--->字节数组
package com.light.java;import org.junit.Test;import java.io.UnsupportedEncodingException;
import java.util.Arrays;public class StringTest {/*** String与byte[]之间的转换* 编码:字符串---->字节* String--->byte[]:调用String的getBytes()** 解码:编码的逆过程,字节---->字符串* byte--->String:调用String的构造器* 说明:解码时使用的字符集必须与编码时所使用的字符集一致,否则会出现乱码*/@Testpublic void test4() throws UnsupportedEncodingException {String str1="abc123战国";System.out.println("********编码*********");//编码byte[] bytes = str1.getBytes();//使用默认字符集编码(utf-8)System.out.println(Arrays.toString(bytes));byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码System.out.println(Arrays.toString(gbks));System.out.println("********解码*********");//解码//调用String的构造器String s = new String(bytes);//默认(utf-8)System.out.println(s);String s1 = new String(gbks,"gbk");//gbk字符集解码System.out.println(s1);}
}
运行结果为
java.lang.StringBuffer代表可变字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新对象
StringBuffer内部也是用char[]存储

- StringBuffer str2=new StringBuffer();//char[] value=new char[16];
- 底层创建了长度为16的字符型数组
- * StringBuffer str3=new StringBuffer("abc");//char[] value=new char["abc".length+16];
- 底层创建了长度为"abc".length+16的字符型数组
如果要添加的数据底层装不下,那就需要扩容数组,默认情况下,扩容为原来的两倍+2,同时将原有数组复制到新数组中
增: StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
删:StringBuffer delete(int start,int end):删除指定位置的内容 [)
改: public char charAt(int n )
插:StringBuffer insert(int offset, xxx):在指定位置插入xxx
长度:public int length()
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样
* String:不可变的字符序列,底层用char[]存储
* StringBuffer:可变的字符序列,线程安全的,效率低,底层用char[]存储
* StringBuilder:可变的字符序列,线程不安全的,效率高,JDK5.0新增,底层用char[]存储
上一篇:写几句对情人失望的句子