当前位置: 首页 > news >正文

群辉怎么做视频网站/青岛快速排名优化

群辉怎么做视频网站,青岛快速排名优化,现在又有疫情吗最新消息,给别人做设计的网站参考:https://www.jianshu.com/p/160c9be0b132 连接符号 "" 本质 字符串变量(非final修饰)通过 "" 进行拼接,在编译过程中会转化为StringBuilder对象的append操作,注意是编译过程,而不…

参考:https://www.jianshu.com/p/160c9be0b132

连接符号 "+" 本质

字符串变量(非final修饰)通过 "+" 进行拼接,在编译过程中会转化为StringBuilder对象的append操作,注意是编译过程,而不是在JVM中。

public class StringTest {public static void main(String[] args) {String str1 = "hello ";String str2 = "java";String str3 = str1 + str2 + "!";String str4 = new StringBuilder().append(str1).append(str2).append("!").toString();}
}

上述 str3 和 str4 的执行效果其实是一样的,不过在for循环中,千万不要使用 "+" 进行字符串拼接。

public class test {public static void main(String[] args) {run1();run2();}   public static void run1() {long start = System.currentTimeMillis();String result = "";for (int i = 0; i < 10000; i++) {result += i;}System.out.println(System.currentTimeMillis() - start);}public static void run2() {long start = System.currentTimeMillis();StringBuilder builder = new StringBuilder();for (int i = 0; i < 10000; i++) {builder.append(i);}System.out.println(System.currentTimeMillis() - start);}
}

 

在for循环中使用 "+" 和StringBuilder进行1万次字符串拼接,耗时情况如下:
1、使用 "+" 拼接,平均耗时 250ms;
2、使用StringBuilder拼接,平均耗时 1ms;

for循环中使用 "+" 拼接为什么这么慢?下面是run1方法的字节码指令

5 ~ 34 行对应for循环的代码,可以发现,每次循环都会重新初始化StringBuilder对象,导致性能问题的出现。

性能问题

StringBuilder内部维护了一个char[]类型的value,用来保存通过append方法添加的内容,通过 new StringBuilder() 初始化时,char[]的默认长度为16,如果append第17个字符,会发生什么?

void expandCapacity(int minimumCapacity) {int newCapacity = value.length * 2 + 2;if (newCapacity - minimumCapacity < 0)newCapacity = minimumCapacity;if (newCapacity < 0) {if (minimumCapacity < 0) // overflowthrow new OutOfMemoryError();newCapacity = Integer.MAX_VALUE;}value = Arrays.copyOf(value, newCapacity);
}

 

如果value的剩余容量,无法添加全部内容,则通过expandCapacity(int minimumCapacity)方法对value进行扩容,其中minimumCapacity = 原value长度 + append添加的内容长度。
1、扩大容量为原来的两倍 + 2,为什么要 + 2,而不是刚好两倍?
2、如果扩容之后,还是无法添加全部内容,则将 minimumCapacity 作为最终的容量大小;
3、利用 System.arraycopy 方法对原value数据进行复制;

在使用StringBuilder时,如果给定一个合适的初始值,可以避免由于char[]数组多次复制而导致的性能问题。

不同初始容量的性能测试:

public class StringBuilderTest {public static void main(String[] args) {int sum = 0;final int capacity = 40000000;for (int i = 0; i < 100; i++) {sum += cost(capacity);}System.out.println(sum / 100);}public static long cost(int capacity) {long start = System.currentTimeMillis();StringBuilder builder = new StringBuilder(capacity);for (int i = 0; i < 10000000; i++) {builder.append("java");}return System.currentTimeMillis() - start;}
}

 

执行一千万次append操作,不同初始容量的耗时情况如下:
1、容量为默认16时,平均耗时110ms;
2、容量为40000000时,不会发生复制操作,平均耗时85ms;

通过以上数据可以发现,性能损耗不是很严重。

内存问题

1、StringBuilder内部进行扩容时,会新建一个大小为原来两倍+2的char数组,并复制原char数组到新数组,导致内存的消耗,增加GC的压力。
2、StringBuilder的toString方法,也会造成char数组的浪费。

public String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);
}

 

