常见java基础面试题

重载与重写的区别

重载:(overload) 两同一不同
1 同一个类,相同方法名,形参列表不同(形参个数不同,形参类型不同)
特点:与返回值类型,形参变量名,权限修饰符,都无关
调用:根据参数列表的不同来调用不同的重载方法
重写:(overwrite)
1.存在继承关系,子类继承父类后,对父类中同名同参的方法进行覆盖的操作
2.创建子类对象调用,父类中同名同参的方法,实际执行的是子类重写父类的方法
3.子类重写的方法与父类中被重写的方法,方法名,形参列表必须相同,权限修饰符不小于父类,基本数据类型/void 返回值类型子类与父类须一致,方法中抛出的异常类型子类不大于父类
进一步阐述:
重载 属于编译时行为,因为在编写程序时,我们可以准确的知道我们调用的某一个重载方法的执行
而 重写 属于运行时行为,因为我们在编写程序时,不能准确的确定执行的是哪个方法,只有运行后,根据运行结果的判定,才能确定执行了哪个方法;

final 、finally、finalize 的区别

final :属于关键字,可以用来修饰 类,方法,属性,
final修饰的类不可以被继承,修饰的方法不可以被重写,修饰的属性为常量,只能调用不能修改其属性值
finally :也属于关键字,在异常处理中使用,finally中声明的代码一定会被执行,在手动进行资源的释放,须声明在finally中
finalize:属于方法,在Java虚拟机中有自动垃圾回收机制,当程序执行完之前,当前对象回收之前会自动调用该方法

throws 和throw的区别

throws: 异常处理的一种方式,声明在方法声明处,只是将异常抛给了方法的调用者,并没有处理掉异常(处理的是系统自动生成的异常类对象)
throw: 手动生成异常类对象的过程并抛出,声明在方法内;

String、StringBuffer、StringBuilder之间的异同

String:不可变的字符序列;底层是char[] value数组存储
StringBuffer:可变的字符序列; 线程安全的,效率低;底层是char[] value数组存储
StringBuilder:可变的字符序列;线程不安全的,效率高;底层是char[] value数组存储
StringBuffer、StringBuilder 底层都是创建了一个长度为16的数组,用来存放数据,若存储的数据大于16会自动进行扩容,默认为扩容为原来容量的 2倍 +2 ,同时将原有数组的元素复制到新的数组中

String 与 StringBuffer、StringBuilder是可以相互转换的
String -->StringBuilder,StringBuffer 调用StringBuilder,StringBuffer的构造器
StringBuilder,StringBuffer–>String ①调用String的构造器 ②StringBuilder,StringBuffer 的toString()方法

String p =new String(“abc”);此方式创建对象,问内存中创建了几个对象?

两个:一个是堆空间中new的结构。另一个是char[]对应的在常量池中的数据"abc";

== 与equals() 的区别

”==“ 是运算符
1.可以使用在基本数据类型变量和引用数据类型变量,若比较的是基本数据类型,比较的是两个变量保存的数据是否相等(不一定类型相同),若比较的是引用数据类型,比较的是两个对象的地址值是否相同 即 两个引用是否指向同一对象实体;
2.使用时必须保证两边的变量类型要一致
equals()
1.在Object类中的声明与 “ ==”的作用是相同的
2.像String 、Date、File、包装类等中是重写了equals()方法的,比较的是两个变量的实体内容是否相同
3.自定义类下对equals() 的重写要遵循比较实体内容是否一致进行重写

synchronized与lock的异同

1.二者都可以解决线程安全问题
不同:synchronized机制在执行完相应同步代码后,自动释放同步监视器
lock需要手动的启动同步(lock())同时同步结束时也需要手动的实现(unlock())

Java是如何解决线程安全问题的,有几种方式?并对比几种方式的不同

1,在Java中,我们通过同步机制,来解决线程的安全问题。
方式一:同步代码块

synchronized(同步监视器){
//需要被同步的代码
}

说明:1.操作共享数据的代码,即为需要被同步的代码。 -->不能包含代码多了,也不能包含代码少了。
2.共享数据:多个线程共同操作的变量。比如:ticket就是共享数据。
3.同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。
要求:多个线程必须要共用同一把锁。
方式二:同步方法
如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的。

关于同步方法的总结:

  1. 同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。
  2. 非静态的同步方法,同步监视器是:this
    静态的同步方法,同步监视器是:当前类本身

方式三:Lock锁
3.利弊
同步的方式,解决了线程的安全问题。—好处
操作同步代码时,只能一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低。

sleep()和wait()的异同

1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
2.不同点:
1)两个方法声明的位置不同:Thread类中声明sleep() , Object类中声明wait()
2)调用的要求不同:sleep()可以在任何需要的场景下调用。 wait()必须使用在同步代码块或同步方法中
3)关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁。
未完待续…
在后续学习中会不断更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值