String和StringBuffer
【java】String类和StringBuffer类常用操作

【java】String类和StringBuffer类常⽤操作String类是字符串常量,是不可更改的常量。
⽽StringBuffer是字符串变量,它的对象是可以扩充和修改的。
StringBuffer在进⾏字符串处理时,不⽣成新的对象,在内存使⽤上要优于String类。
所以在实际使⽤时,如果经常需要对⼀个字符串进⾏修改,例如插⼊、删除等操作,使⽤StringBuffer要更加适合⼀些。
String类主要⽅法的使⽤⼀、创建并初始化字符串:String s = "hello!"; //使⽤字符串常量直接初始化String(); //使⽤构造⽅法创建并初始化,初始化⼀个对象,表⽰空字符序列String(value); //利⽤已存在的字符串常量创建⼀个新的对象String (char[] value); //利⽤⼀个字符数组创建⼀个字符串String(char[] value,int offset,int count);//截取字符数组offset到count的字符创建⼀个⾮空串String(StringBuffer buffer); //利⽤StringBuffer对象初始化String对象⼆、String类主要⽅法的使⽤:1、获取长度*.length(); //这与数组中的获取长度不同,*.length;2、⽐较字符串(1)equals() //判断内容是否相同(2)compareTo() //判断字符串的⼤⼩关系(3)compareToIgnoreCase(String int) //在⽐较时忽略字母⼤⼩写(4)== //判断内容与地址是否相同(5)equalsIgnoreCase() //忽略⼤⼩写的情况下判断内容是否相同//如果想对字符串中的部分内容是否相同进⾏⽐较,可以⽤(6)reagionMatches() //有两种 public boolean regionMatches(int toffset, String other,int ooffset,int len);表⽰如果String对象的⼀个⼦字符串与参数other的⼀个⼦字符串是相同的字符序列,则为true.要⽐较的String 对象的字符串从索引toffset开始,oth public boolean reagionMatches(boolean ignoreCase,int toffset,String other,int ooffset,int len);//⽤布尔类型的参数指明两个字符串的⽐较是否对⼤⼩写敏感。
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 类在程序中经常会⽤到字符串,所谓的字符串就是指⼀连串的字符,它是由多个单个字符连接⽽成的。
关于JavaSE部分的常见及经典面试题

关于JavaSE部分的常见及经典面试题●Java基础及面向对象1.String和StringBuffer的区别?2.Object类有什么方法?3.final关键字的作用?4.final,finally,finalize的区别?5.assert是什么,在什么情况下用?6.String s = new String(“xyz”),创建了几个String Object?7.Math.round(11.5)和Math.round(-11.5)分别等于多少?8.short s1 = 1;s1 = s1+1和s1+=1有什么错?9.Java有没有goto关键字?10.数组有没有length()这个方法?String有没有length()这个方法?11.Overload和Override的区别?Overload的方法是否可以改变返回值类型?12.==和equals()的区别?13.分别用public 空(default) protected private 修饰属性时的访问控制图?14.为什么要配置环境变量?15.break,continue,return的作用及区别?16.用什么命令执行源代码(socure code)?17.面向对象的特征.●程序控制流程●集合框架1.List Set Map 有什么区别?他们分别有哪些方法?2.ArrayList 和LinkedList 的区别?3.HashMap和HashTable的区别?4.Collection 和Collections有什么区别?●流处理1.●多线程1.什么是线程?有哪些状态?如何实现多线程?2.什么是线程安全?3.说出你所知道的线程同步的方法?4.sleep()和wait()有什么区别?5.可以实现哪些接口创建新线程?6.在什么情况下,会中断执行中的线程?●时间和日期1.●端对端通信1.●异常捕获和处理1.一句话简述Error和Exception的区别?2.异常处理机制的简单原理和应用?3.如何自定义一个异常?●泛型●反射机制1.如何用反射调用一个已知类的已知方法?●继承和派生以及接口应用1.抽象类和接口的区别,他们在什么情况下会使用?2.匿名内部类是否可以继承其他类,是否可以实现接口?3.static nested class 和inner class的不同?●Java中的垃圾回收机制1.请叙述垃圾回收机制的优点和原理?2.GC是什么,为什么要试用GC?●基础算法1.如果系统要试用超大整数,请你设计一个数据结构来存储这个数字并设计一种算法实现其假发运算。
Java中String的理解

