Java---第八章
- 字符串
- String
- 字符串的常用方法
- StringBuilder和StringBuffer
- 常用方法
- 对比String 和StringBuilder 和 StringBuffer
字符串
String
特性:
- String 类位于java.lang包中,无需引入,可直接使用
- String 类是由final修饰的,表示String 类是一个最终类,不能被继承
- String 类构建的对象不可再被更改
package org.device.Device;
public class DeviceTest {
public static void main(String[] args) {
//当使用一个字面量给字符串赋值的时候,首先会去字符串常量池里检测是否
//存在其字面量,如果存在
//则直接使用这个字面量的地址赋值即可,如果不存在,
//则需要在字符串常量池中创建这个字面量,然后
//再将地址赋值过去
String s = "超用心";
s += "在线学习";//这里的字符串拼接发生在堆内存上
System.out.println(s);
}
}
常见的构造方法:
public String(String original);
public String(char value[]);
public String(char value[],int offset,int count);
public String(byte bytes[]);
public String(byte bytes[].int offset,int length);
public String(byte bytes[],Charset charset);//字符集
分别解释:
public String(String original);
public static void main(String[] args) {
String s = "超用心在线学习";
System.out.println(s);
//这里会创建两个对象,一个是字面量会在常量池中创建一个对象
//另一个是new String()构造方法创建出来的对象
String s1 = new String("超用心在线学习");
System.out.println(s1);
}
}
上面有String s = “超用心学习”,下面再创建就会先去常量池里查找,发现有一个,然后只创建一个堆内存对象
public String(char value[]);
public String(char value[],int offset,int count);
public static void main(String[] args) {
char[] values = {'a','d','m','i','n'};
String s2 = new String(values);
System.out.println(s2);
String s3 = new String(values,1,3);
//跳过1个,再继续输出3个
System.out.println(s3);
}
输出:
admin
dmi
public String(byte bytes[]);
public String(byte bytes[].int offset,int length);
public static void main(String[] args) {
byte[] bytes = {97,98,99,100,101,102};
String s4 = new String(bytes);
System.out.println(s4);
String s5 = new String(bytes,2,3);
System.out.println(s5);
}
输出:
abcdef
cde
字节可以存储整数,字符也可以用整数表示,这个整数就是ASCII码对应的整数值
public String(byte bytes[],Charset charset);//字符集
public static void main(String[] args) {
byte[] bytes = {97,98,99,100,101,102};
Charset charset= Charset.forName("UTF-8");
String s6 = new String(bytes,charset);//bytes编码为UTF-8
System.out.println(s6);
}
字符串的常用方法
获取长度:
public int length();//获取字符串长度
举例:
public static void main(String[] args) {
String s1 = "超用心学习";
int length = s1.length();
System.out.println(length);
}
字符串比较:
public boolean equals(Object anObject);//比较两个字符串是否相等
public boolean equalsIgnoreCase(String anotherString);
//忽略大小比较两个字符串是否相等
举例:
字符串之间比较时,首先会看两个字符串的长度是否相等,如果相等,再看其中每个字符是否相等
public static void main(String[] args) {
String s2 = "abc";
String s3 = "abc";
String s4 = "ABC";
System.out.println(s2.equals(s3));
System.out.println(s2.equals(s4));
System.out.println(s2.equalsIgnoreCase(s4));
}
字符串大小写转换:
public String toLowerCase();//转换成小写
public String toUpperCase();//转换成大写
举例:
public static void main(String[] args) {
String s2 = "abc";
String s4 = "ABC";
String s5 = s2.toUpperCase();
System.out.println(s5);
String s6 = s4.toLowerCase();
System.out.println(s6);
}
获取字符在字符串中的下标:
public int indexof( int ch);//获取指定字符在字符串中第一次出现的下标
public int lastIndexof(int ch);//获取指定字符在字符串中最后一次出现的下标
获取字符串在字符串中的下标:
public int indexof(String str);//获取指定字符串在字符串中第一次出现的下标
public int lastIndexof(String str);//获取指定字符串在字符串中最后一次出现的下标
获取字符串中的指定下标的字符:
public char charAt(int index);
举例:
public static void main(String[] args) {
String s = "kliy@aliyun.com";
int index1 = s.indexOf("@");//打印该字符串中第一个@的下标
System.out.println(index1);
int index2 = s.lastIndexOf("@");//打印该字符串中最后一个@的下标
System.out.println(index2);
int index3 = s.indexOf(".");
int index4 = s.lastIndexOf(".");
boolean case1 = (index1 == index2);
boolean case2 = (index3 == index4);
boolean case3 = (index3 - index2 > 1);
boolean case4 = (index1 > 0 && index4 < s.length());
if(case1 && case2 && case3 && case4){
System.out.println("字符串"+s+"是一个邮箱地址");
}
System.out.println(s.charAt(0));//k
}
字符串截取:
public String substring(int beginIndex);//从指定开始位置截取字符串,直到字符串末尾
public String substring(int beginIndex,int endIndex);
//从指定开始位置到指定结束位置截取字符串
示例:
字符串截取,截取时使用左闭右开区间 [0,4)
public static void main(String[] args) {
String s = "Java是一门非常高深的语言";
String sub1 = s.substring(0,4);
System.out.println(sub1);
String sub2 = s.substring(7);
System.out.println( sub2);
}
输出:
Java
非常高深的语言
字符串替换:
public String replace(char oldChar,char newChar);
//使用新的字符替换字符串中旧的字符
public String replace(CharSequence target,CharSequence replacement);
//使用替换的字符串来替换字符串中的字符串
public String replaceAll(String regex,String replacement);
//使用替换的字符串来替换字符串中满足正则表达式的字符串
示例:
public static void main(String[] args) {
String s = "hello world";
String s1 = s.replace('o','a');
System.out.println(s1);
String s2 = s.replace("o","a");
System.out.println(s2);
String info = "a1b2c3d4";
//regular expresssion 正则表达式
//三至五位数字的正则表达式
//[1-9][0-9]{2,4}
//英文字符串的正则表达式
//[a-zA-Z]+
//+ 表示任意长度
String result = info.replaceAll("[0-9]","");
//把其字符串中的数字替换成空
}
获取字符数组:
public char[] toCharArray();
获取字节数组:
public byte[] getBytes();.//获取字节数组
public byte[] getBytes(Charset cahrset);//获取指定编码下的字节数组
示例:
public static void main(String[] args) {
String s = "my god";
char[] values = s.toCharArray();
for(int i=0;i<s.length();i++){
System.out.println(values[i]);
}
byte[] bytes = s.getBytes();
for(int i=0;i<bytes.length;i++){
System.out.println(bytes[i]);
}
byte[] bytes1 = s.getBytes(Charset.forName("GB2312"));
System.out.println(bytes1);
}
字符串拼接:
public String concat(String str);//将字符串追加到末尾
去除字符串两端的空白字符:
public String trim();
示例:
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
String s3 = s1 + s2;
System.out.println(s3);
String s4 = s1.concat(s2);
System.out.println(s4);
String s5 = " ab cd ";
String s6 = s5.trim();//将字符串两端空格剪掉
System.out.println(s6);
}
字符串分割:
public String[] split(String regex);//将字符串按照匹配的正则表达式分割
字符串匹配正则表达式:
public boolean matches(String regex);//检测字符串是否匹配给定的正则表达式
示例:
public static void main(String[] args) {
String s = "a1b2c3d4";
String[] arr = s.split("[0-9]");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
String personInfo = "刘德华,男,53,很帅气";
String[] arr1 = personInfo.split(",");
for(int i=0;i<arr1.length;i++){
System.out.println(arr1[i]);
}
String regex = "[a-z0-9]+";
boolean match = s.matches(regex);
System.out.println(match);
}
不得不提到的intern()方法:
public native String intern();
示例:
public static void main(String[] args) {
String s1 = "超用心";
String s2 = "在线学习";
String s3 = s1 + s2;
String s4 = "超用心在线学习";
System.out.println(s3 == s4);//false
//将字符串s3放入常量池,放入时会先检测常量池中是否存在s3字符串,
//如果s3已经存在了,s5就直接使用s3的字符串地址即可,
//若不存在,就在常量池中创建字符串s3
String s5 = s3.intern();
System.out.println(s5 == s4);//true
}
StringBuilder和StringBuffer
特性介绍:
- 位于Java.lang包中,无需引入,可以直接使用
- 是由final修饰的,表示一个最终类,不可以被继承
- 所构建的对象可以实现字符序列的追加,但不会产生新的对象,只是将这个字符序列保存在字符数组中
构造方法:
以StringBuilder为例,这两个都一样的
public StringBuilder();//构建一个StringBuilder对象,默认容量为16
public StringBuilder(int capacity);//构建一个StringBuilder对象并指定初始化容量
public StringBuilder(String str);
//构建一个StringBuilder对象,并将指定的字符串存储在其中
示例:
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder(1024);
StringBuilder sb3 = new StringBuilder("超用心学习");
}
常用方法
追加:
public StringBuilder append(String str);//将一个字符串添加到StringBuilder存储区
public StringBuilder append(StringBuffer sb);
//将StringBuffer存储的内容添加到StringBuffer存储区中
示例:
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder(1024);
sb1.append("超用心学习");
sb1.append(1);
sb1.append(1.0);
sb1.append(true);
sb1.append('a');
System.out.println(sb1);
}
输出:
超用心学习11.0truea
删除指定区间存储的内容:
public StringBuilder delete (int start,int end);
//将StringBuilder存储区指定的开始位置到指定的结束位置直接的内容删除
删除存储区指定下标位置存储的字符:
public StringBuilder deleteCharAT(int index);
示例:
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("abcdefg");
builder.delete(1,5);//区间(1,5),不包括1和5
System.out.println(builder);//afg
builder.deleteCharAt(0);
System.out.println(builder);//fg
}
在StringBuilder存储区指定偏移位置处插入指定的字符串:
public StringBuilder insert(int offset,String str);
将存储区的内容倒序:
public StringBuilder reverse();
示例:
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("admine");
builder.reverse();
System.out.println(builder);//enimda
builder.insert(2,",");
System.out.println(builder);//en,imda
//需要注意的是:length()方法返回的是char[]中使用的数量
System.out.println(builder.length());//6
}
获取指定字符串在存储区中的位置:
public int indexof(String str);//获取指定字符串在存储区中第一次出现的位置
public int lastIndexof(String str);//获取指定字符串在存储区中最后一次出现的位置
例题:
将从控制台输入的数字转换成财务数字(101,111,001.25)(使用StringBuilder完成)
public static void main(String[] args) {
//将从控制台输入的数字转换成财务数字(101,111,001.25)
//(使用StringBuilder完成)
Scanner sc = new Scanner(System.in);
System.out.println("请输入一串数字:");
double money = sc.nextDouble();
StringBuilder builder = new StringBuilder();
builder.append(money);
int index = builder.indexOf(".");//打印.的下标
if(index>3){
for (int i=index-3;i>0;i-=3){
builder.insert(i,".");
}
}
System.out.println(builder.toString());
}
对比String 和StringBuilder 和 StringBuffer
都是用来处理字符串的,在处理少量字符串的时候,它们之间的处理效率几乎没有任何区别,但是处理大量字符串时,
由于String类的对象不可更改,因此在处理字符串会产生新的对象,对内存消耗较大。
StringBuilder和StringBuffer使用的是对字符串的字符数组内容进行拷贝,不会产生新的对象,因此效率较高。
而StringBuffer为了保证在多线程情况下字符数组中的内容正确使用,在每个成员方法上面加了锁,有锁就会增加消耗,因此StringBuffer在处理效率上低于StringBuilder