您的位置 首页 > 德语词汇

string是什么意思?用法、例句?每天都在用String,你真的了解吗?

大家好,今天来为大家分享string是什么意思?用法、例句的一些知识点,和每天都在用String,你真的了解吗?的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

一、String概述

java.lang.String类代表字符串。Java程序中所有的字符串文字(例如"abc")都可以被看作是实现此类的实例

string是什么意思?用法、例句?每天都在用String,你真的了解吗?

String中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写或小写的所有字符的字符串的副本。

//String的属性值,String的内容本质上是使用不可变的char类型的数组来存储的。\nprivatefinalcharvalue[];\n\n/*String类型的hash值,hash是String实例化对象的hashcode的一个缓存值,这是因为String对象经常被用来进行比较,如果每次比较都重新计算hashcode值的话,是比较麻烦的,保存一个缓存值能够进行优化*/\nprivateinthash;//Defaultto0\n\n//serialVersionUID为序列化ID\nprivatestaticfinallongserialVersionUID=-6849794470754667710L;\n\n//serialPersistentFields属性用于指定哪些字段需要被默认序列化\nprivatestaticfinalObjectStreamField[]serialPersistentFields=newObjectStreamField[0];

serialPersistentFields具体用法为:

privatestaticfinalObjectStreamField[]serialPersistentFields={\nnewObjectStreamField("name",String.class),\nnewObjectStreamField("age",Integer.Type)\n}

transient用于指定哪些字段不会被默认序列化,两者同时使用时,transient会被忽略。

在Java9及之后,String类的实现改用byte数组存储字符串,同时使用coder来标识使用了哪种字符集编码。

publicfinalclassString\nimplementsjava.io.Serializable,Comparable<String>,CharSequence{\n/**Thevalueisusedforcharacterstorage.*/\nprivatefinalbyte[]value;\n\n/**Theidentifieroftheencodingusedtoencodethebytesin{@codevalue}.*/\nprivatefinalbytecoder;\n}2.2.String构造方法

1、空参构造

/**\n*final声明的value数组不能修改它的引用,所以在构造函数中一定要初始化value属性\n*/\npublicString(){\nthis.value="".value;\n}

2、用一个String来构造

//初始化一个新创建的String对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。\npublicString(Stringoriginal){\nthis.value=original.value;\nthis.hash=original.hash;\n}

3、使用char数组构造

//分配一个新的String,使其表示字符数组参数中当前包含的字符序列。\npublicString(charvalue[]){\nthis.value=Arrays.copyOf(value,value.length);\n}\n\n//分配一个新的String,它包含取自字符数组参数一个子数组的字符。\npublicString(charvalue[],intoffset,intcount)

4、使用int数组构造

//分配一个新的String,它包含Unicode代码点数组参数一个子数组的字符。\npublicString(int[]codePoints,intoffset,intcount)

5、使用byte数组构造

//通过使用平台的默认字符集解码指定的byte数组,构造一个新的String。\npublicString(bytebytes[])\n\n//通过使用平台的默认字符集解码指定的byte数组,构造一个新的String。\npublicString(byte[]bytes)\n\n//通过使用指定的charset解码指定的byte数组,构造一个新的String。\npublicString(byte[]bytes,Charsetcharset)\n\n//通过使用平台的默认字符集解码指定的byte子数组,构造一个新的String。\npublicString(byte[]bytes,intoffset,intlength)\n\n//通过使用指定的charset解码指定的byte子数组,构造一个新的String。\npublicString(byte[]bytes,intoffset,intlength,Charsetcharset)\n\n//通过使用指定的字符集解码指定的byte子数组,构造一个新的String。\npublicString(byte[]bytes,intoffset,intlength,StringcharsetName)\n\n//通过使用指定的charset解码指定的byte数组,构造一个新的String。\npublicString(byte[]bytes,StringcharsetName)

6、使用StringBuffer或者StringBuilder构造

//分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。\npublicString(StringBufferbuffer)\n\n\n//分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。\npublicString(StringBuilderbuilder)三、字符串常量池

作为最基础的引用数据类型,Java设计者为String提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么?

Stringstr1="abc";\nStringstr2="abc";\nStringstr3="abc";\nStringstr4=newString("abc");\nStringstr5=newString("abc");\nStringstr6=newString("abc");

变量str1到str6的内存分布如图所示;str1="abc"会先去常量池中看有没有abc,如果有则引用这个字符串,没有则创建一个;str2和str3都是直接引用常量池中的abc;

Stringstr4=newString("abc")这段代码会做两步操作,第一步在常量池中查找是否有"abc"对象,有则返回对应的引用实例,没有则创建对应的实例对象;在堆中new一个String("abc")对象,将对象地址赋值给Str4,创建一个引用。

