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

深圳网站. 方维网络教务管理系统学生登录入口

深圳网站. 方维网络,教务管理系统学生登录入口,wordpress 手机适配,wordpress 上传ssl证书在String中提到#xff0c;如果字符串修改操作比较频繁#xff0c;应该采用StringBuilder和StringBuffer类#xff0c;这两个类的方法基本是完全一样的#xff0c;它们的实现代码也几乎一样#xff0c;唯一的不同就在于StringBuffer类是线程安全的#xff0c;而StringBui…在String中提到如果字符串修改操作比较频繁应该采用StringBuilder和StringBuffer类这两个类的方法基本是完全一样的它们的实现代码也几乎一样唯一的不同就在于StringBuffer类是线程安全的而StringBuilder类不是。 基本用法 创建StringBuilder对象 StringBuilder sb new StringBuilder(); 通过append方法添加字符串 sb.append(Hello) sb.append( World) 通过toString方法获取构建后的字符串 System.out.println(sb.toString()); 实现原理 创建 与String类似StringBuilder类也封装了一个字符数组定义如下 char[] value; int count; 与String不同它不是final的可以修改。另外与String不同字符数组中不一定所有位置都已经被使用它有一个实例变量count表示数组中已经使用的字符个数。 StringBuilder继承自AbstractStringBuilder它的默认构造方法是 public StringBuilder() {super(16); }其中调用父类的构造方法父类对应的构造方法是 AbstractStringBuilder(int capacity) {value new char[capacity]; }也就是说new StringBuilder()代码内部会创建一个长度为16的字符数组count的默认值为0。 append append方法的代码 public AbstractStringBuilder append(String str) {if(str null) str null;int len str.length();ensureCapacityInternal(count len);str.getChars(0, len, value, count);count len;return this;} append会直接复制字符到内部的字符数组中如果字符数组长度不够会进行扩展实际使用的长度用count体现。具体来说ensureCapacityInternal(countlen)会确保数组的长度足以容纳新添加的字符str.getChars会复制新添加的字符到字符数组中countlen会增加实际使用的长度。 ensureCapacityInternal的代码如下 private void ensureCapacityInternal(int minimumCapacity) {//overflow-conscious codeif(minimumCapacity - value.length 0)expandCapacity(minimumCapacity); }如果字符数组的长度小于需要的长度则调用expandCapacity进行扩展其代码为 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);} 扩展的逻辑是分配一个足够长度的新数组然后将原内容复制到这个新数组中最后让内部的字符数组指向这个新数组这个逻辑主要靠上面的最后一行代码实现。我们可以看出StringBuilder的扩容是靠Arrays实现的所以原理也一样。 这里的扩展策略是跟当前长度相关的当前长度乘以2再加上2如果这个长度不够最小需要的长度才用minimumCapacity。比如默认长度为16长度不够时会先扩展到16*22即34然后扩展到34*22即70然后是70*22即142这是一种指数扩展策略。为什么要加2这样在原长度为0时也可以一样工作。为什么要这么扩展呢这是一种折中策略一方面要减少内存分配的次数另一方面要避免空间浪费。在不知道最终需要多长的情况下指数扩展是一种常见的策略广泛应用于各种内存分配相关的计算机程序中。不过如果预先就知道需要多长那么可以调用StringBuilder的另外一个构造方法public StringBuilder(int capacity) toString toString方法的代码 public String toString() {//Create a copy, dont share the arrayreturn new String(value, 0, count); }基于内部数组新建了一个String。注意这个String构造方法不会直接用value数组而会新建一个以保证String的不可变性。 insert insert是在指定索引offset处插入字符串str public AbstractStringBuilder insert(int offset, String str) {if((offset 0) || (offset length()))throw new StringIndexOutOfBoundsException(offset);if(str null)str null;int len str.length();ensureCapacityInternal(count len);System.arraycopy(value, offset, value, offset len, count - offset);str.getChars(value, offset);count len;return this; } 实现思路是在确保有足够长度后首先将原数组中offset开始的内容向后挪动n个位置n为待 插入字符串的长度然后将待插入字符串复制进offset位置。 挪动位置调用了System.arraycopy()方法将数组src中srcPos开始的length个元素复制到数组dest中destPos处。这个方法有个优点即使src和ldest是同一个数组它也可以正确处理。 public static native void arraycopy(Object src, int srcPos,Object dest, int destPos, int length);运算 Java中String可以直接使用和运算符这是Java编译器提供的支持背后Java编译器一般会生成StringBuilder和操作会转换为append。比如如下代码 String hello hello; hello,world; System.out.println(hello);背后Java编译器一般会转换为 StringBuilder hello new StringBuilder(hello); hello.append(, world); System.out.println(hello.toString()); 不过在稍微复杂的情况下Java编译器可能没有那么智能它可能会生成过多的StringBuilder,尤其是在有循环的情况下在循环内部每一次操作都会生成一个StringBuilder。所以对于简单的情况可以直接使用String的和对于复杂的情况尤其是有循环的时候应该直接使用StringBuilder。 八股考点 String、StringBuffer、StringBuilder 的区别 String:用于字符串操作属于不可变类【补充String不是基本数据类型是引用类型底层用char数组实现的】 StringBuilder与StringBuffer类似都是字符串缓冲区但线程不安全 StringBuffer也用于字符串操作不同之处是StringBuffer 属于可变类对方法加了同步锁线程安全补充说明StringBuffer中并不是所有方法都使用了Synchronized修饰来实现 执行效率StringBuilderStringBufferString String中“”和StringBuffer中的 append会有性能上的差别吗 会有性能上的差别。 在Java中String对象是不可变的也就是说每次使用“运算符连接字符串时都会创建一个新的String对象这就涉及到内存分配和垃圾回收如果在循环或频繁操作中使用”进行字符串拼接会大大降低性能。 而StringBuffer和StringBuilder的对象是可变的append方法实际上是在原有的字符序列后面添加字符不会创建新的对象所以在进行大量或复杂的字符串操作时使用StringBuffer或StringBuilder的性能要高于使用String的。 另外StringBuffer是线程安全的而StringBuilder是非线程安全的所以在单线程环境下StringBuilder的性能会更高一些。 final修饰 StringBuffer后还可以 append 吗 可以。final修饰的是一个引用变量那么这个引用始终只能指向这个对象但是这个对象内部的属性是可以变化的。
http://www.zqtcl.cn/news/773487/

