版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Java面试题冲刺第一天深入追问:
追问1:这三者在效率上怎么说?
StringBuliderStringBufferString
String(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符串变量(有同步锁)
StringBuilder:字符串变量(无同步锁)
从上面的名字可以看到,String是"字符串常量",也就是不可改变的对象。源码如下:
publicfinalclassString{}
对于上面这句话的理解你可能会产生这样一个疑问,比如这段代码:
Stringstr="唐伯虎";
str=str+"点香烟";
System.out.print(str);//result:"唐伯虎点香烟"
我们明明改变了String型的变量str啊,为什么说是没有改变呢?我们来看一下这张对String操作时内存变化的图:
我们可以看到,初始String值为"唐伯虎",然后在这个字符串后面加上新的字符串"点香烟",这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了"唐伯虎点香烟"字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费,执行效率同理。
为了应对经常性操作字符串的场景,Java才提供了其他两个操作字符串的类——StringBuffer、StringBuilder。
他们俩均属于字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,速度自然就相对快了。
我们一般在StringBuffer、StringBuild类上的主要操作是append和insert方法,这些方法允许被重载,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append方法始终将这些字符添加到缓冲区的末端;而insert方法则在指定的点(index)添加字符。
StringBuilder一个可变的字符序列是JDK1.5新增的。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用S
tringBuilder类,因为在大多数实现中,它比StringBuffer要快。且两者的方法基本相同。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
String类型和StringBuffer、StringBuild类型的主要性能区别其实在于String是不可变的对象(final),因此在每次对String类型进行改变的时候其实都等同于在堆中生成了一个新的String对象,然后将指针指向新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用String。因为每次生成对象都会对系统性能产生影响,特别是当内存中的无引用对象过多了以后,JVM的GC开始工作,那速度是一定会相当慢的。另外当GC清理速度跟不上newString的速度时,还会导致内存溢出Error,会直接kill掉主程序!报错如下:
Causedby:java.lang.OutOfMemoryError:GCoverheadlimitexceeded
Exceptioninthread"I/Odispatcher3797236"java.lang.OutOfMemoryError:GCoverheadlimitexceeded
追问2:那StringBuffer和StringBuffer线程安全主要差在哪里呢?
StringBuffer和StringBuilder可以算是双胞胎了,这两者的方法没有很大区别。但在线程安全性方面,StringBuffer允许多线程进行字符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized修饰了,而StringBuilder没有。
synchronized的含义:
每一个类对象都对应一把锁,当某个线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。了解了synchronized的含义以后,大家可能都会有这个感觉。多线程编程中StringBuffer比StringBuilder要安全多了,事实确实如此。如果有多个线程需要对同一个字符串缓冲区进行操作的时候,StringBuffer应该是不二选择。
注意:是不是String也不安全呢?事实上不存在这个问题,String是不可变的。线程对于堆中指定的一个String对象只能读取,无法修改。试问:还有什么不安全的呢?
实际应用场景中:
如果不是在循环体中进行字符串拼接的话,直接使用String的“+”就好了;
单线程循环中操作大量字符串数据→StringBuilder.append();
多线程循环中操作大量字符串数据→StringBuffer.append();
面试题2:请你说一下Error和Exception区别是什么?
正经回答:
Error和Exception都是Throwable的子类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型。
Exception和Error体现了java平台设计者对不同异常情况的分类,Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。
Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序处于非正常的、不可恢复的状态。既然是非正常情况,不便于也不需要捕获。常见的比如OutOfMemoryError之类都是Error的子类。
Exception又分为可检查(checked)异常和不可检查(unchecked)异常。可检查异常在源代码里必须显式的进行捕获处理,这是编译期检查的一部分。不可检查时异常是指运行时异常,像NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
面试题3:==和equals的区别是什么
正经回答:
==:它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
equals():它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于调用了Object类的equals()方法,也就是通过“==”比较这两个对象。
//Object类中的equals()方法
publicbooleanequals(Objectobj){
return(this==obj);
}
情况2:类覆盖了equals()方法。一般,我们都会覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
//String类中的equals()方法,已覆盖,用于比较内容
publicbooleanequals(ObjectanObject){
if(this==anObject){
returntrue;
if(anObjectinstanceofString){
StringanotherString=(String)anObject;
intn=value.length;
if(n==anotherString.value.length){
charv1[]=value;
charv2[]=anotherString.value;
inti=0;
while(n--!=0){
if(v1[i]!=v2[i])
returnfalse;
i++;
returntrue;
returnfalse;
深入追问:
追问1:如果我们不重写equals()方法,会怎么样?
举例说明:
重点说明:是否重写Object类中的equals方法,会对结果造成的影响
publicstaticvoidmain(String[]args){
//字符串比较
Stringa="陈哈哈";
Stringb="陈哈哈";
if(a==b){//truea==b
System.out.println("a==b");
if(a.equals(b)){//truea.equals(b)
System.out.println("a.equals(b)");
//StringBuffer对象比较,由于StringBuffer没有重写Object的equal方法,因此结果出现错误
StringBufferc=newStringBuffer("陈哈哈");
StringBufferd=newStringBuffer("陈哈哈");
if(c==d){//falsec!=d
System
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年全国统考教师资格考试《教育教学知识与能力(小学)》练习题审定版附答案详解
- 2024-2025学年度宝鸡职业技术学院单招《语文》综合提升测试卷附参考答案详解【综合题】
- 2024-2025学年农村信用社招聘考试题库试题(精练)附答案详解
- 2024-2025学年度执业兽医测试卷及参考答案详解(综合卷)
- 2024-2025学年度施工员模拟题库含答案详解AB卷
- 2024-2025学年度监理工程师全真模拟模拟题及完整答案详解【名校卷】
- 2024-2025学年度天津城市建设管理职业技术学院单招数学练习题及参考答案详解【研优卷】
- 2024-2025学年度计算机四级考前冲刺练习题及参考答案详解(研优卷)
- 2024-2025学年度广东环境保护工程职业学院妇产护理期末模拟试题带答案详解(突破训练)
- 企业资产完备无损承诺书(6篇)
- 汽轮机组试车方案
- 漆安慎力学第二版课后习题解答及漆安慎-力学答案
- PCI围术期强化他汀治疗的获益和机制课件
- 沥青搅拌站安全生产风险分级管控体系方案资料(2022-2023版)
- WTO海关估价协议中文版
- 【广东省】工作证明模板(仅供参考)
- YS/T 613-2006碳膜电位器用电阻浆料
- GB/T 33365-2016钢筋混凝土用钢筋焊接网试验方法
- GB/T 17626.10-2017电磁兼容试验和测量技术阻尼振荡磁场抗扰度试验
- GB/T 14536.6-2008家用和类似用途电自动控制器燃烧器电自动控制系统的特殊要求
- 《乡风文明建设》(王博文)
评论
0/150
提交评论