列一组数据
StringBuffer sb = new StringBuffer();//原始长度即sb.length(); for(int i =0 ;i<1000;i++){ sb.append("0"); //表中缓存空间值取自sb.capacity(); }
长度、缓存空间、原始长度
首先我们得知道StringBuffer的默认初始缓存空间大小16
public StringBuffer(){ super(16); }
不同构造函数,初始缓存空间大小不同
public StringBuffer(int c){ super(c); } public StringBuffer(String str){ super(str.length()+16); append(str); }
根据不同构造函数,结合上面表格数据,就可以发现一个规律
StringBuffer的长度在大于缓存空间大小时,缓存空间会自动扩充,这个扩充大小为当前长度*2+2。第一次的扩充时间取决于初始缓存空间。
然后回过头再去看源码。
if(newCount>value.length) expandCapacity(newCount)
这句话出现在父类AbstractStringBuilder 的append中。
然后我们再来看expandCapacity(int i)
void expandCapacity(int i){ int newCapacity = (value.length+1) *2; //这句话是重点 if(newCapacity < 0 ){ newCapacity = Integer.MAX_VALUE; }else if (minimumCapacity > newCapacity){ newCapacity = i; } value = Arrays.copyOf(value,newCapacity); }
第二句的公式,就很清楚的说明了扩充规则
相关推荐
2. **缓存效率**:当创建相同的字符串时,如果该字符串已经存在于字符串池(String Pool)中,则不会创建新的实例,而是返回已存在的引用。这避免了内存中存在多个相同字符串副本的情况,提高了空间效率。 3. **性能...
7. **优化性能**:为了避免每次都查询整个用户表,可以考虑缓存页码和对应的数据,或者使用数据库的分页功能。 这个例子中没有涉及具体的代码实现,但大致流程就是这样。在实际项目中,你可能还需要考虑错误处理、...
通过使用`StringBuffer`或`StringBuilder`以及自定义缓存类,我们可以有效地管理字符串对象,避免不必要的内存分配。在实际项目中,可以根据需求调整缓存大小、选择合适的线程安全机制,以达到最佳的性能和资源利用...
每当 `StringBuffer` 被修改时,`toStringCache` 就会被清空(设置为 `null`),以确保缓存的有效性。 ```java private transient char[] toStringCache; @Override public synchronized String toString() { if ...
主要用来缓存处理大量的Json数组的工具类,比如:TCP编程时,客户端或服务端(等等)接收大量Json数据时,由于受到字节数组的长度问题,不能读取一个完整的json字符串,此方法就是用StringBuffer作为缓存处理得到...
2. JVM对象缓存:了解`String`池的概念,以及何时和为什么字符串常量会被存储在池中。 3. 优化技巧:如何通过预估字符串长度来减少`StringBuffer`或`StringBuilder`的扩容次数,从而提高性能。 4. 类的演进:例如,...
2. **对象缓存机制**:了解JVM如何缓存字符串常量,如`String Pool`,并讨论如何有效利用。 3. **JVM优化技巧**:探讨如何优化Java代码,减少不必要的字符串对象创建。 4. **类的演进**:讨论`String`相关类在不同...
Java线程与缓存是Java开发中至关重要的概念,尤其对于有一定经验的开发者来说,面试时往往会遇到相关问题。以下是对这些知识点的详细说明: 1. **基础信息** - **数据类型**:Java提供了八种原始数据类型,包括...
StringBuffer sb = new StringBuffer("lru -> "); DoubleListNode,V> temp = lruNode.next; while(temp != null){ sb.append(temp.key + " " + temp.value + " "); temp = temp.next; } return sb.toString()...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的重要类,它们各自具有不同的特性和使用场景。本文将对这三个类进行源代码分析,探讨它们的主要数据组织、功能实现以及性能差异。 1.1 ...
使用StringBuffer代替String可以提高性能,因为StringBuffer可以避免生成临时对象的开销。例如,可以使用StringBuffer的append方法代替String的“+”操作。 2. 生成对象时,分配合理的空间和大小 Java中的很多类都...
3. 优化代码:减少不必要的资源浪费,例如避免频繁的 new 对象,使用单例模式、StringBuffer 或者 StringBuilder 等。 4. 队列:可以使用队列来解决高并发问题,将所有请求放入队列,以毫秒计时单位,有序的进行,...
- **不可变性:** `String`对象一旦创建就不可更改,这种特性使得`String`非常适合缓存场景。 - **内存消耗:** 频繁修改`String`会导致大量的临时对象生成,从而增加内存消耗及垃圾回收的压力。 - **性能:** 在...
- **原因**:选择使用`StringBuffer`而非`StringBuilder`或普通字符串是因为在多线程环境下,`StringBuffer`提供线程安全的特性,虽然在这个单线程示例中并不一定需要,但在实际应用中考虑到性能和线程安全问题时,...
10. Hibernate的缓存机制:Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存默认开启,存储最近查询的对象,提高读取速度。二级缓存可选,通过插件实现,用于跨Session...
以下是一个关于密码隐藏处理的示例代码,展示了如何优化`StringBuffer`的使用: ```java public static String hidePassword(final String msg) { if (null == msg || msg.length() == 0) { return msg; } ...
* String、StringBuffer、StringBuilder的区别 * 泛型中extends和super的区别 * ==和equals方法的区别 * 重载和重写的区别 二、Java集合框架 * List和Set的区别 * ArrayList和LinkedList的区别 * ...