字符串
字符串:是由若干个字符组成的一个有序的序列。
在Java中,使用String这个类来描述字符串。
特点:
1. java.lang.String 使用final修饰,不能被继承
2. 字符串底层封装的是字符数组及其针对数组的操作方法
3. 字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值
4. 字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的定长编码
5. 字符串的索引值从0开始
字符串常量池
jvm为了提升性能和减少内存开销,专门为字符串的一些操作,在内存中专门提供了一块区域,用于存储字符串对象。该内存区域就是字符串常量池(字符串缓冲区,缓冲池)
public static voiid main(String[] args){String s1 = "abc";String s2 = "abc";System.out.println( s1 == s2); //true 字面量abc在字符串常量池中,是同一个地址//两个字面量作拼接时,编译期间就做了优化操作String s3 = "abc"+"d";String s4 = "abcd";System.out.println( s3==s4); //trueString s5 = "d";String s6 = "abc"+s5;//有变量作拼接时,计算后的结果存储在堆里,不在常量池中System.out.println( s4==s6) //falseString s7 = "ab"+"c"+s5 //有变量依然是在运行时做计算,在堆中创建新对象System.out.println(s6==s7);//falseString s8 = new String("abc");String s9 = new String("abc");System.out.println(s8==s9);//false
}
常用构造器
1. String()
初始化一个新创建的空字符序列的字符串对象
2. String(String str)
初始化一个新创建的字符串对象,使其字符序列与参数相同。
3. String(byte[] bytes)
使用默认编码集解码byte数组,构建一个字符串对象
4. String(byte[] bytes,String charsetName)
使用指定编码集charsetName 解码byte数组,构建一个字符串对象
5. String(byte[] bytes, int offset, int length)
使用默认编码集解码byte数组的从offset开始,length个元素,构建一个字符串对象
6. String(char[] value)
初始化一个字符串对象,使其字符序列包含参数的元素
public static void main(String str[] args){String name = "lily";System.out.println(name);//无参构造器,构建的是一个空字符串String str = new String();System.out.println(str.length());//构造器String(String str())String s1 = new String("lily");System.out.println(s1);//构造器:String(byte[] bytes): 传入一个字节序列,按照默认字符集转成对应字符。byte[] bytes = {-28,-72,-83,-101,-67};String s2 = new String(bytes);System.out.println(s2);//构造器: String(byte[] bytes,String charsetName);String s3 = new String(bytes,"UTF-8");System.out.println(s3);//构造器://String(byte[] bytes,int offset,int length),从第几个序列下标开始截取,截取长度String s4 = new String(bytes,3,3);System.out.println(s4);//构造器:String(char[] value)String s5 = new String(new char[]{'h','e','l','l','o'};System.out.println(s5);
}
常用方法
1. length()方法
length()方法可以获取字符串对象的字符个数。
String str = "helloChina!";
System.out.println(str.length());
2.使用indexOf实现检索
int indexOf(String str)
int indexOf(String str,int fromIndex)作用:用于返回指定字符串在此字符串中第一次出现的索引,找不到返回-1
int lastIndexOf(String str)
int lastIndexOf(String str,int endIndex)作用:用于返回指定字符串在此字符串中最后一次出现的索引,找不到返回-1
String str = "welcome to China";
int index1 = str.indexOf("to");
System.out.println(index1);
int index2 = str.indexOf("t",3);
System.out.println(index2);
int index3 = str.lastIndexOf("i");
System.out.println(index3);
int index4 = str.lastIndexOf("a",str.length());
System.out.println(index4);
3.使用substring获取子串
作用:substring方法用于返回一个字符串的子字符串
常用重载方法:
String substring(int beginIndex)
String substring(int beginIndex,int endIndex)
String s1 = str.substring(5);
System.out.println(s1);
String s2 = str.substring(5,9);
System.out.println(s2);
4.trim截掉空格
作用:去掉一个字符串的前与后的空字符,不会去掉中间的空字符
String trim()
String s = " lily ";
System.out.println(s.length()); //6
String s2 = s.trim();
System.out.println(s2.length()); //4
5.charAt获取字符
作用:返回指定索引处的char值
char charAt(int index)
String s = "lily is so smart";
char a = s.chart(6);
System.out.println(a);
6.startsWith和endsWith
作用:检查一个字符是否以指定的字符串为前缀或后缀
boolean startsWith(String str)
boolean endsWith(String str)
String str = "jacksonyee"
boolean a = str.startWith("roy");
System.out.println(a);
boolean b = str.endWith("y");
System.out.println(b);
7. 大小写变换
作用:对字符串中的字母进行转换成全部大写或全部小写
String toUpperCase()
String toLowerCase()
String str = "hhhWElcome TO China";
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
8.toCharArray
作用: 将字符串转变成字符数组
char[] toCharArray()
String str = "hello world";
char[] charArray = str.toCharArray();
System.out.println(Arrays.toString(charArray));
9. valueOf作用:将其他类型转换成字符串类型
static String valueOf(int value)
static String valueOf(double d)
static String valueOf(char[] ch)
static String valueOf(Object obj)
String num = String.valueOf(123456);
System.out.println(num);
10. equals与==equals方法用于判断两个字符串的内容是否一样
==用于判断两个字符串是不是同一个对象
boolean equals(String str)
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); //false 比较的是地址值
System.out.println(str1.equals(str2));//ture 比较的是两个对象的属性
StringBuilder、StringBuffer
由于字符串是不可变的,因此对字符串进行操作的时候,比较的麻烦,每次的操作都需要实例化一个 临时的空间来存放结果,效率不高。可以使用其他的某些类,来实现高效率的字符串的操作:StringBuilder和StringBuffer。
StringBuilder和StringBuffer,都是一个可变的字符序列(即可变的字符串),对象创建后可以通过调用方法来实现字符序列的改变,StringBuilder和StringBuffer类中的方法完全相同
常用构造器
1. StringBuilder()
构造一个不带任何字符的字符串生成器,其初始容量为16个字符
2. StringBuilder(String str)
构造一个字符串生成器,其初始化为指定的字符串内容
常用方法
StringBuilder的很多方法的返回值均为StringBuilder类型,这些方法的返回值语句是:return this。也就是返回对象本身(地址),因此可以使用流式编程。
1. append方法
作用:将指定字符串追加到字符串之后
StringBuilder append(boolean b)
StringBuilder append(String str)
2. insert方法
作用:将指定字符串插入到字符串的指定索引处
StringBuilder insert(int index,String str)
3. delete方法
作用:删除字符串中的一部分
StringBuilder delete(int start , int end)
4. reverse方法
作用:将字符序列进行反转(左右颠倒)
StringBuilder reverse()
5. toString方法
作用:将StringBuilder对象转变成String对象
String toString()
StringBuilder s1 = new StringBuilder();//返回值是自己
StringBuilder s2 = s1.append("北京欢迎你");
s1.append(",长春欢迎你").append(",上海欢迎你").append(",快来玩吧");
System.out.println(s1);
s1.insert(0,"美丽的");
System.out.println(s1);
s1.delete(8,15); //包前不包后
System.out.println(s1);
s1.replace(3,5,"天津");//包前不包后
System.out.println(s1);
s1.reverse();
System.out.println(s1);
三者区别
1. StringBuilder是可变字符串,如果进行字符串的内容计算,建议选择StringBuilder,这样性能更好一些。
2. java的字符串连接的过程是利用StringBuilder实现的
3. StringBuilder 也是final修饰的类型,不能被继承
4. StringBuilder没有重写equals方法和toString()
5. StringBuilder是非线程安全的,并发处理,性能稍快
6. StringBuffer是线程安全的,同步处理,性能稍慢