字符串缓存
A. 举例说明java中字符串和字符串缓冲区的区别
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
2.String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符创变量
StringBuilder:字符创变量
从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
1 String s = "abcd";
2 s = s+1;
3 System.out.print(s);// result : abcd1
我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
3.一个特殊的例子:
1 String str = “This is only a” + “ simple” + “ test”;
3 StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:
String str = “This is only a” + “ simple” + “test”;
其实就是:
String str = “This is only a simple test”;
所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:
String str2 = “This is only a”;
String str3 = “ simple”;
String str4 = “ test”;
String str1 = str2 +str3 + str4;
这时候JVM会规规矩矩的按照原来的方式去做。
4.StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
对于三者使用的总结: 1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
B. c++字符串缓冲区问题
C. String,StringBuffer和StringBuilder的区别
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
D. 字符串和字符串缓冲区的区别
以一个例子来说明:
char s[100]="Good morning!";
在这里字符串缓冲区是100个字节。而字符串的长度是13,字符串的存储空间是14个字节。
E. java中的字符串缓冲区是什么意思
如果你说的缓冲区是在IO操作中的话,指的就是先将数据写在内存中,等写入一定数量后再往硬盘上写。
如果你说的不是IO操作中的缓冲区的话,那可能是指StringBuilder这个类的作用了。
StringBuilder是一个类似于
String
的字符串缓冲区。可将字符串缓冲区安全地用于多个线程。所以比直接对String操作更有效率也更稳定。
F. ORA-06502: PL/sql: 数字或值错误 : 字符串缓冲区太小,如何处理!
你赋给变量的值的长度,超出了变量的长度。比如:
过程中定义了一个变量 a varchar2(2); -- a的长度为2
而在赋值时 a := '123123'; -- '123123'的长度为6
这样就会出现你所遇到的问题,解决方法是找到变量,将其长度加大,注意:plsql中varchar2长度上限是4000
G. 举例说明字符串和字符串缓冲区的区别
如果说的是java的话,这是两个不同的对象:String和StringBuffer。
它们最核心的区别是:
String的长度是不可变的,StringBuffer的长度是可变的。
StringBuffer的特点:
1、是一个字符串缓冲区,其实就是一个容器。
2、长度是可变,任意类型都行。注意:是将任意数据都转成字符串进行存储。
3、容器对象提供很多对容器中数据的操作功能,比如:添加,删除,查找,修改。
4、所有的数据最终变成一个字符串。
最后,StringBuffer还有一个特性是线程安全的容器。
H. 8086汇编语言中如何清空缓冲区里的字符串
最简单的就是往那个缓冲区送一堆零过去,通常将CX设置成缓冲区的长度,将AL清零,然后使用重复字符串操作指令来清空缓冲区:
MOV
CX,
LEN
;缓冲区的长度,以字节为单位
LEA
DI,
STR_BUFF
;缓冲区首地址送如
DI
寄存器
XOR
AL,
AL
;AL
清零
REPZ
STOSB
;重复至CX等于0
如果缓冲区巨大,可以送字过去,这样可以加快运行速度:
MOV
BX,
LEN
;缓冲区长度
MOV
CL,
2
SHR
BX,
CL
;缓冲区长度除以2,得到缓冲区的字长度
MOV
CX,
BX
;送入CX计数器
LEA
DI,
STR_BUFF
;字符串缓冲区首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重复至CX等于0
有时候还要考虑缓冲区是奇数,即缓冲区执行上诉代码后,还有一个字节没有处理,这时候,需要多加几句。
XOR
DX,
DX
MOV
BX,
LEN
TEST
BX,
1
JZ
L1
MOV
DX,
0FFH
;做标记,指明字符串是奇数
L1:
MOV
CL,
2
SHR
BX,
CL
;缓冲区长度除以2,得到缓冲区的字长度
MOV
CX,
BX
;送入CX计数器
LEA
DI,
STR_BUFF
;字符串缓冲区首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重复至CX等于0
CMP
DX,
0FFH
JNZ
EXIT
STOSB
EXIT:
......
还有许多其他的方法,但是效率最高的就是这个了,其他利用LOOP等循环指令或CMP
CX,
0,JNZ
xx
这种方法速度都要慢一下。
I. 如何理解字符串缓冲区
字符串缓冲区就是stringBuffer类,作为常用的string类来说,是不可改变的,每次的创建都会为string在内存中分配一次空间,这样在大量的字符串的操作时,是很不可取的,这时可以使用stringBuffer类,这个类使字符串能自动的根据获取的大小分配内存,减小了系统的内存压力.