Java中关于字符串
创建字符串的3+1种方式
String字符串实现原理为byte[],使用的是ASCII编码
可以通过new 和 双引号两种方式创建对象
byte[] bytes = {97,98,99,100};
String s = new String(bytes); //第一种使用byte数组
System.out.println(s);
char[] chars = {'a','b','c'};
String s2 = new String(chars);//第二种使用char数组
System.out.println(s2);
String s3 = new String(); // 第三种不带参数相当于""
System.out.println(s3);
还可以直接用双引号,直接使用双引号也是创建字符串对象,此时是JVM自动完成的。
不同创建方式之间的区别
String str1 = "abc" ;
String str2 = "abc" ;
char[] charArray = {'a', 'b', 'c'};
String str3 = new String( charArray ) ;
System.out.println(str1 == str2); l// true
System.out.println(str1 ==str3); // false
System.out.println(str2 ==str3); // false
所有直接用双引号创建的字符串对象是在堆中的字符串常量池中创建的。
因为String底层为byte数组,创建字符串对象的时候会在堆中创建一个byte数组,常量池中的字符串对象存放着该byte数组的地址。
注:此处为何存放的是地址,因为是引用类型,参考自定义的类。
而如果使用的new来创建字符串对象,则是直接在堆中创建,原理和上面类似,先创建byte数组,将地址传给String对象。
为何得出的比较结果不同
”==“ 在用于基本类型比较时是比较其数值,而在用于引用类型时比较的是其地址值。
所以就知道了为何str2和str3比较的结果为false了。
注意String对象不能直接用, >、< 和 等号 来比较
应该使用compareTo或者compareToIgnoreCase
String s4 = "34";
String s5 = "44";
if (s4.compareTo(s5)>0){
System.out.println("大");
}else if (s4.compareTo(s5)<0){
System.out.println("小");
}else {
System.out.println("等");
}
字符串中的获取方法
String当中与获取相关的常用方法有:l
- public int length():获取字符串当中含有的字符个数,拿到字符串长度。
- public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串。
- public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始。)
- public int index0f ( String str):查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1值。