当前位置: 首页 > 后端技术 > Java

String类及常用方法

时间:2023-04-01 18:35:49 Java

String:字符串,用一对双引号“”表示。String被声明为final,不能被继承。String实现了Serializable接口:表示该字符串支持序列化。(IO流中会提到序列化)String实现了Comparable接口:表示String可以进行大小比较String内部定义了最终的char[]值,用于存储字符串数据String:表示一个不可变的字符序列,具有不可变的特性;简称:Immutability通过字面量(区别于new)给字符串赋值,此时的字符串值声明在字符串常量池中。内容相同的字符串不会存储在字符串常量池中。不可变特性是指在方法区有一个字符串常量池。例如,如果您声明一个名为“abc”的字符串并将其赋值给一个变量s1,并且您声明一个变量s2,您也赋值了“abc”。事实上,它们指向同一个地址。不会说你再声明一样的内容再给你加进去。反思:对字符串重新赋值时,需要重新分配内存区域,不能使用原来的值进行赋值。这意味着您无法更改原始值。在字符串常量池中,您将创建另一个您重新分配的值,并将新值的地址赋予您需要重新分配的变量。在对已有的字符串进行拼接操作时,也需要重新指定内存区赋值,不能使用原来的值进行赋值。在调用String的replace方法时,修改指定的字符或字符串时,也需要重新指定内存区域进行赋值,不能使用原来的值进行赋值。示例:@Testpublicvoidtest1(){Strings1="abc";Strings2="abc";//s1="你好";System.out.println(s1==s2);System.out.println(s1);System.out.println(s2);System.out.println("************");字符串s3="abc";s3+=“定义”;系统输出.println(s3);System.out.println("************");字符串s4="abc";字符串s5=s4.replace('a','d');System.out.println(s4);System.out.println(s5);}复制代码String实例化方法本质上是this.value=newchar[0],创建一个长度为0的char数组Strings1=newString();比如在()中写“hello”,就相当于在底层创建了一个长度为5的char数组;this.value=original.valueStrings2=newString(Stringoriginal);this.value=Arrays.copyOf(value,value.length),将char数组的内容复制到s3Strings3=newString(char[]a);从char数组的starIndex下标开始,将count个元素放入s4Strings4=newString(char[]a,intstarIndex,intcount);Q:Strings1="abc"和Strings1=newString("abc")的区别String有两种实例化方式:通过字面量数量定义的方法是通过new+constructor@Testpublicvoidtest(){//1。字面量定义的方法//此时s1和s2的数据javaEE声明在方法区的字符串常量池中Strings1="javaEE";Strings2="javaEE";//2.通过new+constructor的方式//此时s3和s4保存的地址值就是数据在堆空间打开后对应的地址ValueStrings3=newString("javaEE");Strings4=newString("javaEE");System.out.println(s1==s2);//trueSystem.out.println(s1==s4);//falseSystem.out.println(s3==s4);//false}复制代码Q:Strings=newString("abc");创建对象的方式,在内存中创建了多少个对象?答:两个;一个是堆空间中的新结构,一个是char[]对象的常量池中的数据:“abc”String的拼接操作常量和常量的拼接结果在常量池中,不在常量池中在常量池中会有内容相同的常量。只要其中之一是变量,结果就在堆上。@Testpublicvoidtest1(){Strings1="javaEE";Strings2="hello";Strings3="javaEEhello";Strings4="javaEE"+"hello";Strings5=s1+"hello";Strings6="javaEE"+s2;字符串s7=s1+s2;System.out.println(s3==s4);//trueSystem.out.println(s3==s5);//falseSystem.out.println(s3==s6);//falseSystem.out.println(s3==s7);//falseSystem.out.println(s5==s6);//falseSystem.out.println(s5==s7);//假系统。out.println(s6==s7);//false}复制代码如果拼接结果调用了intern()方法,则返回值在常量池中Strings8=s5.intern();//返回得到的s8used是已经存在的"javaEEhello"常量池System.out.println(s3==s8);//true复制代码常用方法字符串比较重要:length(),charAt(),compareTo()intlength():返回字符串的长度:returnvalue.lengthcharcharAt(intindex):返回字符所在的位置某索引returnvalue[index]booleanisEmpty():判断是否为空字符串:returnvalue.length==0StringtoLowerCase():使用默认locale将String中的所有字符转为小写StringtoUpperCase():使用将String中的所有字符转换为大写String的默认语言环境trim():返回字符串的副本,忽略前后空格booleanequals(Objectobj):比较字符串内容是否相同booleanequalsIgnoreCase(StringanotherString):类似equals方法,忽略大小写Stringconcat(Stringstr):将指定的字符串连接到这个字符串的末尾,相当于使用“+”intcompareTo(StringanotherString):比较两个字符串的大小Stringsubstring(intbeginIndex):返回一个新的字符串,即thisstring从beginIndex到结尾截取了一个子串。Stringsubstring(intbeginIndex,intendIndex):返回一个新的字符串,是这个字符串从beginIndex到endIndex截取的一个子串(不包括在内)。@Testpublicvoidtest(){Strings1="HelloWorld";System.out.println(s1.length());//字符串长度System.out.println(s1.charAt(0));//取字符字符串首位的元素System.out.println(s1.isEmpty());//判断字符串是否为空Strings2=s1.toLowerCase();//S1不变,将s1所有字母改为小写s2System.out.println(s1);System.out.println(s2);Strings3="helloworld";Strings4=s3.trim();//去掉s3前后的空格,中间的空格依然保留System.out.println(s3);System.out.println(s4);Strings5="HelloWorld";Strings6="helloworld";System.out.println(s5.equals(s6));//比较s5和s6的内容是否相同System.out.println(s5.equalsIgnoreCase(s6));//忽略大小写,比较s5和s6的内容是否相同Strings7=s5.concat("def");//concat()和"+"的用法相同System.out.println(s7);Strings8="abc";Strings9="abe";System.out.println(s8.compareTo(s9));//比较大小,a与a比较,反过来c的编码为2小于eStrings10="北京天安门广场";字符串s11=s10.substring(2);//从索引为2的元素开始System.out.println(s11);Strings12=s10.substring(2,5);//排除索引为5System.out.println(s12);}复制代码booleanendsWith(Stringsuffix):测试这个字符串是否以指定的后缀结尾booleanstartsWith(Stringprefix):测试这个字符串是否以指定的前缀开头booleanstartsWith(Stringprefix,inttoffset):测试此字符串的子字符串是否从指定索引开始以指定前缀开头booleancontains(CharSequences):当且仅当此字符串包含指定的char值序列时返回trueint**indexOf**(Stringstr):返回指定子字符串在此字符串中第一次出现的索引intindexOf(Stringstr,intfromIndex):返回指定子字符串在此字符串中第一次出现的索引,从指定的开始indexintlastIndexOf(Stringstr):返回指定子串在该字符串中最右边出现的索引intlastIndexOf(Stringstr,intfromIndex):返回指定子串在该字符串中最后一次出现的索引,反向搜索自指定索引注意:如果indexOf和lastIndexOf方法都没有找到,都返回-1@Testpublicvoidtest1(){Strings1="helloworld";booleanb1=s1.endsWith("ld");//写几个根据需要输入字符,判断是否以写入的字符结尾,注意区分大小写System.out.println(b1);booleanb2=s1.startsWith("He");//判断是否从写入的字符开始。注意区分大小写System.out.println(b2);booleanb3=s1.startsWith("ll",2);//判断指定位置是否以书写字符开头System.out.println(b3);Strings2="wo";System.out.println(s1.contains(s2));//判断一个字符串是否包含另一个字符串System.out.println(s1.indexOf("lo"));//返回指定字符串在该字符串中第一次出现的位置System.out.println(s1.indexOf("lo",5));//从索引5的位置开始寻找子串loStrings3="helloworld";System.out.println(s3.lastIndexOf("or"));//从后往前查找or子串,返回索引位置System.out.println(s3.lastIndexOf("or",8));//从索引8向左搜索or}复制代码替换:Stringreplace(charoldChar,charnewChar):通过将此字符串中出现的所有oldChar替换为拥有的newChar来返回一个新字符串。Stringreplace(CharSequencetarget,CharSequencereplacement):用指定的文字替换序列替换此字符串中与文字目标序列匹配的所有子字符串。StringreplaceAll(Stringregex,Stringreplacement):用给定的替换替换此字符串中与给定正则表达式匹配的所有子字符串。StringreplaceFirst(Stringregex,Stringreplacement):用给定的替换替换与给定正则表达式匹配的字符串的第一个子字符串。matches:booleanmatches(Stringregex):判断这个字符串是否匹配给定的正则表达式。切片:String[]split(Stringregex):根据给定正则表达式的匹配拆分此字符串。String[]split(Stringregex,intlimit):根据匹配给定的正则表达式拆分这个字符串,直到限制。如果超过了,剩下的全部放在最后一个元素中。@Testpublicvoidtest2(){//replace可以替换单个字符或字符串Strings1="北北喜欢在北京吃北京烤鸭";Strings2=s1.replace('北','南');System.out.println(s1);System.out.println(s2);Strings3=s1.replace("北京","南京");System.out.println(s3);System.out.println("*************************");Stringstr="12hello34world5java7891mysql456";//将字符串中的数字替换为,,如果结果If开头和结尾都有,然后去掉Stringstring=str.replaceAll("\d+",",").replaceAll("^,|,$","");//\d和^|$是正则表达式System.out.println(string)的内容;System.out.println("***************************");str="12345";//判断str字符串是否全部由数字组成,即有1-n个数字booleanmatches=str.matches("\d+");System.out.println(matches);Stringtel="0571-4534289";//判断是否是杭州座机booleanresult=tel.matches("0571-\d{7,8}");System.out.println(结果);System.out.println("**************************");str="hello|world|java“;String[]strs=str.split("\|");for(inti=0;ibyte解码:byte--->stringbyte[]数组转为String调用构造函数ofString@Testpublicvoidtest(){Strings1="abc123";byte[]bytes=s1.getBytes();Strings=newString(bytes);//解码System.out.println(s);}Copycode注意:转换为byte[]数组时,可以指定编码集,默认为utf-8,如果使用其他,解码时(byte--->string),如果不指定明确,会出现乱码会出现原因是编码集和解码集不一致。