java中String、StringBuffer和StringBuilder的区别-,string和stringbuffer和stringbuilder的使用场景

  java中String、StringBuffer和StringBuilder的区别?,string和stringbuffer和stringbuilder的使用场景

  00-1010字符串类的基本概念字符串类的存储原理字符串类的常用构造方法字符串类中的常用方法StringBuffer类StringBuilder类

  00-1010String类是引用数据类型,不是基本数据类型。在Java中,“”(双引号)中的任何内容都是字符串对象。Java规定双引号里的字符串是不可变的,也就是说‘ABC’从生到死都不能变成‘ABCD’或者‘ab’。在JDK中,用双引号括起来的字符串存储在方法区域的字符串常量池中。(因为在实际开发中,字符串使用非常频繁,为了执行效率,字符串放在方法区的字符串常量池中)

  00-1010 By String s="abc ",在方法区的字符串常量池中会创建一个对象,s会将字符串的地址保存在字符串常量池中。用String s=new String("abc ")创建一个对象,首先会在String常量池中创建 abc 对象(如果String常量池中已经有 abc ,就不会再创建了),然后在heap区创建String类对象,它会在方法区存储 abc 的地址,S也会在heap中存储String对象的地址。请看下面的代码:

  类string test 01 {//这两行代码表示创建了三个string对象,它们都在string常量池中。String A= abcString B= abc de//如果通过new创建一个string对象,首先会在string常量池中寻找‘ABC’。//如果找不到,就在字符串常量池中创建一个‘ABC’对象。//在堆中创建已创建的string对象,并将“ABC”的地址保存在string常量池中。String C=新字符串( ABC );}根据上面的代码画出JVM内存图如下:

  了解了String类字符串的存储原理后,你就很容易知道下面这段代码的编译结果了:

  类string test 01 { public static void main(string[]args){//堆中未创建任何对象。//s1和s2都在字符串常量池String s1=hello 中存储了 hello 的地址;String s2= hello//堆中已创建的对象。//m,n在堆中存储它们的对象的地址。String m=新字符串( Hello!);String=新字符串( Hello!);system . out . println(S1==S2);//结果为true system . out . println(m==n);//结果为假}}

  00-1010//在string类的构造方法中使用公共类string test 02 { public static void main(string[]args){ byte[]x1={ 97,98,99 };Char []x2={ 我,是,中,国,任 };//String s=新字符串(字节数组);字符串y1=新字符串(x1);system . out . println(y1);//ABC //String s=new String(字节数组,偏移量,长度)String 2=new String(x1,1,2);system . out . println(y2);//BC//String s=new String(char array)String y3=new String(x2);system . out . println(y3);//我是中文//String s=new String(char数组,offset,length) String y4=new String(x2,2,3);

   System.out.println(y4);//中国人 }}

 

  

String类中常用方法

public class StringTest03 { public static void main(String[] args) { //public char charAt(int index)方法 //返回索引值处的char类型字符 char s1 = "中国人".charAt(1); System.out.println(s1);//国 //public int compareTo(String anotherString)方法 //按字典序比较两个字符串 System.out.println("abc".compareTo("abd"));//负整数 System.out.println("abc".compareTo("abc"));//0 System.out.println("abc".compareTo("abb"));//正整数 //public boolean contains(CharSequence s)方法 //判断字符串是否包含s System.out.println("abcdefg".contains("efg"));//true System.out.println("abcdefg".contains("hij"));//false //public boolean endsWith(String suffix)方法 //判断字符串是否以suffix结尾 System.out.println("abcde".endsWith("cde"));//true System.out.println("abcde".endsWith("qwe"));//false //public boolean equalsIgnoreCase(String anotherString) 方法 //判断两个字符串是否相等,忽略大小写 System.out.println("ABcd".equalsIgnoreCase("abCD"));//true //public byte[] getBytes() //将字符串转换成byte数组,并返回 byte [] s2 = "abcdefg".getBytes(); for (int i = 0; i < s2.length; i++) { System.out.print(s2[i] + " "); }//97 98 99 100 101 102 103 //public int indexOf(String str) //判断某个子字符串在当前字符串中第一次出现处的索引 //若子字符串不存在,返回-1 System.out.println("abcdefghigk".indexOf("hig"));//7 System.out.println("abc".indexOf("fgh"));//-1 //public int lastIndexOf(String str) //判断某个子字符串最后一次出现在当前字符串中的索引 System.out.println("abcdhdhdabc".lastIndexOf("abc"));//8 //public boolean isEmpty() //判断字符串是否为空串 //底层调用length()方法,空串长度为0 //注意:判断数组长度是length属性,判断字符串长度是length()方法 System.out.println("".isEmpty());//true //public String replace(char oldChar,char newChar) //返回一个将原字符串中所有的oldChar替换为newChar的新字符串,不改变原字符串 String s3 = "aaatttooo"; System.out.println( s3.replace(t,q));//aaaqqqooo //public String replace(CharSequence target,CharSequence replacement) //CharSequence可以看出String //将原字符串中的 target 全部换成 replacement String s4 = "abcsgdjsssjabcjdjjdjabc"; System.out.println(s4.replace("abc","www"));//wwwsgdjsssjwwwjdjjdjwww //public String[] split(String regex) //以regex为分界线,将字符串分割保存在一个字符串数组当中,并返回 String s5 = "2022-3-19"; String [] str = s5.split("-"); System.out.println(str[0] + str[1] + str[2]);//2022319 //public String substring(int beginIndex) //返回一个以索引beginIndex开始直至结尾的字符串 System.out.println("abcdefgh".substring(4));//efgh //public String substring(int beginIndex,int endIndex) //返回一个以索引值beginIndex开始,以索引值endIndex结束(不包含该索引值处的字符)的子字符串 System.out.println("abcdefgh".substring(2,5));//cde //public char[] toCharArray() //将一个字符串以字符数组的形式返回 char[] str2 = "abcdefg".toCharArray(); for(int i = 0 ; i < str2.length ; i++){ System.out.println(str2[i]); } //public String toLowerCase() //返回一个将原字符串中所有字符变成小写的新字符串 System.out.println("ABcDeFG".toLowerCase());//abcdefg //public String toUpperCase() //返回一个将原字符串中所有字符变成大写的新字符串 System.out.println("aCbcdEfg".toUpperCase());//ABCDEFG //public String trim() // 返回一个去除字符串的前后空白(空格)的新字符串 System.out.println(" abcdefg ".trim());//abcdefg //public static String valueOf(参数列表) //参数列表可以是int型,char型,int数组,对象 等等....... //String类中唯一一个静态方法,可以直接调用 //将非字符串转换为字符串 //println()底层调用的就是valueOf()方法,只要是打印在控制台上的都是字符串 System.out.println(String.valueOf(true)); }}

 

  

StringBuffer类

思考:

 

  频繁使用字符串拼接会有什么影响?java中字符串是不可变的,每拼接一次都会产生一个新的字符串字符串是存在字符串常量池中的,频繁使用字符串拼接会占用大量的方法区空间为了避免以上问题我们就可以使用到StringBuffer类

  

//java.lang.StringBufferpublic class StringBufferTest { public static void main(String[] args) { //创建一个初始化容量为16个 byte[] 数组(字符串缓冲区对象) StringBuffer strBuffer = new StringBuffer(); //拼接字符串调用 append()方法 //append()方法底层会调用 System.arraycopy()方法,效率较低 //append()再追加时,如果byte[]满了之后会自动扩容 strBuffer.append(1); strBuffer.append(q); strBuffer.append(3.14); strBuffer.append("abc"); System.out.println(strBuffer);//1q3.14abc //StringBuffer可以进行一定的优化 //在创建StringBuffer时尽可能可能给定一个合适的初始化容量 //从而减少底层数组的扩容次数 //指定初始化容量的字符串缓冲区 StringBuffer newstrBuffer = new StringBuffer(100); }}

 

  

StringBuilder类

它的用法与StringBuffer十分相似,但是也有很大的区别:

 

  StringBuffer中的方法都有synchronized关键字修饰,表示StringBuffer在多线程编译环境下是安全的StringBuilder中方法没有synchronized关键字修饰,表示StringBuilder在多线程编译环境下是不安全的到此这篇关于Java详细分析String类与StringBuffer和StringBuilder的使用方法的文章就介绍到这了,更多相关Java String类用法内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: