Java面试必知:String与StringBuffer的区别详解

需积分: 23 16 下载量 151 浏览量 更新于2024-09-19 1 收藏 6KB TXT 举报
在Java编程中,String和StringBuffer是两种常用的字符序列类型,它们在处理字符串操作时有着不同的特性和应用场景。本文将深入剖析它们的区别,以便在面试或者实际开发中做出正确的选择。 **1. 基本概念和特性** - **String**: 是不可变的对象,一旦创建,其内容就不能被修改。这意味着每次对String进行操作(如追加、替换等)都会创建一个新的String对象,导致额外的空间开销。例如: - String str = "kvill"; - str += "ill"; // 这里实际上是创建了新的String对象,如str2="kvillill" - **StringBuffer**: 是可变的字符序列,允许在原对象上进行修改,没有性能上的开销。这使得StringBuffer在频繁的字符串拼接或修改场景中表现更优。例如: - StringBuffer sb = new StringBuffer("kvill"); - sb.append("ill"); // 这里直接在sb上操作,无需创建新对象 **2. 空间效率和线程安全** - String是线程不安全的,如果多个线程同时访问并修改一个String对象,可能会导致数据不一致。 - StringBuffer是线程安全的,提供了同步方法(如`append`和`reverse`),适合多线程环境,但性能略低于非同步的StringBuilder。 **3. 字符池和常量池** - 在内存管理方面,String的实例共享常量池中的引用,所以对于相同的字符串值(如"kvill"),多个String对象会指向同一块内存区域,节省空间。例如: - Strings0 = "kvill"; Strings1 = "kvill"; s0 == s1; // 返回true,因为它们指向同一内存区域 - StringBuffer不共享字符池,每次操作都会创建一个新的实例,即使内容相同,也会占用额外空间。 **4. 创建和比较** - String的创建:通过`new String()`或字符串字面量,如`String str = "kvill"`,会分配新的内存。而`String str = newString("kvill");`这里的newString()不是String类的构造函数,而是示例中的自定义方法,可能无法直接复制到String的实例。 - 比较运算:`==`用于比较引用是否相同,`equals()`用于比较内容是否相等。在比较两个字符串是否相等时,要注意它们的创建方式,如`s0==s1`和`s0.equals(s1)`的结果可能会不同。 **5. 实例共享与重复创建** - 对于String,如果字符串内容已存在常量池,`intern()`方法可以返回这个共享实例。这样可以避免无谓的重复创建。 - StringBuffer虽然不会自动共享,但当使用`+`或`+=`与其他String拼接时,会尝试查找常量池的共享实例。 String适合在字符串不变的情况下使用,尤其是在多线程环境中,为了保证数据的一致性,应避免直接修改。而StringBuffer则更适合在需要频繁修改字符串或进行大量拼接操作时,因为它提供更高的灵活性和性能。在选择时,应根据具体需求权衡空间效率和性能开销。
2010-06-04 上传
整理了网上的一些java面试题目,很全很强大 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题,而6. 只是选择其中的一部分,7. 暂时不 8. 用部分细节。抽象包括两个方面,9. 一是过程抽象,10. 二是数据抽象。 11. 继承:继承是一种联结类的层次模型,12. 并且允许和鼓励类的重用,13. 它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,14. 这个过程称为类继承。新类继承了原始类的特性,15. 新类称为原始类的派生类(子类),而16. 原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,17. 并且类可以修改或增加新的方法使之更适合特殊的需要。 18. 封装:封装是把过程和数据包围起来,19. 对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,20. 即现实世界可以被描绘成一系列完全自治、封装的对象,21. 这些对象通过一个受保护的接口访问其他对象。 22. 多态性:多态性是指23. 允许不同24. 类的对象对同25. 一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,26. 很好的解决了应用程序函数同27. 名28. 问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。