String的构造方法中,会新建一个大小相等的char数组,并使用 System.arraycopy() 复制StringBuilder中char数组的数据,这样StringBuilder的char数组就白白浪费了。

重用StringBuilder

public class StringBuilderHolder {private final StringBuilder sb;public StringBuilderHolder(int capacity) {sb = new StringBuilder(capacity);}public StringBuilder resetAndGet() {sb.setLength(0);return sb;}
}

 

通过 sb.setLength(0) 方法可以把char数组的内存区域设置为0,这样char数组重复使用,为了避免并发访问,可以在ThreadLocal中使用StringBuilderHolder,使用方式如下:

private static final ThreadLocal<StringBuilderHolder> stringBuilder= new ThreadLocal<StringBuilderHolder>() {@Overrideprotected StringBuilderHolder initialValue() {return new StringBuilderHolder(256);}
};StringBuilder sb = stringBuilder.get().resetAndGet();

 

不过这种方式也存在一个问题,该StringBuilder实例的内存空间一直不会被GC回收,如果char数组在某次操作中被扩容到一个很大的值,可能之后很长一段时间都不会用到如此大的空间,就会造成内存的浪费。

总结

虽然使用默认的StringBuilder进行字符串拼接操作,性能消耗不是很严重,但在高性能场景下,还是推荐使用ThreadLocal下可重用的StringBuilder方案。

 

转载于:https://www.cnblogs.com/L-a-u-r-a/p/8577169.html

http://www.lbrq.cn/news/1276885.html

相关文章:

  • 建立网站的公司杭州/网站关键词优化教程
  • 360路由器做网站/哈尔滨推广优化公司
  • 无锡网站建设服务公司/互联网营销师是做什么的
  • 深圳哪里做网站/在线seo
  • 动易网站模板下载/百度网站
  • 昆明响应式网站/网站维护推广的方案
  • 建设集团招聘/百度sem优化师
  • 陕西电商b2c网站建设公司/sem工作内容
  • 上海自聊自做网站/谷歌浏览器安卓下载
  • google网站建设代理/网站推广的作用
  • 网站使用标题做路径/东莞市网站seo内容优化
  • 商务部系统政府网站建设与管理规范/网络营销成功案例ppt免费
  • 新塘网站设计/软件推广平台有哪些?哪个比较好
  • 温州小学网站建设/百分百营销软件官网
  • 免费做网站教程/怀柔网站整站优化公司
  • php 中英双语网站源码/网络营销教学网站
  • 潍坊网站建设小程序制作/百度旗下产品
  • 网页设计培训(可0基础)/网站seo运营
  • 一般做网站哪家好/如何刷seo关键词排名
  • 超低价的郑州网站建设/品牌运营策划
  • 如何用爬虫做网站监控/怎么做表格
  • 徐州专业做网站/东莞网络推广托管
  • wordpress 添加文件夹/seo外包如何
  • 福州建设企业网站/seo自学教程推荐
  • 适合35岁女人的培训班/百度热搜关键词排名优化
  • 做网站要搭建什么平台/电商网站平台
  • 网站网页能自己做吗/全国疫情排行榜
  • 免费个人搭建网站/常用网站推广方法及资源
  • 推广营销海外网站/郑州seo顾问热狗
  • wordpress 百度地图xml/类聚seo
  • n8n为什么建议在数组的每个item中添加json键?
  • Spring boot 打包成docker image 镜像
  • 数据库-索引
  • creating and using sequence
  • 未授权访问
  • C++ list 容器全解析:从构造到模拟实现的深度探索----《Hello C++ Wrold!》(16)--(C/C++)