(一)String
-
字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
-
字符串 String 类型本身是 final 声明的,意味着 String不能继承 。
-
String 对象的字符内容是存储在一个字符数组 value[]中的。"abc" 等效于 char[] data={'h','e','l','l','o'}。
jdk8 中的 String 源码:
public final class String implements java . io . Serializable , Comparable < String >,CharSequence {/** The value is used for character storage . */private final char value []; //String 对象的字符内容是存储在此数组中/** Cache the hash code for the string */private int hash ; // Default to 0–private 意味着外面无法直接获取字符数组,而且 String 没有提供 value 的get 和 set 方法。–final 意味着字符数组的引用不可改变,而且 String 也没有提供方法来修改value 数组某个元素值–因此字符串的字符数组内容也不可变的,即 String 代表着不可变的字符序列。即,一旦对字符串进行修改,就会产生新对象。只JDK9有,底层使用 byte[]数组。public final class String implements java . io . Serializable , Comparable < String >, CharSequence {@Stableprivate final byte [] value ;}
(二)String 的内存结构
概述
(三)String 的常用 API
1、构造器
//字面量定义方式:字符串常量对象
String str = "hello";
//构造器定义方式:无参构造
String str1 = new String();
//构造器定义方式:创建"hello"字符串常量的副本
String str2 = new String("hello");
//构造器定义方式:通过字符数组构造
char chars[] = {'a', 'b', 'c','d','e'};
String str3 = new String(chars);
String str4 = new String(chars,0,3);
//构造器定义方式:通过字节数组构造
byte bytes[] = {97, 98, 99 };
String str5 = new String(bytes);
String str6 = new String(bytes,"GBK");
public static void main(String[] args) {
char[] data = {'h','e','l','l','o','j','a','v','a'};
String s1 = String.copyValueOf(data);
String s2 = String.copyValueOf(data,0,5);
int num = 123456;
String s3 = String.valueOf(num);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
2.String 的常用方法
(1)boolean isEmpty():字符串是否为空
(2)int length():返回字符串的长度
(3)String concat(xx):拼接,运行效果等价于+
(4)boolean equals(Object obj):比较字符串是否相等,区分大小写
(5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
(6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
(7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
(8)String toLowerCase():将字符串中大写字母转为小写
(9)String toUpperCase():将字符串中小写字母转为大写
(10)String trim():去掉字符串前后空白符
(11)public String intern():结果在常量池中共享
(12)boolean contains(xx):是否包含xx
(13)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1
(14)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1
(15)String substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
(16)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
(17)char charAt(index):返回[index]位置的字符
(18)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回
(19)String(char[] value):返回指定数组中表示该字符序列的 String。
(20)String(char[] value, int offset, int count):返回指定数组中表示该字符序列的 String。
(21)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String
(22)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String
(23)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String
(24)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String
(25)byte[] getBytes():编码,把字符串变为字节数组,按照平台默认的字符编码方式进行编码
byte[] getBytes(字符编码方式):按照指定的编码方式进行编码
(26)new String(byte[] ) 或 new String(byte[], int, int):解码,按照平台默认的字符编码进行解码
new String(byte[],字符编码方式 ) 或 new String(byte[], int, int,字符编码方式):解码,按照指定的编码方式进行解码
(27)boolean startsWith(xx):是否以xx开头
(28)boolean endsWith(xx):是否以xx结尾
(29)boolean matchs(正则表达式):判断当前字符串是否匹配某个正则表达式。
(30)String replace(被替换字符 , 替换后的字符):不支持正则
(31)String replaceFirst(正则,value):替换第一个匹配部分,当前字符串中第一个匹配正则的部分会被替换为value
(32)String repalceAll(正则, value):替换所有匹配部分,当前字符串中所有匹配正则的部分会被替换为value
(33)String[] split(正则):按照某种规则进行拆分
3、StringBuffer和StringBuilder常用API
为什么有StringBuffer和StringBuilder?
因为 String 对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也比较高。因此,JDK 又在 java.lang 包提供了可变字符序列 StringBuffer 和 StringBuilder 类型。
StringBuffer 与 StringBuilder 的理解
简言之,StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能
String | StringBuffer | StringBuilder |
String:不可变的字符序列; 底层使用 char[]数组存储(JDK8.0 中)
|
StringBuffer:可变的字符序列;线程安全(方法有 synchronized 修饰),效
率低;底层使用 char[]数组存储 (JDK8.0 中)
|
可变的字符序列:jdk1.5 引入,线程不安全的,效率高;底层使用 char[]数组存储(JDK8.0 中)
|
3.常用的API
常用的API,StringBuilder、StringBuffer的API是完全一致的
(1)StringBuffer append(xx):拼接,追加
(2)StringBuffer insert(int index, xx):在[index]位置插入xx
(3)StringBuffer delete(int start, int end):删除[start,end)之间字符
StringBuffer deleteCharAt(int index):删除[index]位置字符
(4)void setCharAt(int index, xx):替换[index]位置字符
(5)StringBuffer reverse():反转
(6)void setLength(int newLength) :设置当前字符序列长度为newLength
(7)StringBuffer replace(int start, int end, String str):替换[start,end)范围的字符序列为str
(8)int indexOf(String str):在当前字符序列中查询str的第一次出现下标
int indexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的第一次出现下标
int lastIndexOf(String str):在当前字符序列中查询str的最后一次出现下标
int lastIndexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的最后一次出现下标
(9)String substring(int start):截取当前字符序列[start,最后]
(10)String substring(int start, int end):截取当前字符序列[start,end)
(11)String toString():返回此序列中数据的字符串表示形式
(四)String 与其他结构间的转换
⑴ 字符串 --> 基本数据类型、包装类:
public void test01() throws Exception {
String str = "中国";
System.out.println(str.getBytes("ISO8859-1").length);
// ISO8859-1 把所有的字符都当做一个 byte 处理,处理不了多个字节
System.out.println(str.getBytes("GBK").length);// 4 每一个中文都是
对应 2 个字节
System.out.println(str.getBytes("UTF-8").length);// 6 常规的中文都
是 3 个字
/*
* 不乱码:(1)保证编码与解码的字符集名称一样(2)不缺字节
*/
System.out.println(new String(str.getBytes("ISO8859-1"), "ISO8859
-1"));// 乱码
System.out.println(new String(str.getBytes("GBK"), "GBK"));// 中
国
System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));//
中国
}