对于String在Java当作使用波多,但是,笔者目前没有总结过多少,在今日接触到了不少关于String的问题,那么,恰逢此时,笔者来做一个总结吧!!来聊一聊Java中String的那些事??
由于笔者在一开始学习了C语言,然后在学习的Java部分!所以笔者从C语言开始说起吧!
请各位学过C语言的老铁,来仔细思考一下:在C语言阶段,有没有一种数据类型是:String类型的呢??显而易见的,在C语言中这个是没有吧!!对于char *p="hello";而言,此时p仅仅是一个指针变量类型,但是,在Java中,我们有了一个全新的类型:String str="hello";
String str="hello";
//打印
System.out.println(str);
在这个代码中,str存储的仍然为'h'的地址,不过这个我们是看不到的!因为在Java中,没有指针,当然也拿不到地址了!!
提醒:在Java中,没有所谓的字符串以'\0'结尾的说法!——》根据字符串的个数,来判定是否结束,"hello'有五个字符,则打印5个字符就可以结束了!
字符串相加:
//整型相加:
int a=10;
int b=20;
System.out.println(a+b);
//字符串相加
String str1="hello ";
String str2="world ";
System.out.println(str1+str2);
在Java当中,在字符串当中,如果两个字符串进行相加,那么,它的意思是:拼接!!
上面是一些前言部分,那么,接下来进入敲黑板的环节!!
String是专门用来存放字符串类型的!
各位老铁可以回顾一下目前阶段的代码,想必,不是数组就是字符串居多吧!所以,目前的String的学习还是很重要的!
当我们在IDEA中,连续摁两下SHIFT键,搜素一下String,那么,我们就可以得到String相关的……嗯!
当我们在学习一个类的时候,一定要从构造方法开始学习,原因在于:类的目的就是实列化对象,那么,实列化对象的首要条件就是:一定会调用构造方法!!所以归根结底还是得从构造方法开始学习!!
String str3="hello3";
String str4=new String("hello4");
System.out.println(str3);
System.out.println(str4);
在这个代码中,对于str4的这个写法,其实是比较常见的!!在该过程中,调用了默认的构造方法!
当然,在String的构造方法中也可以传入一个字符数组!
char[] ch={'h','e','l','l','o'};
String str5=new String(ch);//调用默认的构造方法!
System.out.println(str5);
在上述的这个代码中,就传入了字符数组,那么,在实列化的过程,就会调用默认的构造方法!
String是引用类型,内部并不会存储字符串,而是存储字符串的首地址!!
//求字符串的长度
String str6="hello6";
System.out.println(str6.length());
//求字符数组的长度
char[] ch1={'h','e','l','l','o','6'};
System.out.println(ch.length);
我们需要注意,这两个方法中的length后面是否带有括号()!!这个问题,经常在我们手撕算法的时候出错!!特别警告!!
String中的空与不指向任何对象
String str7="";//里面没有存放任何东西
System.out.println(str7.length());//0
System.out.println(str7.isEmpty());//true
//str8不指向任何对象
String str8=null;
在Java中,”“(双引号)引起来的就是字符串(String对象)的长度!
System.out.println("xiaojunzi".length());//9
当然,这种写法也是正确的,经得住考验!!
作为在String中吃过亏的笔者,来告诉大家一下:我们在以后,会经常遇到:判断两个字符串一样不一样??判断两个字符串谁大谁小的问题!
其实,说白了,对于字符串一般有下述的两个问题:
相不相同?
大小?
在这之前,我们一般都是通过等号(==)来进行比较相不相同,那么,这个判断在String是一种错误的选择!!
String str9=new String("hello");
String str10=new String("abcd");
String str11=new String("hello");
System.out.println(str9==str10);//false
System.out.println(str9==str11);//false
在这个代码中:通过str9==str11的结果考验显示:通过等号(==)来比较字符串,是一个错误的决定!!通过等号(==)确定的是:判断保存的地址一样不一样!!
如果我们要判断两个字符串里面存放的内容是否一样,那么,我们就需要用到:.equals()
System.out.println(str9.equals(str10));//false
System.out.println(str9.equals(str11));//true
.equals()比较两个引用所指向的对象当中的内容是否一样!!.equals()只能判断是否相同,但是对于两个字符串的大小关系是不能比较的!!
比较大小用:.compareTo()
System.out.println(str9.compareTo(str10));//7
System.out.println(str9.compareTo(str11));//0
.compareTo()会返回一个大于0的数字/等于0的数字/小于0的数字,至于具体是多少,这就得根据两个相比较的字符串来进行判定了!!强求不得!当然,这个我们也可以看.compareTo()的源码来得出!!
但是,当我们要比较的两个字符串需要忽视大小写,如何进行比较??比如:将”Hello“与”hello“判断为一样?
String str12=new String("Hello");
String str13=new String("hello");
//忽视大小写比较
System.out.println(str12.compareToIgnoreCase(str13));
但是,当我们输入的数据为;中文与英文的混合,那么, 该数据则没有可比性了!!
忽略大小写,判断是否相同:
String str12=new String("Hello");
String str13=new String("hello");
//忽略大小写,判断是否相同:
System.out.println(str12.equalsIgnoreCase(str13));
对于字符串的查找也是一个非常重要,非日常常见的操作,String类提供的常用的查找方法:
char charAt(int index)
//返回index位置上的字符,如果index为负数或者越界,那么,会抛出异常
int indexOf(int ch)
//返回ch第一次出现的位置,没有则返回-1
int index(int ch,int fromIndex)
//从fromIndex位置开始找ch第一次出现的位置,没有则返回-1
int indexOf(String str)
//返回str第一次出现的位置,没有则返回-1
int indexOf(String str,int fromIndex)
//从fromIndex位置开始找str第一次出现的位置,没有则返回-1
int lastIndexOf(int ch)
//从后往前找,返回ch第一次出现的位置,没有则返回-1
int lastIndexOf(int ch,int fromIndex)
//从fromIndex位置开始,从后往前找ch第一次出现的位置,没有则返回-1
int lastIndexOf(String str)
//从后往前找,返回str第一次出现的位置,没有则返回-1
int lastIndexOf(String str,int fromIndex)
//从fromIndex位置开始,从后往前找str第一次出现的位置,没有则返回-1
对于上述的这些方法,我们可以在官方文档中找到!!
由于官方文档所涉及到的内容比较多,笔者也不可能全部讲完,所以只能选择几个来作为列子进行使用一下!!
//char charAt(int index)
//返回index位置上的字符,如果index为负数或者越界,那么,会抛出异常
String str1="hello";
char ch=str1.charAt(1);//这里的1是指下标!
System.out.println(ch);
//通过遍历可以拿到整个字符串
for (int i = 0; i < str1.length(); i++) {
System.out.print(str1.charAt(i)+" ");
}
System.out.println();
//int indexOf(int ch)
//返回ch第一次出现的位置,没有则返回-1
String str2="abababcabcdabc";
int arr=str2.indexOf('c');
System.out.println(arr);
// int index(int ch,int fromIndex)
//从fromIndex位置开始找ch第一次出现的位置,没有则返回-1
String str3="abababcabcdabc";
System.out.println(str3.indexOf('c',5));
// int indexOf(String str)
//返回str第一次出现的位置,没有则返回-1
String str4="abababcabcdabc";
System.out.println(str4.indexOf("abcd"));
//int indexOf(String str,int fromIndex)
//从fromIndex位置开始找str第一次出现的位置,没有则返回-1
String str5="abababcabcdabc";
System.out.println(str5.indexOf("abcd",5));
// int lastIndexOf(int ch)
//从后往前找,返回ch第一次出现的位置,没有则返回-1
String str6="abababcabcdabc";
System.out.println(str1.lastIndexOf('a'));
// int lastIndexOf(int ch,int fromIndex)
//从fromIndex位置开始,从后往前找ch第一次出现的位置,没有则返回-1
String str7="abababcabcdabc";
System.out.println(str6.lastIndexOf('a',7));
//int lastIndexOf(String str,int fromIndex)
//从fromIndex位置开始,从后往前找str第一次出现的位置,没有则返回-1
String str8="abababcabcdabc";
System.out.println(str7.lastIndexOf("abc",8));//返回的是首字符a的下标
上述代码的运行结果为:
1.数字和字符串的转化
String str9=String.valueOf(123);
System.out.println(str9);
将数字123转化为字符串123,在最后打印出来的一定是一个字符串了,不信的各位老铁,可以对打印的结果进行+1/-1处理,这样就能判断是否转化成功了!
当然,我们也可以将任意类型转化为字符串!
class Person{
}
String str10= String.valueOf(new Person());
System.out.println(str10);
最好的打印结果……嗯,这就不用说了吧!类似于C/C++中的地址一样的一串字符+数字
2.字符串转数字
String str11="123";
int data=Integer.parseInt(str11);
System.out.println(data);
这个最后的结果就是数字123了!!不信的各位老铁,可以对打印的结果进行+1/-1处理,这样就能判断是否转化成功了!借助了包装类来进行转化!
3.大小写的转化
小写转大写操作
String str12="abcdef";
System.out.println(str12.toUpperCase());
大写转小写的操作
String str13="ABCDEFG";
System.out.println(str13.toLowerCase( ));
对于这两个大写转小写/小写转大写的操作,想必大家都或多或少的经历过吧!!比如:输入验证码:大小写忽略的情况!!
4.字符串转数组(用到的非常多)
String str14="abcdef";
char[] ch1=str14.toCharArray();
//可以遍历数组,也可以对数组里面的字符进行操作
for (int i = 0; i < ch1.length; i++) {
System.out.print(ch1.length+" ");
}
5.字符串替换
所谓的字符串替换,是指:使用一个新的字符串替换掉已有的字符串,可以使用的方法如下:
//替换所有的指定内容
String repalce(String regex,String repalcement)
//替换首个内容
String repalceFrist(String regex,String repalcement)
请看下述替换掉所有的指定内容的代码:
//替换掉所有的字符
String str1="abababcdabcabcde";
String ret=str1.replace('a','p');
System.out.println(ret);
System.out.println(str1);
在这里,我们需要注意的是:所谓的转化,是指:所有的字符串的转化都不是在原来字符串进行改变,都会产生一个新的对象!(原来的字符,并不会发生改变!),不相信的各位老铁,可以打印试一下情况!!
public static void main(String[] args) {
String str1="ababababcabcdabcde";
String ret1=str1.replace("ab","0000");
System.out.println(ret1);
//ret1与ret2有相同的效果
String ret2=str1.replaceAll("ab","0000");
System.out.println(ret2);
//把第一个ab替换为0000
String ret3=str1.replaceFirst("ab","0000");
System.out.println(ret3);
}
该段代码的运行结果为;
顾名思义:字符串的拆分,就是将一个完整的字符串按照指定的分隔符划分为若干个子字符串,可用方法如下:
String[] split(String regex)
//把字符串全部拆分
String[] split(String regex,int limit)
//把字符串以指定的格式,拆分为limit组
那么,请看接下来的代码吧!
String str2="Hello EveryBoby Happy";
String[] arr=str2.split(" ");
//以空格进行拆分
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println();
String str3="Hello EveryBoby Happy";
String[] array=str3.split(" ",2);
//以空格进行拆分,拆分成两组
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]+" ");
}
System.out.println();
}
代码的运行结果为:
上述便是主要的大致内容了,但是,笔者还是忍不住整点注意事项!毕竟这个注意事项也是挺常见的!!
注意事项:(竖号,逗号,乘号,点号)
字符“|“,“,“,“*“,“.“都得写上转义字符,即前面加上”\\”;
如果是以“\\“为分隔符,那么,我们就得写成”\\\\”;
如果一个字符串有多个分隔符,那么,我们可以用“|“作为连接符!(当然,我们也可以分割完这个,在分割下一个!)
比如:我们最常见的IP地址,就得以”.”(点号)来进行分割
String str1="129.168.0.1";
String[] arr=str1.split("\\.");
for (int i = 0; i < str1.length(); i++) {
System.out.println(arr[i]);
}
代码的运行结果为:
有多个分隔符的情况:
String str1="192&168=1";
String[] ret=str1.split("&|=");
for (int i = 0; i < ret.length; i++) {
System.out.println(ret[i]);
}
代码的运行结果为:
当然,上述的多个分隔符的情况,我们也可以采取多次拆分的方法!!
String str1="192&168=1";
String[] arr=str1.split("&");
//先以”&“进行拆分
for (int i = 0; i < arr.length; i++) {
String[] array= arr[i].split("=");
//再以”=“等号进行拆分
for (String s:array) {
System.out.println(s);
}
}
该段代码的运行结果为:
当然对于该段代码的写法,笔者不怎么提倡!!写出来就是为了让大家了解一下该方法罢了!!当作一个娱乐即可!
当我们看到:截取,那么,想必我们可能就理解啥意思了吧!!
所谓的截取,就是从一个完整的字符串之中截取出部分内容,可用方法如下:
String subString(int beginIndex)
//从指定索引截取到结尾
String subString(int beginIndex,int endIndex)
//截取部分内容
注意:上述的所有代码,都不是在原来字符串进行替换的,都会产生一个新的对象!!
String str="abcdefghijklmn";
String s=str.substring(2);
//返回从2位置开始截取的所有字符
System.out.println(s);
String s2=str.substring(2,6);
//[2,6)左闭右开
System.out.println(s2);
上述代码的运行结果为:
笔者仅写几个使用比较多的情况!
String trim()
//去掉(删除)字符串中的左右空格,保留中间空格
String toUpperCase()
//字符串转小写
String toLowerCase()
//字符串转小写
以:删除掉字符串左右两边的空格,保留中间空格为列:
String str=" hello abcd ";
System.out.println(str);
//删除字符串中的左右两边的空格,仅保留中间的空格
String ret=str.trim();
System.out.println(ret);
该段代码的运行结果为:
具体请见代码的运行结果(根据代码的运行结果可以看出:删除掉了字符串左右两边的空格,仅仅保留了中间的空格)