顺义推广建站,深圳做网站网络公司怎么样,南宁百度快速排名优化,PHP网站开发如何建立vipString字符串 不可变的字符序列在 jdk1.8#xff0c;我们底层用 char [ ] 存储在 jdk 17#xff0c;我们底层用 byte [ ] 存储 StringBuffer字符串缓冲区类 可变的字符序列#xff0c;线程安全的#xff08;synchronized#xff09;#xff0c;效率低在 jdk1.8#xf… String字符串 不可变的字符序列在 jdk1.8我们底层用 char [ ] 存储在 jdk 17我们底层用 byte [ ] 存储 StringBuffer字符串缓冲区类 可变的字符序列线程安全的synchronized效率低在 jdk1.8我们底层用 char [ ] 存储在 jdk 17我们底层用 byte [ ] 存储 StringBuilder字符串生成器类 可变的字符序列jdk5.0新增的线程不安全的效率高在 jdk1.8我们底层用 char [ ] 存储在 jdk 17我们底层用 byte [ ] 存储 1、那么在开发当中我们应该到底怎么选择呢 首先看是不是一个多线程问题。不是多线程问题就用StringBuilder因为只有多个线程操作共享数据的时候我们才会考虑用StringBuffer否则不是多线程或者不存在多线程的安全问题我们都建议用StringBuilder。 2、jdk8源码分析String String str new String(); //char[ ] value new char[0];String str1 new String(abc) //char[ ] value new char[ ]{ a, b, c }; 3、jdk8源码分析StringBuffer StringBuffer sb1 new StringBuffer(); //char[ ] value new char[16]; 底层创建了一个长度是16的数组。sb1.append(a); //value[0] a;sb1.append(b) //value[1] b; package stringdemo;public class StringBufferTest {public static void main(String[] args) {StringBuffer sb new StringBuffer();System.out.println(sb.capacity());//16}
}
D:\Java\jdk-17\bin\java.exe -javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar34469:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin -Dfile.encodingUTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
16Process finished with exit code 0StringBuffer sb2 new StringBuffer“abc”//char[ ] value new char[abc.length()16] package stringdemo;public class StringBufferTest {public static void main(String[] args) {StringBuffer sb1 new StringBuffer(abc);System.out.println(sb1.capacity());//31619}
}
D:\Java\jdk-17\bin\java.exe -javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar35502:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin -Dfile.encodingUTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
19Process finished with exit code 03.1、扩容问题 如果要添加的数据底层数组盛不下了那就需要扩容底层的数组。默认情况下扩容为原来容量的2倍2同时将原有数组中的元素赋值到新的数组中。new StringBuilder(); 创建的时候是不会扩容的容量是字符串参数的长度 加上16。 package stringdemo;public class StringBufferTest {public static void main(String[] args) {//new StringBuffer();创建的时候是不会扩容的StringBuffer sb1 new StringBuffer(66666666666666666666666666666666666666666666666666666666);System.out.println(sb1.length());//56System.out.println(sb1.capacity());//561672}
}
D:\Java\jdk-17\bin\java.exe -javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar37260:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin -Dfile.encodingUTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
56
72Process finished with exit code 0sb1.append();的时候追加的时候才会发生扩容。超出字符串参数的长度16的时候才会发生扩容。
public class StringBufferTest {public static void main(String[] args) {StringBuffer sb1 new StringBuffer(44444444);//new创建的时候不会发生扩容System.out.println(sb1.length());//8System.out.println(sb1.capacity());//81624System.out.println();sb1.append(44444444);System.out.println(sb1.length());//16System.out.println(sb1.capacity());//24System.out.println();sb1.append(44444444);System.out.println(sb1.length());//24System.out.println(sb1.capacity());//24 这个时候StringBuffer的容量已经满再append就会扩容System.out.println();sb1.append(4);System.out.println(sb1.length());//25System.out.println(sb1.capacity());//24*2250 扩容为原来容量的2倍2}
}
D:\Java\jdk-17\bin\java.exe -javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar37603:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin -Dfile.encodingUTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\jdk8 StringBufferTest
8
2416
2424
2425
50Process finished with exit code 03.2、指导意见 开发中建议大家使用StringBufferint capacity为了避免扩容一开始建议使用带参数的构造器效率会高一些。 4、StringBuffer类常用方法 StringBuffer appendxxx 提供了很多的append方法用于进行字符串拼接 StringBuffer deleteint startint end 删除指定位置的内容 StringBuffer replaceint startint endString str 把[start,end]位置替换为str StringBuffer insertint offsetxxx 在指定位置插入xxx StringBuffer reverse 把当前字符序列逆转 当append和insert时如果原来value数组长度不够可扩容。如上这些方法支持方法链操作 总结 增 append(xxx) 删 delete(int start,int end) 改 setCharAt(int n,char ch) / replace(int start,int end,String str) 查 charAt(int n) 插 insert(int offset,xxx) 长度 length(); *遍历 for() charAt() / toString() 5、对比String、StringBuffer、StringBuilder三者的效率 从高到低排列StringBuilder StringBuffer String public class Efficiency {public static void main(String[] args) {long startTime 0L;long endTime 0L;String text ;StringBuffer buffer new StringBuffer();StringBuilder builder new StringBuilder();startTime System.currentTimeMillis();for (int i 0; i 20000; i) {buffer.append(String.valueOf(i));}endTime System.currentTimeMillis();System.out.println(StringBuffer的执行时间 (endTime - startTime));startTime System.currentTimeMillis();for (int i 0; i 20000; i) {builder.append(String.valueOf(i));}endTime System.currentTimeMillis();System.out.println(StringBuilder的执行时间 (endTime - startTime));startTime System.currentTimeMillis();for (int i 0; i 20000; i) {text text i;}endTime System.currentTimeMillis();System.out.println(String的执行时间 (endTime - startTime));}
}
D:\Java\jdk-17\bin\java.exe -javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar18779:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin -Dfile.encodingUTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\jdk8 Efficiency
StringBuffer的执行时间5
StringBuilder的执行时间3
String的执行时间210Process finished with exit code 0