文章目录
1.String类基本用法
- String类就是字符串类 是引用类型
构造方法(字符串的创建)
//字符串的创建
//方式一
String str1 = "abcdef";
//方式二
String str2 = new String("abcdef");
//方式三
char[] array = {'a','b','c','d'};
String str3 = new String(array);
字符串是引用类型,在内存中的存储如图
2. 字符串常量池
String str1 = "abcdef"
这种方式创建的字符串直接存放在在堆中的常量池 ,并将字符串所在常量池的地址给str1
String str1 = new String("hello").intern() ;
而这种方式创建的在堆中但不在常量池,而是在堆中new了一块内存,并且存放的是常量池“abcdef”字符串的引用
使用 String 的 intern 方法来手动把 String 对象加入到字符串常量池
String str1 = new String("hello").intern() ;
3. 字符串的常用方法
- 字串串的获取长度
String str1 = "abcdef";
int len = str1.length();//length() 是一个方法
数组的获取长度
char[] ch = {1,2,3,4,5};
int len = str1.length;//length 是一个属性
- 字符串比较
String str1 = "abcdef";
String str2 = new String("abcdef");
System.out.println(str1 == str2);//false
String str3 = new String("abcdef");
System.out.println(str2 == str3);//false
3.1字符串比较相等
1.//如果两个字符串常量直接拼接+ 那么在编译期间就处理为拼接的结果,并且在常量池中只存在一份拼接后的结果
String str4 = "ab"+"cdef";//abcdef final int a = 10
System.out.println(str1 == str4);//true
2.// 和 int或者double拼接都一样,因为编译时,只要有字符串,则其它都转化为字符串,
//而且在常量池储存的也是拼接后的结果
String str10 = "hello" + 10;//"hello10"
String str11 = "hello10";
System.out.println(str10 == str11);
3.//这种拼接是在 运行时 才进行的拼接,new 一个新的对象都是运行时进行,在常量池中"ab"存一份,"cdef"存一份
String str5 = "ab" + new String("cdef");
System.out.println(str1 == str5);//false
//str1.equals(str5) 比较两个字符串是否相等,是按照ASCII码表值进行比较,返回true/false
//str1.equalsIgnoreCase(str5) 是不区分大小比较相等,
System.out.println(str1.equals(str5));//true
System.out.println(str5);
4.//运行时进行相加,相加完之后会在堆中(不是在常量池,运行时new的都在堆上)创建一个新的对象,并将新对象的引用赋值给str8
String str6 = "ab";
String str7 = "cdef";
String str8 = str6+str7;
System.out.println(str1 == str8);// false
System.out.println(str1.equals(str8));
5.比较大小:
str1.equals(str5) 比较两个字符串是否相等,是按照ASCII码表值进行比较,返回true/false
str1.equalsIgnoreCase(str5) 是不区分大小比较相等,
str1.compareTo(str5) 按照ASCII码表值比较大小,返回值为int
/**
* 如果对应位置相同一直往后走
* 找到不一样的字符 进行比较,
* str1和str2
* str1 > str2 >0
* str1 < str2 <0
* str1 == str2 =0
* 比较完成之后,返回差值,结束。不再进行向下比较
*/
String str1 = "abcdef";
String str2 = "abfdef";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equalsIgnoreCase(str2));
System.out.println(str1.compareTo(str2));
3.2字符(char)和字符串
1. //数组 --》 字符串
char[] value = {'a','b','c','d','e'};
String str = new String(value);//将字符数组转为字符串
System.out.println(str);
// String copyValueOf(char data[])也可以将数组转为字符串,
//但类型只能为字节类型(char)
String str1 = String.copyValueOf(value);
2. //数组 --》 字符串 (从某个位置开始转成字符串)
//String str2 = new String(value,1,4)
//将字符数组 从偏移量offset位置(下表位置1)开始的count个字符(4个字符)来构造字符串
//运行时期的异常:StringIndexOutOf.....
String str2 = new String(value,1,4);
System.out.println(str2);
String str3 = "abcdef";
String copyValueOf(char data[], int offset, int count)
3.//.....charAt(参数:下标-》0) 获取字符串的下表位置的 字符
/*char ch = str3.charAt(4);
System.out.println(ch);*/
System.out.println(str3.charAt(3));
4. //字符串 --》 数组
char[] crray = str3.toCharArray();
System.out.println(Arrays.toString(crray));
3.3 字节(byte)和字符串
1.// 字节数组 --》 字符串
byte[] brray= {97,98,99,100};
System.out.println(Arrays.toString(brray));
2. // 字节数组 --》 字符串(从某个位置开始转成字符串)
//从偏移量1的位置开始的length个字节来构造字符串
String string = new String(brray,1,3);
System.out.println(string);
3.// 字符串 --》 字节数组
String string1 = "abcdef";
byte[] bytes = string1.getBytes();
System.out.println(Arrays.toString(bytes));
4. // 字符串 --》 字节数组 可设置转换的编码方式
//编码转换处理
String string2 = "中";
byte[] bytes2 = string2.getBytes("unicode");
System.out.println(Arrays.toString(bytes2));
3.4.字符串的查找
3.5.字符串的替换
3.6字符串的拆分
String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}
String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}
3.7字符串的截取
String str = "helloworld" ;
System.out.println(str.substring(5)); //world
System.out.println(str.substring(0, 5));//hello 范围为 前闭后开