相关文章:

  • 中铁建设集团招标网站wordpress区块编辑无法使用
  • 做电影网站需要的服务器配置网站关键词排名优化应该怎么做
  • 企业网站管理关键词你们懂的
  • 成都成华网站建设跟网站开发公司签合同主要要点
  • 手机搭建平台网站化工厂建设网站
  • 怎样建设自己网站的后台龙港哪里有做百度网站的
  • 西安做网站建设哪家好2345网址导航电脑版下载
  • 做暧暧小视频网站十大职业资格培训机构
  • 泰安网站建设优化营销策划是做什么
  • 做网站百度排前位网页设计实训报告2000字
  • 网站建设的活动方案房地产销售渠道拓客方案
  • 哈尔滨网站提升排名版式设计图片
  • 我的专业网站建设策划书网站logo教程
  • 百度 网站 移动端win10系统之家官网
  • h5商城网站建站成都网站建设全平台
  • xuzhou公司网站制作有什么手机网站
  • 网站建设 培训深圳网站建设制作品牌公司
  • 网站到期怎么续费网站运营优化推广
  • 一站式装修的利弊上海建设厅焊工证查询网站
  • 济宁做网站公司找融合深圳招聘一般在哪个网站
  • 重庆建网站推广公司个人网站需要建站群吗
  • 深圳网站建设吗个人博客网站制作代码
  • 化妆品网站模板网络营销的网站分类有哪些
  • 广州网站建设程序员培训wordpress 微信 抓取
  • 毕设给学校做网站个人店铺logo
  • 中国做w7的网站宿迁网站建设价位
  • 网站建设售后服务合同百度关键词排名点击器
  • 编辑网站用什么软件推广是什么
  • 北京模板开发建站做网站赚钱的点在哪里
  • 网站建设价格兴田德润i网址多少wordpress主题汉化是什么意思