2025/12/29 18:32:28
网站建设
项目流程
网站内容页怎么做,机械产品做那几个网站好,利用社交网站做淘宝客,网站建设的栏目内容是字符串
String
1. 特性介绍
String 位于Java.lang包中#xff0c;无需导包
String类由fianl修饰#xff0c;表示不能被修改#xff0c;不能被继承
String类构建的对象不可在被修改当使用一个字面量给字符串赋值时#xff0c;首先会去字符串常量池中检测是否存在
如果存在无需导包String类由fianl修饰表示不能被修改不能被继承String类构建的对象不可在被修改当使用一个字面量给字符串赋值时首先会去字符串常量池中检测是否存在 如果存在则直接使用这个字面量的地址值赋值即可。 如果不存在则需要在字符串常量池中创建这个字面量然后再将地址赋值示例publicclassExample1{publicstaticvoidmain(String[]args){//当使用一个字面量给字符串赋值时首先会去字符串常量池中检测是否存在//如果存在则直接使用这个字面量的地址值赋值即可。//如果不存在则需要在字符串常量池中创建这个字面量然后再将地址赋值Strings超用心;s在线教育;//这里的字符串拼接再堆内存上System.out.println(s);}}2. 构造方法publicString(Stringoriginal);publicString(charvalue[]);publicString(charvalue[],intoffset,intcount);publicString(bytebytes[]);publicString(bytebytes[],intoffset,intlength);publicString(bytebytes[],Charsetcharsets);示例一publicclassExample2{publicstaticvoidmain(String[]args){//这里会创建2个对象//一个是字面量会在方法区中的常量池中创建一个对象//另一个是new String“ ”构造方法创建出来的对象Strings1newString(超用心在线教育);System.out.println(s1);}}如以上注释所说创建了两个对象。但在这之前添加String s 超用心在线教育的话那么只会创建一个对象。因为在常量池中已经有这一个字面量了不需要再重新创建对象直接赋值地址值即可。示例二importjava.nio.charset.Charset;publicclassExample2{publicstaticvoidmain(String[]args){char[]values{a,b,c,d};Strings2newString(values);System.out.println(s2);//offset: 偏移//在使用这种构造方法时一定要考虑数组下标越界的问题Strings3newString(values,1,3);System.out.println(s3);//字节可以存储整数字符也可以使用整数描述这个整数就是ASCII码的整数值byte[]bytes{97,98,99,100,101,102};Strings4newString(bytes);System.out.println(s4);Strings5newString(bytes,2,3);System.out.println(s5);//构建UTF-8字符集CharsetcharsetCharset.forName(UTF-8);Strings6newString(bytes,charset);System.out.println(s6);}}3. 常用方法获取长度publicintlength();//获取字符串的长度字符串比较publicbooleanequals(ObjectanObject);//比较两个字符串是否相同publicbooleanequalsIgnoreCase(StringanotherString)//忽略大小写比较两个字符串是否相同字符串大小写转换publicStringtoLowerCase();//转换为小写publicStringtoUpperCase();//转换为大写示例importjava.nio.charset.Charset;publicclassExample2{publicstaticvoidmain(String[]args){char[]values{a,b,c,d};Strings2newString(values);System.out.println(s2);//offset: 偏移//在使用这种构造方法时一定要考虑数组下标越界的问题Strings3newString(values,1,3);System.out.println(s3);//字节可以存储整数字符也可以使用整数描述这个整数就是ASCII码的整数值byte[]bytes{97,98,99,100,101,102};Strings4newString(bytes);System.out.println(s4);Strings5newString(bytes,2,3);System.out.println(s5);//构建UTF-8字符集CharsetcharsetCharset.forName(UTF-8);Strings6newString(bytes,charset);System.out.println(s6);}}7 true true false true ABC abc获取字符在字符串中的下标publicintindexOf(intch);//获取指定字符在字符串中第一次出现的下标publicintlastIndexOf(intch);//获取指定字符在字符串中最后一次出现的下标获取字符串在字符串中的下标publicintindexOf(Stringstr);//获取指定字符串在字符串中第一次出现的下标publicintlastIndexOf(Stringstr);//获取指定字符串在字符串中最后一次出现的下标场景如果要保证一个字符串中某个符号只出现一次那么就可以通过indexOf方法和lastIndexOf方法进行验证如果得到的两个index相同那么就说明只出现一次获取字符串中指定下标的字符publiccharcharAt(intindex);示例packagecom.Sonnet.Example;publicclassExample4{publicstaticvoidmain(String[]args){Stringsjiaxinbingganqq.com;//求指定字符在字符串中第一次出现下标的位置//相互兼容的数据类型之间可以自动发生类型转换char -- intintindex1s.indexOf();System.out.println(index1);//求指定字符在字符串中最后一次出现下标的位置intindex2s.lastIndexOf();System.out.println(index2);if(index1index2){System.out.println(字符串s只存在一个);}//获取字符串中指定下标的字符charchs.charAt(13);System.out.println(ch);}}13 13 字符串jiaxinbingganqq.com只存在一个 字符串截取publicStringsubstring(intbeginIndex);//从指定开始位置截取字符串知道字符串的末尾publicStringsubstring(intbeginIndex,intendIndex);//从指定开始位置到指定结束位置截取字符取头不取尾左闭右开示例packagecom.Sonnet.Example;publicclassExample5{publicstaticvoidmain(String[]args){Stringsjava是世界上最好的语言.cpp;//字符串截取截取时使用的是左闭右开区间[0, 4)//即取头不取尾Stringsub1s.substring(0,3);System.out.println(sub1);//从下标7开始一直向后截取Stringsub2s.substring(7);System.out.println(sub2);}}jav 上最好的语言.cpp字符串的替换publicStringreplace(charoldChar,charnewChar);//使用新的字符替换字符串中存在的旧字符publicStringreplace(charSequence target,charSequence replacement);//使用替换字符串来替换字符串中的旧的字符串publicStringreplaceAll(Stringregex,Stringreplacement);//使用替换字符串来替换字符串中满足正则表达式的字符串示例packagecom.Sonnet.Example;publicclassExample6{publicstaticvoidmain(String[]args){StringsHello world;Strings1s.replace(o,a);//并不会改变原有的字符串System.out.println(s);System.out.println(s1);//注意//即便是String类型也可以因为target的类型是CharSequence而字符串也是CharSequence的一个类型Strings2s.replace(o,a);System.out.println(s2);Stringinfoa1b2c3d4f5;//regular expression --- 正则表达式//三位整数的正则表达数 099 [0123456789][0123456789][01234567890]//[1-9][0-9]{2,2} --- 第一位在1-9紧接的2位在0-9//三只五位整数的正则表达式//[1-9][0-9]{2,4}//英文字符串的正则表达式//[a-zA-Z] --- 表示任意几位//英文字符串加数字的正则表达式//[a-zA-Z0-9]Stringresult1info.replaceAll([a-zA-Z],);System.out.println(result1);Stringresult2info.replaceAll([0-9],);System.out.println(result2);}}Hello world Hella warld Hella warld 12345 abcdf正则表达式regular expression --- 正则表达式 三位整数的正则表达数 099 [0123456789][0123456789][01234567890] [1-9][0-9]{2,2} --- 第一位在1-9紧接的2位在0-9 三只五位整数的正则表达式 [1-9][0-9]{2,4} 英文字符串的正则表达式 [a-zA-Z] --- 表示任意几位 英文字符串加数字的正则表达式 [a-zA-Z0-9] 如果正则表达式中只有有一个元素可以直接写不加[]获取字符数组publicchar[]toCharArray();获取字节数组publicbyte[]getBytes();//获取字节数组publicbyte[]getBytes(Charsetcharset);//获取指定编码下的字节数组示例packagecom.Sonnet.Example;importjava.nio.charset.Charset;publicclassExample7{publicstaticvoidmain(String[]args){StringsMy God;char[]valuess.toCharArray();for(inti0;ivalues.length;i){System.out.println(values[i]);}byte[]bytess.getBytes();for(inti0;ibytes.length;i){System.out.println(bytes[i]);}byte[]bytes1s.getBytes(Charset.forName(GB2312));for(inti0;ibytes1.length;i){System.out.println(bytes1[i]);}}}字符串拼接publicStringconcat(Stringstr);//将字符串追加到末尾去除字符串两端的空白字符publicStringtrim();示例packagecom.Sonnet.Example;publicclassExample8{publicstaticvoidmain(String[]args){Strings1Hello;Strings2World;///会产生新的对象Strings3s1s2;System.out.println(s3);//concat:连接//将s2追加到s1的末尾//也会产生新的对象Strings4s1.concat(s2);System.out.println(s4);Strings5 ab cde;//将字符串两端的空格修剪掉,中间还在Strings6s5.trim();System.out.println(s5);System.out.println(s6);}}HelloWorld HelloWorld ab cde ab cde要注意concat和trim都会创建新的对象字符串分割publicString[]split(Stringregex);//将字符串按照匹配的正则表达式分割字符串匹配正则表达式publicbooleanmatches(Stringregex);//检测字符串是否匹配给定的正则表达式示例packagecom.Sonnet.Example;publicclassExample9{publicstaticvoidmain(String[]args){//字符串分割Stringsa1b2cc3d4f5;//[a-z0-9] or [a-z0-9]{10,10}String[]arrs.split([0-9]);for(inti0;iarr.length;i){System.out.println(arr[i]);}StringpersonInfo刘德华,男,53, 很帅气;String[]arr2personInfo.split(,);for(inti0;iarr2.length;i){System.out.println(arr2[i]);}//检测字符串是否匹配给定的正则表达式Stringregex[a-z0-9];booleanmatchs.matches(regex);System.out.println(match);}}a b cc d f 刘德华 男 53 很帅气 trueregular expression --- 正则表达式 三位整数的正则表达数 099 [0123456789][0123456789][01234567890] [1-9][0-9]{2,2} --- 第一位在1-9紧接的2位在0-9 三只五位整数的正则表达式 [1-9][0-9]{2,4} 英文字符串的正则表达式 [a-zA-Z] --- 表示任意几位 英文字符串加数字的正则表达式 [a-zA-Z0-9] 如果正则表达式中只有有一个元素可以直接写不加[]正则表达式应用场景验证邮箱手机号文本替换字符串分割数据提取不得不提的inter 方法publicnativeStringinter();//将字符串放入常量池有native说明是一个本地方法不是Java实现的native是一个方法修饰符表示该方法的方法体不是用 Java 语言编写的而是用其他语言通常是 C/C实现的。示例packagecom.Sonnet.Example;publicclassExample10{publicstaticvoidmain(String[]args){Strings1夹心饼干;Strings2真好吃;Strings3s1s2;Strings4夹心饼干真好吃;System.out.println(s3s4);Strings5s3.intern();System.out.println(s5s4);}}false true示例二packagecom.Sonnet.Example;publicclassExample10{publicstaticvoidmain(String[]args){Strings1夹心饼干;Strings2真好吃;Strings3s1s2;Strings5s3.intern();Strings4夹心饼干真好吃;System.out.println(s3s4);System.out.println(s5s4);}}true true根据以上代码发现改变了intern的位置就改变了运行的结果 inter 将字符串s3放入字符串常量池 放入时会先检测常量池中是否存在s3字符串 如果字符串常量池中存在字符串s3 那么s5直接使用常量池中的s3字符串地址即可。 如果不存在则在常量池中创建字符串s3. 所以一开始常量池中只有是夹心饼干真好吃 堆中则是夹心饼干真好吃 在示例一中s4指向的夹心饼干真好吃进入方法池 s3与s4进行比较此时地址不同false 调用intern在常量池中发现了夹心饼干真好吃 s5与s4指向相同的地址 s3的地址并没有改变String对象的地址不会改变 示例二中先调用intern方法在常量池中并没有发现夹心饼干真好吃 于是将s3指向的夹心饼干真好吃放入常量池s5与s3指向相同地址 s4与s3字面量相同并且常量池中存在s4与s3指向相同的地址 s3与s4比较trueStringBuilder 和 StringBuffer1. 特性StringBuilder类位于java.lang包中无需引入直接使用即可StringBUffer也位于java.lang包中StringBuilder、StringBUffer是由final修饰的类是最终类不能被继承都继承于AbstractStringBuilder因此二者基本类似StringBuilder、StringBUffer类构建的对象可以实现字符序列的追加但不会产生新的对象只是将这个字符序列保存在字符数组中。2. 构造方法publicStringBuilder();//构建一个StringBuilder的容器默认容量为16publicStringBuilder(intcapacity);//构建一个StringBuilder的容器并指定初始容量publicStringBuilder(Stringstr);//构建一个StringBuilder对象并将指定的字符存储在其中示例packagecom.Sonnet.Example;publicclassExample11{publicstaticvoidmain(String[]args){//构建了一个初始化容量为16的字符串构建器StringBuildersb1newStringBuilder();//构建一个初始化容量为82的字符串容量StringBuildersb2newStringBuilder(82);StringBuildersb3newStringBuilder(夹心饼干);}}3. 常用方法追加publicStringBuilderappend(Stringstr);//将一个字符串追加到StringBuilder存储区publicStringBuilderappend(StringBuffersb);//示例packagecom.Sonnet.Example;publicclassExample12{publicstaticvoidmain(String[]args){StringBuildersbnewStringBuilder(1024);sb.append(夹心饼干);sb.append(夹心饼干);sb.append(1);sb.append(1.0);sb.append(true);sb.append(a);System.out.println(sb);StringBufferbuffernewStringBuffer(1024);buffer.append(夹心饼干);buffer.append(夹心饼干);//synchronized同步锁buffer.append(1);buffer.append(1.0);buffer.append(true);buffer.append(a);System.out.println(buffer);sb.append(buffer);System.out.println(sb);StringBuildersb1newStringBuilder();sb1.append(夹心饼干).append(1).append(a).append(true);System.out.println(sb1);}}夹心饼干夹心饼干11.0truea 夹心饼干夹心饼干11.0truea 夹心饼干夹心饼干11.0truea夹心饼干夹心饼干11.0truea 夹心饼干1atrue删除指定区间存储的内容publicStringBuilderdelete(intstrat,intend);//将StringBuilder存储区指定的开始位置到指定的结束位置之间的内容删除删除存储区下标位置存储的字符publicStringBuilderdeleteCharAt(intindex);示例packagecom.Sonnet.Example;publicclassExample13{publicstaticvoidmain(String[]args){StringBuildersbnewStringBuilder(abcdefg);sb.delete(1,5);//左闭右开System.out.println(sb);sb.deleteCharAt(1);System.out.println(sb);}}afg ag在StringBuilder存储区指定偏移位置插入指定的字符串publicStringBuilderinsert(intoffset,Stringstr);将存储区的内容倒序publicStringBuilderreverse();获取指定字符串在存储区中的位置publicintindexOf(Stringstr);//获取指定字符串在存储区第一次出现的位置publicintlastIndexOf(Stringstr);//获取指定字符串在存储区中最后一次出现的位置示例packagecom.Sonnet.Example;publicclassExample14{publicstaticvoidmain(String[]args){StringBuildersbnewStringBuilder(admin);sb.reverse();System.out.println(sb);sb.insert(2,,);//在偏移量后面插入一个字符串System.out.println(sb);//需要注意的是length方法返回的是char[]中使用的数量System.out.println(sb.length());StringBuildersb2newStringBuilder(abababa);intindex1sb2.indexOf(ab);intindex2sb2.lastIndexOf(ab);System.out.println(index1);System.out.println(index2);}}nimda ni,mda 6 0 4练习现有字符串ababababababababa求其次子字符串aba出现的次数使用String类完成packagecom.Sonnet.Example;publicclassExample17{publicstaticvoidmain(String[]args){Stringsababababababababa;Stringtargetaba;intlengths.length();inttargetLengthtarget.length();intcnt0;for(inti0;ilength-targetLength;i){Strings1s.substring(i,itargetLength);if(s1.equals(target))cnt;}System.out.println(cnt);}}将从控制台输入的数字转变为财务数字10005.25使用StringBuilderpackagecom.Sonnet.Example;importjava.util.Scanner;publicclassExample16{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);System.out.println(请输入一个数字);doublemoneysc.nextDouble();StringBuildersbnewStringBuilder().append(money);intindexsb.indexOf(.);if(index3){for(intiindex-3;i0;i-3){sb.insert(i,,);}}System.out.println(sb);}}4. 对比StringStringStringBuilder和SteingBuffer都是用来处理字符串的。在处理少量字符串的时候它们之间的处理效率几乎没有区别。但在处理大量字符串的时候由于String类的对象不可更改因此在处理字符时会产生新的对象对于内存的消耗来说较大导致效率低下。而StringBuilder和StringBuffer使用的是对字符串的字符数组内容进行拷贝不会产生新的对象因此效率较高。而StringBuffer为了保证能够在多线程情况下字符数组中内容的正确使用在每一个成员方法上面加了锁有锁就会增加消耗。因此StringBuffer在处理效率上要略低于StringBuilder。