public class Test{
public static void main(String [ ] args){
String str = "hello";
System.out.println(str);
}
}
可以看出,这个字符串hello在书写的时候,我们并没有用‘\’来进行结尾,因为在Java中,字符串是不需要 \ 来进行结尾的
而且,本质的话,我们在println那应该是访问地址的,但是在String的底层里,其实对’ str ’ 进行了重写,所以在输出时候,就会直接输出str里面的内容
1>使用常量串进行构造
String str = " hello "
输出为hello
2>直接new String一个对象
String str = new String(" ppp ");
输出为ppp
3>使用字符数组进行构造
char [ ] array = {' a ' , ' b ' , ' c '};
String str = new String(array);
这个输出为abc
注意:String是一个引用类型,内部并不会存储字符串本身
这个图,是一个String里面包含的两成员
接下来举一些例子
String s1 = new String("hello");
String s2 = new String("world");
String s3 = s1;
String s4 = " ";
String s5 = null;
这一个就是s1以及s3的示意图,s2的话和s1的极其相似
可以通过图看出来,String是一个引用类型,我们是通过指向我们所要引用的对象,然后进行输出的
s4的话就是指向内部为空,什么都没有
s5的话就是代表s5不指向任何对象
System.out.println(s4.leng() );
System.out.println(s5.leng() );
在这里的话,s4就是输出一个空格
s5就是会报空指针异常
System.out.println(s4.isEmpty() );
System.out.println(s5.isEmpty() );
在这个里面就是s4会输出一个true,
s5会报空指针异常
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println( s1 == s2 );
可以看出在上面这个s1和s2里面,String指向的都是hello,但是地址却是不一样的,所以s1 == s2这个在输出的时候会是false
System.out.println( s1 . equals(s2) );
如果是想判断字符串是否相等就可以用equals来进行判断,这时候的输出结果就是true
1>有大小写区别的比较
String s1 = new String("abc");
String s2 = new String("acb");
System.out.println( s1 . compareTo(s2) );
在这里面如果s1大于s2就是返回正数,等于就是返回0,小于就是返回负数
2>忽略大小写进行比较的(一般用于验证码校对中)
String s1 = new String("abc");
String s2 = new String("acb");
System.out.println( s1 . compareToIgnoreCase(s2) );
在这里面如果s1大于s2就是返回正数,等于就是返回0,小于就是返回负数
String s1 = new String("hello");
char ch = s1.charAt(1);
System.out.println( ch );
注意在使用的时候charAt(1);这里面的下标不可以越界
String s1 = new String("ababcabcd");
int index = s1.lostIndexof("abc");
System.out.println( index );
在这个查找里面,输出时候会输出开头字母的位置,也可以自定义起点
String s1 = "hello";
int index = s1.indexof( ' h ' );
System.out.println( index );
这个默认是从头开始遍历的,但是也可以定义遍历开始的起点
int index = s1.indexof(‘ h ‘, 3);
这个3就是遍历开始的起点
int index = s1.indexof(‘ el ‘);
也可以对数组的位置进行找,输出的是第一个字母位置,也可以自定义起点
1>
String s = string . valueof(19.9);
System.out.println( s );
这里面输出的是19.9
不过虽然输出的是19.9,但是这并不是double类型,而是String类型
其中valueof是任何类型都可以转化为整型
2>
int data = Interger . ParseInt("198");
System.out.println(data);
在这里 Interger是包装类型,ParseInt这个就是要转化为int类型,就是parse后面跟着要转化的类型
String s1 = "hello" ;
String ret = s1 . toUpperCase( ) ;
System.out.println(ret);
在这里面的那个ret是用来接收转化以后的大写的,所以可以得出,这个转化并不是在原有的基础上转化,而是转变为大写以后,会是一个新的对象
把toUpperCase这个,换成toLwerCase就是大写转化为小写了
String s1 = "hello" ;
char [ ] array = s1 . tocharArray( ) ;
System.out.println(Arrays.toString(array));
输出的就是[h,e,l,l,o]
char [ ] array2 = {'a', 'b', 'c'};
String str2 = new String(array2);
System.out.println(str2);
输出的是abc,这个是数组转字符串
String s = string.format("%d-%d-%d",2019,9,14);
System.out.println(s)
String str = "ababcabcd";
String ret = str.replace("ab","999");
这个就是把所有ab替换为999
ret = str.replace('a','8');
就是把所有的a替换为8
ret = str.replaceFirst("ab","ppp");
把第一个ab转化为ppp
ret = str.replaceAll("ab","123");
把所有ab转化为123
String str = "hello abc world";
String [ ] ret = str.split(" ");
这个地方就是以什么分割就输入什么,这里就是以空格分隔
for(int i = 0; i < ret.lenght; i++){
System.out.println(ret[i] );
}
最后输出时候就是
hello
abc
world
而不会一起输出了
String [ ] ret = str.split(" ",2);
这个就是以空格最多分两组
注意:字符"/“,”+“,”*“,”-“,这样的分割,前面需要加上”\“,如果分割符为”\“,那么就要写出”\\"
如果想要多种情况分割,就以"|",进行连接
String str = "name=zhangsan&age=15";
String [ ] ret = str.split("=|&");
for(int i = 0; i < ret.lenght; i++){
System.out.println(ret[i] );
}
这样的话最后的输出就是
name
zhangsan
age
15
String str = "ababc";
String ret = str.substring(0,3);此处为左闭右开
System.out.println(ret);
这时候输出为aba了
ret = str.substring(2);
这个输出就是abc了
substring给范围是区间,给单个数字就是从某个开始
1>方便实现字符串对象池,如果String可变,那对象池就要考虑写时拷贝问题了
2>不可变对象是线程安全的
3>不可变对象更方便缓存hash code,作为key时候可以更高效的保存到hashmap中
String str = "hello";
str = str + "abc";
System.out.println(str);
这时候输出的就是helloabc
底层的实现逻辑就是
String str = "hello";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder . append(str);
stringBuilder . append("abc");
str = stringBuilder . toString( ) ;
System.out.println(str);
String , StringBuilder, StringBuffer的区别???
1>后面两个是可变的,String是不可变的,例如上面的拼接的话,String是产生一个新的对象,
StringBuilder, StringBuffer就是本身发生改变
2>两者包含的方法也不同;