Java中String的理解Java中String的理解最近在读String的源码,看了些String的⽂章,⾃⼰对String作了下总结记录下来。
1.String为什么是不可变的?String是final类,不可继承,其⽅法也不可被覆盖,避免从⼦类操纵⽗类属性;String的值保存在private final char[]数组中,本质是⼀个字符数组,私有则外部不可访问和修改,final引⽤则引⽤(或说引⽤的值)不变。
引⽤可以简单地认为是堆上对象的⾸地址。
String内部的private int hash,缓存hash值,hashCode和equals⽤来⽐较对象相等,缓存hash可以减少运算时间提⾼效率。
但是,String的值char[]可以通过反射改变。
String不可变是出于安全和使⽤效率考虑的。
2.String的split,substring,replace,replaceAll等⽅法有哪些注意点?charAt,toLowerCase,toUpperCase,trim,toCharArray等常⽤⽅法并没有太多注意点。
split(String regex,int limit):regex,切⽚的正则;limit,切⽚数。
split(String regex):regex,切⽚的正则。
从这⾥可以看出切⽚是使⽤正则来切⽚的,⽽且要注意的是,尾部切⽚得到的空字符串""(注意没有空格)是不会出现的结果的字符串数组中的。
思考:String s=“,1,2,,3,,,”;String[] arr=s.split(",");arr的值是什么?结果是{"",“1”,“2”,“”,“3”}。
如果制定切⽚数limit则会按切⽚数切⽚。
substring(int beginIndex,int endInx):beginIndex是包含的,end不包含。
stringbuffer用法