publicclassTestString{\npublicstaticvoidmain(String[]args){\nStringstr1="wugongzi";\nStringstr2=newString("wugongzi");\nStringstr3=str2;//引用传递,str3直接指向st2的堆内存地址\nStringstr4="wugongzi";\n/**\n*==:\n*基本数据类型:比较的是基本数据类型的值是否相同\n*引用数据类型:比较的是引用数据类型的地址值是否相同\n*所以在这里的话:String类对象==比较,比较的是地址,而不是内容\n*/\nSystem.out.println(str1==str2);//false\nSystem.out.println(str1==str3);//false\nSystem.out.println(str3==str2);//true\nSystem.out.println(str1==str4);//true\n}\n}

下面我们来分析一下这段代码的内存分布

第一步:Stringstr1="wugongzi",首先会去常量池中看有没有wugongzi,发现没有,则在常量池中创建了一个wugongzi,然后将wugongzi的内存地址赋值给str1;

第二步:Stringstr2=newString("wugongzi"),这段代码因为new了一个String对象,它首先常量池中查找是否有wugongzi,发现已经有了,则返回对应的引用实例;然后再去堆中new一个String("wugongzi")对象,将对象地址赋值给Str2,创建一个引用。

第三步:Stringstr3=str2,//引用传递,str3直接指向st2的堆内存地址;

第四步:Stringstr4="wugongzi",同第一步

这里重写了Object中的equals方法,用来判断两个对象实际意义上是否相等,也就是值是否相等

publicbooleanequals(ObjectanObject){\n//如果引用的是同一个对象,则返回真\nif(this==anObject){\nreturntrue;\n}\n//如果不是String类型的数据,返回假\nif(anObjectinstanceofString){\nStringanotherString=(String)anObject;\nintn=value.length;\n//如果char数组长度不相等,返回假\nif(n==anotherString.value.length){\ncharv1[]=value;\ncharv2[]=anotherString.value;\ninti=0;\n//从后往前单个字符逐步判断,如果有不相等,则返回假\nwhile(n--!=0){\nif(v1[i]!=v2[i])\nreturnfalse;\ni++;\n}\n//每个字符都相等,则返回真\nreturntrue;\n}\n}\nreturnfalse;\n}5.2.compareTo方法

用于比较两个字符串的大小,如果两个字符串长度相等则返回0,如果长度不相等,则返回当前字符串的长度减去被比较的字符串的长度。

publicintcompareTo(StringanotherString){\n//自身对象字符串长度len1\nintlen1=value.length;\n//被比较对象字符串长度len2\nintlen2=anotherString.value.length;\n//取两个字符串长度的最小值lim\nintlim=Math.min(len1,len2);\ncharv1[]=value;\ncharv2[]=anotherString.value;\n\nintk=0;\n//从value的第一个字符开始到最小长度lim处为止,如果字符不相等,返回自身(对象不相等处字符-被比较对象不相等字符)\nwhile(k<lim){\ncharc1=v1[k];\ncharc2=v2[k];\nif(c1!=c2){\nreturnc1-c2;\n}\nk++;\n}\n//如果前面都相等,则返回(自身长度-被比较对象长度)\nreturnlen1-len2;\n}5.3.hashCode方法

这里重写了hashCode方法,采用多项式进行计算,可以通过不同的字符串得到相同的hash,所以两个String对象的hashCode相同,并不代表两个String是相同的。

i=1->h=31*(31*0+val[0])+val[1]

i=2->h=31*(31*(31*0+val[0])+val[1])+val[2]

h=3131310+3131val[0]+31val[1]+val[2]

h=31^(n-1)val[0]+31^(n-2)val[1]+val[2]

\npublicinthashCode(){\ninth=hash;\n//如果hash没有被计算过,并且字符串不为空,则进行hashCode计算\nif(h==0&&value.length>0){\ncharval[]=value;\n\n//计算过程\n//s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]\nfor(inti=0;i<value.length;i++){\nh=31*h+val[i];\n}\n//hash赋值\nhash=h;\n}\nreturnh;\n}5.4.startWith方法

startsWith和endWith方法也是比较常用的方法,常用来判断字符串以特定的字符开始或结尾。

publicbooleanstartsWith(Stringprefix,inttoffset){\ncharta[]=value;\nintto=toffset;\ncharpa[]=prefix.value;\nintpo=0;\nintpc=prefix.value.length;\n//Note:toffsetmightbenear-1>>>1.\n//如果起始地址小于0或者(起始地址+所比较对象长度)大于自身对象长度,返回假\nif((toffset<0)||(toffset>value.length-pc)){\nreturnfalse;\n}\n//从所比较对象的末尾开始比较\nwhile(--pc>=0){\nif(ta[to++]!=pa[po++]){\nreturnfalse;\n}\n}\nreturntrue;\n}\n\npublicbooleanstartsWith(Stringprefix){\nreturnstartsWith(prefix,0);\n}\n\npublicbooleanendsWith(Stringsuffix){\nreturnstartsWith(suffix,value.length-suffix.value.length);\n}5.5.concat方法

concat方法用于将指定的字符串参数连接到字符串上。

publicStringconcat(Stringstr){\nintotherLen=str.length();\n//如果被添加的字符串为空,则返回对象本身\nif(otherLen==0){\nreturnthis;\n}\nintlen=value.length;\ncharbuf[]=Arrays.copyOf(value,len+otherLen);\nstr.getChars(buf,len);\nreturnnewString(buf,true);\n}5.6.replace方法

replace的参数是char和charSequence,即可以支持字符的替换,也支持字符串的替换(charSequence即字符串序列的意思)

replaceAll的参数是regex,即基于规则表达式的替换,比如可以通过replaceAll("\\d","*")把一个字符串所有的数字字符都替换成星号;

相同点:都是全部替换,即把源字符串中的某一字符或者字符串全部替换成指定的字符或者字符串。

不同点:replaceAll支持正则表达式,因此会对参数进行解析(两个参数均是),如replaceAll("\\d",""),而replace则不会,replace("\\d","")就是替换"\\d"的字符串,而不会解析为正则。

publicStringreplace(charoldChar,charnewChar){\n//新旧值先对比\nif(oldChar!=newChar){\nintlen=value.length;\ninti=-1;\nchar[]val=value;\n\n//找到旧值最开始出现的位置\nwhile(++i<len){\nif(val[i]==oldChar){\nbreak;\n}\n}\n//从那个位置开始,直到末尾,用新值代替出现的旧值\nif(i<len){\ncharbuf[]=newchar[len];\nfor(intj=0;j<i;j++){\nbuf[j]=val[j];\n}\nwhile(i<len){\ncharc=val[i];\nbuf[i]=(c==oldChar)?newChar:c;\ni++;\n}\nreturnnewString(buf,true);\n}\n}\nreturnthis;\n}5.7.trim方法

trim用于删除字符串的头尾的空格。

publicStringtrim(){\nintlen=value.length;\nintst=0;\nchar[]val=value;/*avoidgetfieldopcode*/\n\n//找到字符串前段没有空格的位置\nwhile((st<len)&&(val[st]<='')){\nst++;\n}\n//找到字符串末尾没有空格的位置\nwhile((st<len)&&(val[len-1]<='')){\nlen--;\n}\n//如果前后都没有出现空格,返回字符串本身\nreturn((st>0)||(len<value.length))?substring(st,len):this;\n}5.8.其他方法

//字符串是否包含另一个字符串\npublicbooleancontains(CharSequences)\n\n//返回字符串长度\npublicintlength()\n\n//返回在指定index位置的字符,index从0开始\npubliccharcharAt(intindex)\n\n//返回str字符串在当前字符串首次出现的位置,若没有返回-1\npublicintindexOf(Stringstr)\n\n//返回str字符串最后一次在当前字符串中出现的位置,若无返回-1\npublicintlastIndexOf(Stringstr)\n\n//返回s字符串从当前字符串startpoint位置开始的,首次出现的位置\npublicintindexOf(Strings,intstartpoint)\n\n//返回s字符串从当前字符串startpoint位置开始的,最后一次出现的位置\npublicintlastIndexOf(Strings,intstartpoint)\n\n//返回从start开始的子串\npublicStringsubstring(intstartpoint)\n\n//返回从start开始到end结束的一个左闭右开的子串。start可以从0开始的\npublicStringsubstring(intstart,intend)\n\n//按照regex将当前字符串拆分,拆分为多个字符串,整体返回值为String[]\npublicString[]split(Stringregex)六、String常用转化6.1字符串--->基本数据类型、包装类

调用相应的包装类的parseXxx(Stringstr);

Stringstr1="wugongzi";\ninti=Integer.parseInt(str1);\nSystem.out.println(i);6.2字符串---->字节数组

调用字符串的getBytes()

Stringstr="wugongzi520";\nbyte[]b=str.getBytes();\nfor(intj=0;j<b.length;j++){\nSystem.out.println((char)b[j]);\n}6.3字节数组---->字符串

调用字符串的构造器

Stringstr="wugongzi520";\nbyte[]b=str.getBytes();\nStringstr3=newString(b);\nSystem.out.println(str3);6.4字符串---->字符数组

调用字符串的toCharArray();

Stringstr4="abc123";\nchar[]c=str4.toCharArray();\nfor(intj=0;j<c.length;j++){\nSystem.out.println(c[j]);\n}6.5字符数组---->字符串

调用字符串的构造器

string是什么意思?用法、例句和每天都在用String,你真的了解吗?的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023