java if 易错笔试题_【Java基础】易错面试题,(不断更新中...)

1、final、finally、finalize的区别:

final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承

finally:异常处理语句结构的一部分,表示总是执行。

finalize:Object类的一个方法,在垃圾回收器执行党的时候会调用被回收此对象的方法,可以覆盖这个方法

2、接口和抽象类的区别:

相同点:

接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现或继承

可以将抽象类和接口作为引用类型

接口和抽象类都包含抽象方法

一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法进行全部是实现,否则该类仍然需要被声明为抽象类

不同点:

一个类可以实现多个接口,但只能继承一个抽象类

接口中不能定义构造器,抽象类中可以定义构造器;抽象类的构造器不是用来创建对象的,而是让其子类调用完成抽象类的初始化操作

接口中的方法全部都是抽象方法,抽象类中可以有抽象方法和具体方法;

接口中的成员全部都是public,抽象类中的成员可以是private、默认、protected、public

接口中定义的成员变量实际上都是常量,抽象类中可以定义成员变量;

接口中不能有静态方法,抽象类中可以包含静态方法;(jdk1.8之后接口中可以有静态方法)

3、&和&&的区别:

&:按位与,不管左边是true或者false,右边都会进行运算,不会短路

&&:逻辑与,只看左边结果,如果左边为true,右边参与运算,如果左边为false 右边不参与运算,有短路功能

4、重载(Overloading)和重写(Overriding)的区别:

重载(Overloading):

看是否是重载,一是看方法名相同,二是看参数是否相同。方法名相同,参数不同就是重载,否则不是。

方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数类型。重载是一个类中多态的一种表现。

Java的方法重载,就是在类中可以创建多个方法,他们具体相同的名字,但具有不同的参数和不同的定义。调用方法是通过传递给他们不同的参数个数和类型来决定具体使用哪个方法,这就是多态。

重载时,方法名一样,但是参数类型和个数不一样,返回值类型可以相同也可以不同。无法以返回类型作为重载函数的区分标准。

重写(overriding):

父类与子类之间的多态性,对父类的函数进行重新定义。如果子类中定义的某个方法与其父类有相同的名称和参数,我们说该方法被重写。在Java中,子类可以继承父类中的方法。而不需要重新编写相同的方法。但有时子类并不想原封不动的继承父类的方法,而是想做一定的修改,这就是采用方法的重写。方法重写也称之为方法覆盖。

若子类中的方法与父类中的某一个方法具有相同的方法名,返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可以使用super关键字,该关键字引用了当前的父类。

子类函数的访问修改权限不能少于父类。

重写需要遵循 ”两同两小一大“ 的原则:

两同:子类重写的方法必须和父类被重写的方法名相同,参数列表相同

两小:子类的返回值类型小于等于父类的返回值类型,子类抛出的异常小于等于父类抛出的异常

一大:子类重写的方法使用的访问权限必须大于父类被重写的方法的访问权限

注意:子类不能重写父类中声明为private权限的方法

总结:

重写:就是在写一边,重载就是在多一个

重写:父类里面有,子类就照猫画虎写一个

重载:自己类里面有,觉得不够就在写一个

5、==和equals的区别:

==既可以比较基本类型也可以比较引用类型。对于基本类型比较的是值,对于引用类型比较的是内存地址。

equals 是属于java Object的一个方法,如果该方法没有被重写默认也是”==“ ;通常情况下 重写equals方***比较类中的相应属性是否相等。

6、error和exception的区别:

相同点:

Error类和Exception的父类都是Throwable类

不同点:

Error类一般是指Java虚拟机无法为解决的严重错误,如系统崩溃,虚拟机错误,内存不足,方法调用栈溢出等。

Exception类表示其他因编程错误或偶然存在的外在因素导致的问题,程序可以处理,可以捕获且能修复。

7、throw和throws的区别:

throw:

throw语句用在方法体内,表示抛出异常,由方法体内的语句处理

throw是具体向外抛出异常的动作,它抛出的是一个异常实例,执行throw一定是抛出了某中异常。

throws:

throws语句是在方法声明后面,表示如果抛出一床,由该方法的调用者来进行异常处理。

throws主要是声明这个方***抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

throws表示出现异常的一种可能性,并不一定会发生这种异常。

8、String、StringBuilder、StringBuffer的区别:

