浅谈Java中String与StringBuilder的区别
浅谈Java中String与StringBuilder的区别
先看上图中的代码,运行后结果如下:
true
false
true
true
a = Microsoft and a ==
b ?false
false
true
sb2 now =Oracle+Sun
来一一解读,当字符串a和b同时等于”Microsoft”时,a和b因为同为引种类型,所以会去堆中引用同一个地址,所以第一行打印出来结果为真;当a的值改变后,其引用地址自然就变成一个新的、值为”IBM”的地址,而符号”==”说白了是比较两个引用类型变量的地址,所以第二行为假;当a的值再次变为”Microsoft”,a==b的值又变成真了,说明a的地址有一次发生了变化,a和b的地址相同了,而a=”Microsof”+”t”的时候,它只是表现方式变了,值并没有变,并且编译之后a=”Microsof”+”t”,这句话就又变成了
a=”Microsoft”,所以结果同上;但是,当 a = “Mic” + b.substrin(3)的时候,虽然a最后的值和b一样,但是显而易见,地址变了,因为这里涉及到了字符串的操作,a的地址发生了变化。
再来看stringBuilder,定义两个stringBuilder的实例sb1和sb2,二者构造方法的参数都一样,在这种情况下,sb1和sb2的值是一样,但是地址却不一样,结果为假;而sb3=sb2,所以地址肯定是一样的,结果为真。
但是当sb3进行append操作之后,sb2的值竟然变了,说明sb2和sb3共享一块内存,并且在进行操作的过程中,地址不变。
而根据String的几个小例子,可以发现,String类型的变量在进行字符串操作的时候,地址是会变的,所以我们可以得出这样的结论:String和stringBuilder的区别在于String类型的变量改变值的时候是有可能改变地址的,而后者的对象无论如何改变其值,所占用的内存地址不发生变化。
当然要比较两个string的值,一定要用equals()方法。
- -!用两个等号必然悲剧。
JAVAAPI(一)String类和StringBuffer类
⽅法声明 功能描述int indexOf(int ch)返回指定字符在此字符串中第⼀次出现处的索引int lastIndexOf(int ch)返回指定字符在此字符串中最后⼀次出现处的索引int indexOf(String str)返回指定⼦字符串在此字符串中第⼀次出现处的索引int lastIndexOf(String str)返回指定⼦字符串在此字符串中最后⼀次出现处的索引char charAt(int index)返回字符串中index 位置上的字符,其中,index 的取值范围是0-(字符串长度-1)boolean endsWith(String suffix)判断此字符串是否以指定的字符串结尾int length()返回此字符串的长度boolean equals(Object anObject)将此字符串与指定的字符串⽐较boolean isEmpty()当且仅当字符串长度为0时返回true boolean startsWith(String prefix)判断此字符串是否以指定的字符串开始boolean contains(CharSequence cs)判断此字符串中是否包含指定的字符序列String toLowerCase()使⽤默认语⾔环境的规则将String 中的所有字符都转换为⼩写String toUpperCase()使⽤默认语⾔环境的规则将String 中的所有字符都转换为⼤写static String valueOf(int i)返回int 参数的字符串表⽰形式char[] toCharArray()将此字符串转换为⼀个字符数组String replace(CharSequence oldstr,CharSequence newstr)返回⼀个新的字符串,它是通过⽤newstr 替换此字符串中出现的所有oldstr 得到的String[] split(String regex)根据参数regex 将原来的字符串分割为若⼲⼦字符串JAVAAPI (⼀)String 类和StringBuffer 类1.String 类和StringBuffer 类在程序中经常会⽤到字符串,所谓的字符串就是指⼀连串的字符,它是由多个单个字符连接⽽成的。
string、stringbuffer和stringbuild的区别与联系
String、StringBuffer和StringBuilder的区别String类分别用于实现IComparable、ICloneable、IConvertible、IEnumerable和IComparable接口。
使用Convert类进行转换,而不是使用此类型的IConvertible显式接口成员实现。
String类提供的成员执行以下操作:比较String对象;返回String对象内字符或字符串的索引;复制String对象的值;分隔字符串或组合字符串;修改字符串的值;将数字、日期和时间或枚举值的格式设置为字符串;对字符串进行规范化。
•使用Compare、CompareOrdinal、CompareTo、Equals、EndsWith和StartsWith方法进行比较。
•使用IndexOf、IndexOfAny、LastIndexOf和LastIndexOfAny方法可获取字符串中子字符串或Unicode 字符的索引。
•使用Copy和CopyTo可将字符串或子字符串复制到另一个字符串或Char类型的数组。
•使用Substring和Split方法可通过原始字符串的组成部分创建一个或多个新字符串;使用Concat和Join方法可通过一个或多个子字符串创建新字符串。
•使用Insert、Replace、Remove、PadLeft、PadRight、Trim、TrimEnd和TrimStart可修改字符串的全部或部分。
•使用ToLower、ToLowerInvariant、ToUpper和ToUpperInvariant方法可更改字符串中Unicode 字符的大小写。
•使用Format,可将字符串中的一个或多个格式项占位符替换为一个或多个数字、日期和时间或枚举值的文本表示形式。
•使用Length属性可获取字符串中Char对象的数量;使用Chars属性可访问字符串中实际的Char对象。
•使用IsNormalized方法可测试某个字符串是否已规范化为特定的范式。
传智播客-----笔记整理(java基础-----String,StringBuffer,StringBuilde)
这两天一直比较犯迷糊,每天都不知道在忙啥,所以有些断更了,真的是,咳咳,明天就要接手新班了,对我来说是喜忧参半吧,喜的是可以锻炼一下自己的能力,忧的是怕自己做不好,不过还是尽力吧。
大纲:String:1.1String方法1.2String特点1.3 StringBuffer1.4 StringBuilder1.5 Jdk升级的目的1.6 基本数据类型对象包装类1.7基本类型======>字符串1.8 字符串=====>基本类型1.9 整数具备不同的进制体现。
2.0自动拆装箱面试题挨个走一遍吧,Let's go.String:String对象的初始化由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:String s = “abc”;s = “Java语言”;其实按照面向对象的标准语法,其格式应该为:String s = new String(“abc”);s = new String(“Java语言”);只是按照面向对象的标准语法,在内存使用上存在比较大的浪费。
例如String s = new String(“abc”);实际上创建了两个String对象,一个是”abc”对象,存储在常量空间中,一个是使用new关键字为对象s申请的空间。
其它的构造方法的参数,可以参看String类的API文档。
1.1String方法获取获取字符串中字符的个数(长度)int length();根据位置获取字符char charAt(int index);根据字符获取在字符串中的第一次出现的位置int indexOf(int ch);【因为char类型可以转换成int(对应的是0---2^16),依据ASCII,返回-1时,表示这个字符不存在,此方法也可以判断字符是否存在。
】从指定位置进行ch的查找第一次出现位置int indexOf(int ch,int fromIndex);根据字符串获取在字符串中的第一次出现的位置int indexOf(String str);从指定位置进行ch的查找第一次出现位置int indexOf(String str,int fromIndex)根据字符获取在字符串中的最后一次出现的位置int lastIndexOf(int ch);从指定位置进行ch的查找最后一次出现位置int lastIndexOf(int ch,int fromIndex);根据字符串获取在字符串中的最后一次出现的位置int latindexOf(String str);从指定位置进行ch的查找最后一次出现位置int lastindexOf(String str,int fromIndex);获取字符串中一部分字符串,也叫子串String subString(int beginIndex,int endIndex);【包含begin,但不包含end】String substring(int beginIndex);从beginIndex到最后转换将字符串变成字符串数组(字符串的切割)String [] split(String regex):【里面的条件是一个正则表达式】将字符串变成字符数组char [] toCharArray();将字符串变成字节数组byte [] getBytes();将字符串中的字母转成大小写String toUpperCase();【大写】String toLowerCase();【小写】将字符串中的内容进行替换String replace(char oldch,char newch);String replace(String s1,String s2);将字符串两端的空格去除String trim();将字符串进行连接String concat(String str);判断两个字符串内容是否相同boolean equals(Object obj);【复写Object的方法,所以传递的是Object对象】boolean equalsIgnoreCase(String str);忽略大写比较字符串内容。
java学习(四)---String、StringBuffer、StringBuilder和数组
java学习(四)---String、StringBuffer、StringBuilder和数组对于 String、StringBuffer、StringBuilder⽐较⼀下主要说说三者的不同String 长度⼤⼩不可变StringBuffer 和 StringBuilder 长度可变StringBuffer 线程安全 StringBuilder 线程不安全StringBuilder 速度快推荐使⽤(要求线程安全时使⽤StringBuffer)JDK1.5以上提出来的StringBuffer类⽅法数组⼀、声明dataType[] arrayRefVar; // ⾸选的⽅法//或dataType arrayRefVar[]; // 效果相同,但不是⾸选⽅法⼆、创建arrayRefVar = new dataType[arraySize];//声明并创建dataType[] arrayRefVar = new dataType[arraySize];//或者dataType[] arrayRefVar = {value0, value1, ..., valuek};三、数组处理 jdk1.5+ 添加了foreach循环double[] myList = {1.9, 2.9, 3.4, 3.5};// 打印所有数组元素 ----可以在不使⽤下标的情况下遍历数组for (double element: myList) {System.out.println(element);}四、arrays类 java.util.Arrays 类能⽅便地操作数组,它提供的所有⽅法都是静态的。
给数组赋值:fill数组排序:sort⽐较数组:equals查找数组元素:binarySearch ·。
StringBuilder和String的区别
String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder 则不会。
所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String另外,对于 String 我们不得不多说几句:1.它是引用类型,在堆上分配内存2.运算时会产生一个新的实例3.String 对象一旦生成不可改变(Immutable)3.定义相等运算符(==和 !=)是为了比较 String 对象(而不是引用)的值示例:using System;using System.Collections.Generic;using System.Text;namespace Example22{class Program{static void Main(string[] args){const int cycle=10000;long vTickCount=Environment.TickCount;String str=null;for (int i=0; i < cycle; i++)str +=i.ToString();Console.WriteLine(“String: {0} MSEL”, Environment.TickCount – vTickCount);vTickCount=Environment.TickCount;//看到这个变量名我就生气,奇怪为什么大家都使它呢?:)StringBuilder sb=new StringBuilder();for (int i=0; i < cycle; i++)sb.Append(i);Console.WriteLine(“StringBuilder: {0} MSEL”, Environment.TickCount –vTickCount);string tmpStr1=“A”;string tmpStr2=tmpStr1;Console.WriteLine(tmpStr1);Console.WriteLine(tmpStr2);//注意后面的输出结果,tmpStr1的值改变并未影响到tmpStr2的值tmpStr1=“B”;Console.WriteLine(tmpStr1);Console.WriteLine(tmpStr2);Console.ReadLine();}}}结果:String: 375 MSELStringBuilder: 16 MSELAAB A。
string与stringbuilder两者的区别
string与stringbuilder两者的区别String 对象是不可改变的。
每次使⽤ System.String 类中的⽅法之⼀时,都要在内存中创建⼀个新的字符串对象,这就需要为该新对象分配新的空间。
StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最⼤字符数指定⼀个值,当修改 StringBuilder 时,在达到容量之前,它不会为其⾃⼰重新分配空间。
当达到容量时,将⾃动分配新的空间且容量翻倍。
可以使⽤重载的构造函数之⼀来指定 StringBuilder 类的容量。
例如:StringBuilder hr = new StringBuilder(); hr.Append("a")他不会频繁申请内存空间,他会⾃动向后扩展。
两者的区别:1. string 对象时恒定不变的,stringBuider对象表⽰的字符串是可变的。
stringBuilder是.net提供的动态创建string的⾼效⽅式,以克服string对象恒定性带来的性能影响。
2. 对于简单的字符串连接操作,在性能上stringBuilder并不⼀定总是优于string。
因为stringBuider对象创建代价较⼤,在字符串⽬标连接较少的情况下,过度滥⽤stringBuilder会导致性能的浪费,只有⼤量的或者⽆法预知次数的字符串操作,才考虑stringBuilder来实现。
事实上,⼀般连接次数设置100次以内,根本看不出两者的性能差别。
3. 当修改字符串信息时,此时不许创建对象,可以使⽤stringBuilder对象。
总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
如果你想了解更多相关内容请查看下⾯相关链接。
JAVA面试题StringBuffer和StringBuilder的区别,从源码角度分析?
} catch (Exception e) { e.printStackTrace();
} finally { latch2.countDown();
}
} }).start(); } try { latch1.await(); System.out.println(stringBuilder.length()); latch2.await(); System.out.println(stringBuffer.length()); } catch (InterruptedException e) { e.printStackTrace(); } } }
测试结果
StringBuffer不论运行多少次都是1000长度。
StringBuilder绝大多数情况长度都会小于1000。
StringBuffer线程安全,StringBuilder线程不安全得到证明。
总结一下
StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder。
return substring(start, count); }
@Override public synchronized String toString() {
if (toStringCache == null) { toStringCache = Arrays.copyOfRange(value, 0, count);
} return new String(toStringCache, true); }
从上面的源码中我们看到几乎都是所有方法都加了synchronized,几乎都是调用的父类的方法.,用synchronized关键字修饰意味着什么?加锁,资源同步串行化 处理,所以是线程安全的。
String和StringBuilder的区别
String和StringBuilder的区别StringBuilder:如果我们对字符串进⾏拼接,每次拼接都会创建⼀个String对象,消耗时间和资源,⽽StringBuilder是⼀个可变的字符串,字符串缓冲区类String和StringBuilder的区别:1.String的内容是固定的2.StringBuilder的内容是可变的StringBuilder常⽤的构造⽅法:public int capacity()-------返回当前容量值16(理论值)public int length()-----返回长度(字符数)(实际值)reverse⽅法:public StringBuilder reverse()----将字符串翻转StringBuilder的demo:StringBuilder sb=new StringBuilder();//由于该⾮法返回的是⼀个对象,所以可以继续调⽤⽅法(链式编程)sb.append("hello").append("work");System.out.println(sb);String与StringBuilder的相互转换:/*//String转换成StringBuilderString s="hellowork";StringBuilder sb=new StringBuilder(s);//使⽤构造⽅法转换System.out.println(s);*///StringBuilder转换成StringStringBuilder sb=new StringBuilder();sb.append("hello").append("work");String s=sb.toString();//使⽤toString⽅法转换System.out.println(s);demo⼆:StringBuilder实现数组元素按格式实现拼接:StringBuilder sb=new StringBuilder();sb.append("[");//遍历数组for(int i=0;i<arr.length;i++) {if(i==arr.length-1) {sb.append(arr[i]);}else {sb.append(arr[i]).append(",");}}sb.append("]");String s=sb.toString();return s;。
String、StringBuffer与StringBuilder之间区别
String、StringBuffer与StringBuilder之间区别最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String2.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 = “Th is is only a” + “simple” + “test”;3 StringBuffer builder = new StringBuilder(“This is only a”).append (“simple”).append(“test”);你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。
String与Stringbuilder区别
String用于表示文本,StringBuilder表示值为可变字符序列的类似字符串的对象,之所以说是可变的,是因为通过追加、移除、替换或插入字符创建它以后,还可以对其进行修改。
同时,在操作长度比较大的字符串的时候,使用StringBuilder会更方便。
下面举例说明其不同之处:(1)定义方式不同string str = “Hello World”;StringBuildersb = new StringBuilder("Hello World");(2)显示整个字符串的时候显示方式不同。
Console.WriteLine("{0}",str);Console.WriteLine("{0}",sb.Tostring());(3)功能不同用string可显示字符串的第n个元素,字符串长度、删除字符串首尾空格、复制、大小写、截取字符串显示第n个元素:str[n-1];字符串长度:str.length;删除字符串首尾空格:str.Trim();复制:str.Clone().Tostring();大小写:str.Toupper();str.Tolower();截取:str.substring(n1,n2);//n1,n2为截取字符串的首尾元素在原字符串中的位置用StringBuilder主要是用来修改字符串,如添加文本以及获取其最大的文本数量。
在末端添加文本:sb.Append("***");//***为所添加的内容获取最大文本数量:sb.MaxCapacity代码using System;usingSystem.Collections.Generic;usingSystem.Text;namespaceStringTypeCommon{class Program {static void Main(string[] args) {stringstr = " Hello World";Console.WriteLine("显示{0}", str);Console.WriteLine("第一个{0}", str[0]);Console.WriteLine("第二个{0}", str[1]);Console.WriteLine("插入字符{0}",str.Insert(6," C#"));Console.WriteLine("字符串长度{0}", str.Length);Console.WriteLine("删除字符串空格{0}", str.Trim());Console.WriteLine("字符串复制{0}",str.Clone().ToString());Console.WriteLine("小写字符串{0}", str.ToLower());Console.WriteLine("大写字符串{0}", str.ToUpper());Console.WriteLine("截取部分字符串{0}", str.Substring(1, 6));StringBuildersb = new StringBuilder("Hello World ");Console.WriteLine("显示{0}", sb.ToString());Console.WriteLine("末端追加文本{0}", sb.Append("!!!"));Console.WriteLine("指定位置添加文本{0}", sb.Insert(6, "dear ")); Console.WriteLine("最大文本数量{0}", sb.MaxCapacity);Console.ReadLine(); } }}。