stringbuffer用法StringBufferJava中的一个重要的工具类,它的功能是用来处理字符串的。
它是在 Java 1.0本中就开始被使用,目前最新的版本是 Java 8,目前仍在有效使用中。
StringBuffer以被视作是一个字符串容器,它可以处理大量字符串进行复杂的操作,更加方便快捷。
与 String不同,StringBuffer 不仅可以用来处理字符串,还可以处理基本类型的数据。
StringBuffer几种常用的用法,下面将详细介绍。
首先,StringBuffer构造函数:StringBuffer两种构造函数,一种是不带参数的构造函数,另一种是带参数的构造函数。
如果不带参数,则会创建一个容量为 16节的字符串缓冲区;如果带参数,则可以指定字符串缓冲区的容量,如:StringBuffer sb = new StringBuffer(1024);其次,StringBuffer append法:append法可以向字符串缓冲区中添加任意类型的参数,它将把参数转换为字符串,然后拼接到字符串缓冲区的末尾,如:StringBuffer sb = newStringBuffer();sb.append(Hello第三,StringBuffer insert法:insert法与 append法类似,都可以向字符串缓冲区添加参数,但是 insert法可以指定参数插入到字符串缓冲区的任意位置,如:StringBuffer sb = new StringBuffer(hello worldsb.insert(5,, );第四,StringBuffer delete法:delete法可以删除字符串缓冲区中的指定部分字符,可以指定删除开始位置和结束位置,如:StringBuffer sb = new StringBuffer(hello, worldsb.delete(5, 11);最后,StringBuffer reverse法:reverse法可以将字符串缓冲区中的字符串反转,如:StringBuffer sb = newStringBuffer(hello world!);sb.reverse();以上就是 StringBuffer常用用法,可以看出 StringBuffer一个功能强大的工具类,在处理字符串时能够帮助我们完成大量复杂的操作,极大地提高了我们处理字符串的效率。
传智播客-----笔记整理(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);忽略大写比较字符串内容。
String、StringBuffer和StringBuilder区别

String、StringBuffer和StringBuilder区别String、StringBuffer和StringBuilder区别1、长度是否可变String 是被 final 修饰的,他的长度是不可变的,就算调⽤ String 的concat ⽅法,那也是把字符串拼接起来并重新创建⼀个对象,把拼接后的 String 的值赋给新创建的对象StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产⽣新的未使⽤对象,StringBuffer 与 StringBuilder 中的⽅法和功能完全是等价的。
调⽤StringBuffer 的 append ⽅法,来改变 StringBuffer 的长度,并且,相⽐较于 StringBuffer,String ⼀旦发⽣长度变化,是⾮常耗费内存的!2、执⾏效率三者在执⾏速度⽅⾯的⽐较:StringBuilder > StringBuffer > String3、应⽤场景如果要操作少量的数据⽤ = String单线程操作字符串缓冲区下操作⼤量数据 = StringBuilder多线程操作字符串缓冲区下操作⼤量数据 = StringBufferStringBuffer和StringBuilder区别1、是否线程安全StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最⼤不同在于 StringBuilder 的⽅法不是线程安全的(不能同步访问),StringBuffer是线程安全的。
只是StringBuffer 中的⽅法⼤都采⽤了 synchronized 关键字进⾏修饰,因此是线程安全的,⽽StringBuilder 没有这个修饰,可以被认为是线程不安全的。
2、应⽤场景由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使⽤ StringBuilder 类。
C#中StringStringBuilderStringBuffer类的用法

C#中StringStringBuilderStringBuffer类的⽤法String和StringBuilder和StringBuffer,这三个都是值得深究⼀翻的,可能很多⼈会说,实在不⾏的话,都全部⽤StringBuilder,啥事没有,我不能说你的想法事不正确的,但是我可以给出更好的建议。
下⾯简单介绍⼀下这三个类。
String类在我们平时的使⽤当中很容易不注意到的是,⾃⼰写的代码很容易发⽣了装箱的操作(把值类型转换为引⽤类型)。
就⽐如很常见的,⼀个字符串拼接string str=9+"test"; 通过查看IL代码可以知道这⾥发⽣了装箱的操作。
所以建议使⽤(在把值类型转换为字符串的时候,记得⽤ToString⽅法)。
所以平时写代码的时候,要注意下,装箱和拆箱的操作(之后推出的泛型集合不就是为了解决装箱和拆箱的操作)。
装箱操作的过程:把值类型放到托管堆⾥⾯分配内存,除了值类型本⾝所分配的内存外,内存总量还要加上类型对象指针和同步索引块所占⽤的内存,之后再将值类型的值重新分配到堆内存当中,最后再返回引⽤类型的对象的地址。
我们知道很多类型(值类型)都⾃带了⼀个ToString⽅法,为⽑⽤这个就不会发⽣装箱操作呢,很简单的⼀个道理,不是有⼈和你说String是特殊的值类型(虽然他是引⽤类型),C#语⾔的设计者,为了做到这⼀点,他想出了这个⽅法把String对象,⼀旦赋值就不可改变(叫做字符串的恒定性),赋值完了之后,再对String进⾏拼接,赋值等,都会再内存⾥⾯重新分配⼀个新的内存空间。
StringBuilder基于上⾯的问题,string类在重新赋值会重新去分配内存空间,所以为了解决这个问题,微软推出了⼀个StringBuilder的类。
可以看看StringBuilder类是如何做到不重新分配内存的呢。
通过阅读StringBuiler类的实现,我们可以发现internal const int DefaultCapacity = 0x10; StringBuilder类,默认的⼤⼩是16,意思就是说我们如果不指定StringBuilder长度,超过16个长度,就会重新去分配⼀次内存。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
String StringBuffer区别用法2009-09-26 09:25String && StringBuffer的区别和用法2007/02/24 11:02String && StringBuffer的区别:非可变对象一旦创建之后就不能再被改变,可变对象则可以在创建之后被改变。
String对象是非可变对象;StringBuffer对象则是可变对象。
为获得更佳的性能需要根据实际情况小心谨慎地选择到底使用这两者中的某一个。
String类用来表示那些创建后就不会再改变的字符串,它是不可变的(immutable);StringBuffer类用来表示内容可变的字符串;例:1.String对象:String str = "Hello";str += "World";// JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为 String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"Hello"和"World"创建为两个新的 String 对象)。
之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它不是最初的str,而是最初的str的引用指向了新生成的String对象"HelloWorld"。
2.StringBuffer对象:StringBuffer strBuf = new StringBuffer("Hello");strBuf.append("World");// 程序将只产生两个对象:最初的strBuf :"Hello"和拼接时的String ("World"),不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。
节省额外的系统开销。
如何选择是使用String还是StringBuffer:取决于两种情况,第一种情况是需要连接的字符串是在编译期决定的还是在运行期决定的,第二种情况是你使用的是StringBuffer还是String。
1) 第一种情况:编译期决定相对于运行期决定;如:String str = "This " + "is " + "a " + "Java " + "program"; StringBuffer strBuf = new StringBuffer();strBuf.append("This ");strBuf.append("is ");strBuf.append("a ");strBuf.append("Java ");strBuf.append("program");此时,+操作符比StringBuffer.append()方法要快,WHY?这里编译器的优化起了关键作用,编译器简单地在编译期连接多个字符串。
它使用编译期决定取代运行期决定,在你使用new关键字来创建String对象的时候也是如此。
这里str对象在编译期就决定了而 StringBuffer对象是在运行期决定的。
运行期决定需要额外的开销当字符串的值无法预先知道的时候,编译期决定作糜谧址闹悼梢栽は戎赖氖?候,也就是说String str = "This " + "is " + "a " + "Java " + "program";这段代码在编译时,编译器会对程序作出优化,String str被优化成“This is a Java program”;而StringBuffer strBuf只会在运行时才处理。
所以效率是不一样的。
(注意,这里的String str = "This " + "is " + "a " + "Java " + "program";与 String str = "Hello";str += "World";是不一样的);2) 第二种情况:使用StringBuffer取代StringString str = "Hello";for(int i = 0; i < 40000; i++) {str += "World";}StringBuffer strBuf = new StringBuffer("Hello");for(int i = 0; i < 40000; i++) {strBuf.append("World");}此时,StringBuffer.append()方法要比+操作符快得多,WHY?原因是两者都是在运行期决定字符串对象,但是+操作符使用不同于StringBuffer.append()的规则;它是通过String和StringBuffer来完成字符串的连接操作的。
另外,在使用StringBuffer时,可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能。
这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。
如:(1)StringBuffer strBuf = new StringBuffer();for(int i = 0; i < 40000; i++) {strBuf.append("Hello");}(2)StringBuffer strBuf = new StringBuffer(100000);for(int i = 0; i < 40000; i++) {strBuf.append("Hello");}此时,(2) 的效率好于 (1),因为StringBuffer内部实现是char数组,当使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。
当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。
如果使用缺省值,初始化之后接着往里面追加字符,在追加到第16个字符的时候它会将容量增加到 34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。
无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍。
所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见影的性能增益。
(2)避免了复制数组的开销。
创建String对象:String str = "Hello";// JVM先根据内容"Hello"查找对象,如果没找到,则在heap(堆栈)*上创建新对象,并将其赋予str,否则使用已经存在的对象。
String str = new String("Hello");// 据内不管heap上有没有"Hello"这个对象,JVM都会在heap上创建一个新String对象;此时heap上可能会出现内容相同,地址不同的String对象。
推荐使用String str = "Hello";这种方法创建String类型的对象,这样会使heap中只存在唯一的一个存放"Hello"对象的内存地址;实际上我们不需要多个独立的"Hello"对象,因为要运行它们的话浪费时间+浪费内存。
我们也不必因使用new String("Hello");创建了多个”Hello”对象而发愁,可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。
String intern()方法检查字符串对象的存在性,如果需要的字符串已经存在,那么它将会引用指向已经存在的字符串对象而不是重新创建一个。
这和使用 String str = "Hello";这种方法创建对象就作用上来说是一致的。
使用intern():String str = new String("Hello");str = str.intern();String对象的比较:"==" //比较地址;"equals"//比较内容;String str1 = "a";String str2 = "a";String str3 = new String("a");str1 == str2 // truestr1 == str3 // falsestr1.equals(str2); // truestr1.equals(str3); // true但是StringBuffer类并没有实现Objcet类的Equals方法,所以不能用这个方法来比较两个StringBuffer类的字符串是否相等:StringBuffer strBuf1 = new StringBuffer(“a”);StringBuffer strBuf2 = new StringBuffer(“a”);System.out.println(strBuf1.equals(strBuf2));程序输出:false*这里想对“heap(堆栈)”做一下更正:应该是heap(堆),而非堆栈。
“堆”是一种通用的内存池,用于存放所有的Java对象。
当使用“new”实例化一个对象时,编译器会自动在堆里进行存储分配。
C++在堆栈中创建对象,Java对象引用存储在堆栈中;而Java对象并不存储于其中。