String 有final修饰,是不可变字符序列,一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可被改变的,直至这个对象被销毁

即:

String a="张三";

a="123";

//打印为123

System.out.println(a);

28a2aea0aac472c361031d5ddd4ae19f.png

可以看出来,再次给a赋值时,并不是对原来堆中实例对象进行重新赋值,而是生成了一个新的实例对象,并且指向456这个字符串。a则指向最新生产的实例对象,之前的实例对象仍然存在,如果没有被再次引用,则会被垃圾回收。

StingBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以修改这个字符串对象的字符序列。一旦通过StringBuffer生了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。

StringBuffer b= new StringBuffer("123");

b.append("456");

//b打印结果为:123456

System.out.println(b);

f91fdd43c78cf02755850334cb4f8fb4.png

StringBuffer对象是与i个字符序列可以变的字符串,它没有重新生成一个对象;而且在原来的对象中可以连接新的字符串。

StringBuilder类也代表可以变字符串对象。实际上,StringBudiler和StringBuffer基本相似,不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能所以性能略高

总结:String有final修饰,不可变字符序列;StringBuffer 可变字符序列,其效率低但是线程安全;StringBuilder 可变字符序列其效率高 但是线程不安全。

9、StingBuffer是如何实现线程安全的:

StringBuffer类中实现的方法:

1ef4d3dea9756a0ab1e3e672b6c57194.png

由此可见,StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。

Java9的改进

Java9改进了字符串(包括String、StringBuffer、StringBuilder)的实现。在Java9以前字符串采用char[]数组来保存字符,字符串的每个字符占2字节;而Java9的字符串采用byte[]数组再加一个encoding-flag字段来保存字符,因此字符串的每个字符只占1字节。所以Java9的字符串更加节省空间,字符串的功能方法也没有受到影响

10、ArrayList和LinkedList区别

两者线程都不安全,但是效率比 Vector的高

ArrayList底层是以数组形式保存的,随机访问集合中的元素比LinkedList快原因是因为LinkedList要移动指针

LinkedList内部是以链表的形式博爱村集合里面的数据的,它所及访问集合中的元素性能慢,但是新增和删除时速度比ArrayLIst快 原因时ArrayList要移动数据

11、equals和hashcode的区别

如果两个对象equals相等,那么它们的hashcode一定相等。

如果两个对象equals不相等,那么它们的hashcode有可能相等

如果两个对象hashcode相等,他们的equals不一定相等

如果两个对象hachcode不相等,他们的equals不一定相等

12、Java类成员的访问控制权限:

public > protected > default(同包) > private

13、Hashtable和Hashmap的区别:

相同点:

Hashtable和Hashmap都是Map的子接口

不同点:

Hashtable线程安全,不支持key和value为空,key不能重复,但value可以重复,不支持key()和value为null

Hashmap线程不安全,支持key和value为空,key不能重复,但是value可以重复,支持key和value为null

14、Java中Object类的常用方法

clone();

创建并返回此对象的一个副本。

equals();

指示其他某个对象是否与此对象”相等“

finalize();

当垃圾回收器确定不存在对该对象引用时,由对象的垃圾回收器调用此方法

getClass();

返回此Object的运行时类

notify(),notifyAll();

唤醒在此对象监视器上等待的单个线程notify();

唤醒在此对象监视器上等待的所有线程 notifyAll();

toString();

返回该对象的字符串表示。

15、Java编译时异常和运行时异常(RuntimeExecption)的区别,并举出几种运行时异常:

编译时异常:

在编译阶段不通过:(如图)

将String类型赋值给int类型的数组出现编译异常。

bde724f670fb4af984735441e9ec3b61.png

运行时异常:

编译阶段无异常,但是在运行时报错(数组越界异常和空指针异常):

41b9260838ee26651d6a3762a91e9c50.png

fff87a1e135b5a36f1c422b0eb539117.png

86c8de9fca52754a8e8d340cea07b8fc.png

常见的 RuntimeException类型的异常:

ArithmeticException 数学计算异常

NullPointerException 空指针异常

NegativeArraySizeException 负数组长度异常

ClssCastException 类型强制转换异常

SecurityException 违背安全原则异常

ArrayIndexOutOfBoundsException 数组越界异常

由于是个萌新,水平有限 所写的难免有所不足,欢迎大佬补充!

2cca33703b2b50a6a7ec417371e03817.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值