Java se的String类的详解

string是什么?

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,小于就是返回负数

字符串的查找

charAt字符,通过下标找字符

String s1 = new String("hello");
char ch = s1.charAt(1);
System.out.println( ch );

注意在使用的时候charAt(1);这里面的下标不可以越界

lostIndexof,倒着查找字符

String s1 = new String("ababcabcd");
int index = s1.lostIndexof("abc");
System.out.println( index );

在这个查找里面,输出时候会输出开头字母的位置,也可以自定义起点

indexof,通过字符查找下标

String s1 = "hello";
int index = s1.indexof( ' h ' );
System.out.println( index ); 

这个默认是从头开始遍历的,但是也可以定义遍历开始的起点

int index = s1.indexof(‘ h ‘, 3);
这个3就是遍历开始的起点
int index = s1.indexof(‘ el ‘);
也可以对数组的位置进行找,输出的是第一个字母位置,也可以自定义起点

String类型里面的一些转化

数值与字符串的转化

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给范围是区间,给单个数字就是从某个开始

为什么String的设计要是不可变的?

1>方便实现字符串对象池,如果String可变,那对象池就要考虑写时拷贝问题了
2>不可变对象是线程安全的
3>不可变对象更方便缓存hash code,作为key时候可以更高效的保存到hashmap中

String的拼接

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>两者包含的方法也不同;

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小董是不懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值