Java面试题-阿里、饿了么、链家、携程

阿里内推:https://blog.csdn.net/hehuanchun0311/article/details/105775657

一、J2SE部分

1、Java基础


==与equals()方法的区别?
1. ==在比较基本数据类型时比较的是值,比较两个对象时比较的是地址值;
2. equals()方法存在于Object类中,Object类中equals()方法底层依赖的是==操作,
   在所有没有重写equals()的类中,调用equals()其实和使用==的效果一样,也是比较的地址值。
   String重写了equals(),底层比较的是两个String对应位置的char字符是否==。
为什么重写equals()方法就必须重写hashCode()方法?
1. Object.hashCode()方法是一个本地native方法,返回的是对象引用中存储的对象的内存地址;
2. 基于散列的集合(HashSet、HashMap和Hashtable)存放key时,调用该对象(存入对象)的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中存储的位置;
3. 所以如果equals方法返回true,那么两个对象的hasCode()返回值必须一样;
Object有哪些方法?
1. equals()、hashCode()、getClass()、toString()--默认字符串:类名+哈希编码;
2. clone():实现对象的浅复制(当改变其中一个对象的引用类型属性实例的属性时,另一个对象相应的引用类型的属性实例中的属性也会发生变化),只有实现了Cloneable接口才可以调用该方法。否则抛出CloneNotSupportedException;深复制:引用类型属性也要实现clone()方法并显式调用;
3. finalize():用于JVM对象收集;
4. wait():使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断;
5. notify():唤醒在该对象上等待的某个线程;
6. notifyAll():唤醒在该对象上等待的所有线程;
接口和抽象类的区别,什么情况下用接口或抽象类?
区别:接口里面方法都是没有实现的,抽象类里面可以有部分是实现的方法。
抽象类:只有一个或几个方法需要定义成抽象方法,从而让子类来实现;其他方法具有清晰、明确、共同的逻辑需要在本类中实现,由子类“共享”和“复用”。
接口:纯粹定义方法接口,所有方法都由实现该接口的类来实现。没有共享的公共逻辑,此时用接口比较合适。
String、StringBuffer、StringBuilder区别
不可变:String,底层是final char value[]
可变:StringBuffer、StringBuilder,底层是char[] value
线程安全:StringBuffer
线程不安全:StringBuilder
为什么String设计成不可变?
1. 字符串常量池的需要:字符串常量池是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象;
2. 允许String对象缓存HashCode:Java中String对象的哈希码被频繁地使用,字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存。这也是一种性能优化手段,意味着不必每次都去计算新的哈希码;
3. 安全性:String常被用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。
序列化和反序列化?
概念:
1. 把对象转换为字节序列的过程称为对象的序列化;
2. 把字节序列恢复为对象的过程称为对象的反序列化。
用途:
1. 把对象的字节序列永久地保存到硬盘上,让它们离开内存空间,入住物理硬盘,等要用了,再把保存在硬盘中的对象还原到内存中;
2. 在网络上传送对象的字节序列;
实现:
1. ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中;
2. ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回;
3. 只有实现了Serializable接口的类的对象才能被序列化;
serialVersionUID的作用:
1. 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
2. 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
SpringBoot优缺点?
优点:快速构建项目、对主流开发框架的无配置集成(约定优于配置)、项目可独立运行,无须外部依赖Servlet容器(内置tomcat插件)、Spring Maven版本统一管理(避免版本冲突);
缺点:集成度较高,使用过程中不太容易了解底层,部署出现问题难以排查;
为什么要用注册中心?
1. 服务注册后,及时发现;
2. 服务宕机后,及时下线;
3. 服务发现时,进行路由;

2、集合


list和set的区别,linklist和arraylist的区别和应用场景;
list:有序、可重复、可插入null
set:无序、不可重复、只能插入一个null值
linklist:链表实现,方便插入和删除
arraylist:数组实现,方便随机访问
Arraylist、HashMap的初始容量、加载因子、扩容增量?
ArrayList::10、1、原容量的0.5倍
HashMap:16、0.75、原容量的1倍
有序的Map有哪些?为什么TreeMap是有序的?哪些集合是线程安全的?
有序Map: LinkedHashMap(按插入顺序)、TreeMap(默认是按key的升序排序,也可以重写Comparator方法自定义排序)
TreeMap有序原因:实现了SortedMap接口
线程安全的集合:Vector、Hashtable、ConcurrentHashMap
HashMap的底层数据结构,是如何插入的?哈希冲突解决方案?
底层:HashMap底层实现还是数组,只是数组的一个元素可能是一个单链表(哈希冲突时才是链表)。
插入:put过程是先计算hash然后通过ha
  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值