String 类
- ** 概念**
String 类的实例表示一个字符串,String 是一种不可变字符串,一对字符串进行改变操作,则创建一个全新的对象,然后把引用指向这个新的对象。 - 声明方式
String s = "abc";
String s = new String("abc");
//其他参考API手册
- 相等比较
public static void main(String[] args){
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println( s1==s2);// true: 都引用常量
System.out.println( s3==s4);// 无法编译优化,需要运行期决定 false
System.out.println( s1==s3);// 无法编译优化,需要运行期决定 false
String x1="a";
String x2="b";
String x3="a"+"b";
String x4="ab";
System.out.println(x3==x4);// true: x3: 为常量运算,编译可优化确定"ab"常量进入常量池 x4可以引用常量。
String m1 = "i";
String m2 = "love";
String m3 = "you";
String m4 = "iloveyou";
String m5 = m1+m2+new String("you");
System.out.println(m4==m5 ); // false: m5引用了变量,无法直接引用常量吃中的字符串对象
}
- String API
为方便对字符串处理,String 类提供了大量的方法。需要注意的是这些方法都不会对字符串本身做修改,而是返回处理结果,或者处理完成后,返回处理后的新字符串。
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "你要悄悄学python惊艳所以人! pythonNB.mp4";
//使用字符串api来处理字符串
//1. 获得长度 length():int
System.out.println( str.length() );
//2. 获得指定下标处的字符 charAt(int index):char
System.out.println( str.charAt(1) );
//3. 查看字符串中时候包含 指定字符串内容 contains(String str):boolean
System.out.println( str.contains("python") );
//4.把字符串转出字符数组 toCharArray():char[]
char[] chs= str.toCharArray();
System.out.println( Arrays.toString(chs) );
//5. 查询指定字符串的首次出现的下标 indexOf(String str):int
System.out.println( str.indexOf("py") );
// 从指定位置后查找
System.out.println( str.indexOf("py", 8));
// 反向查找
System.out.println( str.lastIndexOf("py") );
// 反向查找,从指定位置前
System.out.println( str.lastIndexOf("py", 18) );
//6 去除字符串两端的空格 trim():String
System.out.println(str.trim() );
//7 把小写转成大写 toUpperCase():String
System.out.println( str.toUpperCase() );
//8 大写转小写 toLowerCase():String
System.out.println( str.toLowerCase() );
//9 判断字符串是否以某个字符串结尾 endsWith( String s ):boolean
System.out.println( str.endsWith( "mp4" ) );
//10 判断字符串是否以 某个字符串开始 startsWith(String s):boolean
System.out.println( str.startsWith("你") );
//11.替换字符 replace(char oldChar, char newChar):String
System.out.println( str.replace('你', '我') );
// replace(String str, String str2):String
System.out.println( str.replace("python", "java") );
String ss = "abcdefg12mly3s5";
//正则:用一个模式去匹配字符串是否符合这个规则 replaceAll(String reg, String newStr):String
System.out.println( ss.replaceAll("[a-z]", "*") );
//13 字符串拆分 split(String reg):String[]
String mm = "刘德华,歌手,50,香港";
String[] info = mm.split(",");
System.out.println( info[0] );
// 14 字符串截取
System.out.println( str.substring(5) );
System.out.println( str.substring(5, 10));
// 15 字符串编码解码问题【防止乱码编码一致】
String dd = "奥利给";
byte[] bs = dd.getBytes();//[-80, -62, -64, -5, -72, -8]
byte[] bs = dd.getBytes("UTF-8");//[-27, -91, -91, -27, -120, -87, -25, -69, -103]
System.out.println(Arrays.toString(bs) );
//编码
byte[] bbs = {-27, -91, -91, -27, -120, -87, -25, -69, -103};
String sss = new String(bbs, "utf-8");
}
- StringBuider
可变字符串,内部维护了一个字符串缓冲区,可以实现在现有字符串基础上做修改,适用频繁修改字符串的场景
java 中提供了两种可变字符串类型,他们的api完全兼容。
StringBuilder sb = new StringBuilder(); //创建一个空可变字符串
StringBuilder sb = new StringBuilder("abc")//创建一个初始化内容的可变字符串
StringBuilder JDK5 新增类 线程不 安全 执行效率高。适用于单线程环境,或者对数据一致性没有要求。
- StringUuffer
StringBuffer sb = new StringBuffer(); //创建一个空可变字符串
StringBuffer JDK1.0 就有, 线程安全 执行效率低,适用于多线程环境
- 常见API
package ch1;
public class StringBuilderAPI {
public static void main(String[] args) {
//创建方式:
StringBuilder sb = new StringBuilder();//"床前明月光,疑是地上霜。"
//追加
sb.append("床前明月光,疑是地上霜。");
sb.append("举头望明月,低头思故乡。");
//插入
sb.insert(0, "静夜思");
sb.insert(3, "\n");
//删除
sb.deleteCharAt( sb.indexOf("举") );
//替换
sb.replace(sb.lastIndexOf("明月"),sb.lastIndexOf("明月")+"明月".length() , "太阳");
//反转
sb.reverse();
System.out.println(sb);
//String 与 StringBuilder 转换
//1 . StringBuilder 通过toString() 转成String
String str = sb.toString();
System.out.println(str);
//2. String 转 StringBuilder 通过 StringBuilder 构造器
String ss= "小明鬼畜";
StringBuilder sbb = new StringBuilder(ss);
System.out.println(sbb);
}
}