Java实习生求职面试题简单分享(第一天)

1.integer和int的区别?

  1. int是基本数据类型,默认值是0,而integer是包装类,默认值是null。
  2. integer需要实例化才能使用,而int不需要。
  3. integer是对象,通过new生成的两个integer对象是不一样的,integer是对对象的引用。int直接存储数据(也存在不通过new生成的integer,直接赋值integer i= 3;会自动完成装箱和拆箱。)

2.数组(Array)和列表(ArrayList,动态数组)的区别,什么时候使用数组而不是列表?

  1. 数组中可以存放基本数据类型和对象类型,列表只能包含对象类型。
  2. 数组中存放数据时,可以间隔存放,可以空一个在存放数据,而在列表中则不可以。
  3. 数组的长度大小定义后就是固定的,而列表大小是动态变化的,每次使用时都会检查空间是否足够,不足则会默认扩大为原来的1.5倍。(扩充是创建一个新的列表为原来的1.5倍,然后把数据复制到新的列表中。)

在长度不确定的时候使用列表,确定的时候使用数组。需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据时,使用列表。

3.string和stringbuffer和stringbuilder的区别?

String:适用于少量的字符串操作。
StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。

  1. String是final类不能被继承且为字符串常量不能被改变,而StringBuilder和StringBuffer均为字符串变量。
  2. StringBuffer是线程安全的,StringBuilder是线程不安全的,所以执行速度StringBuffer更快一些,因为要保证线程安全肯定会增大一些开销。
  3. String类型是字符串常量,当进行字符串操作时,地址即发生改变。
    StringBuffer和StringBuilder类型是字符串变量,当使用apend()等操作时,内存地址不发生变化。

4.Object若不重写HashCode方法的话,hashcode是如何计算出来的?

Object 的 hashcode 方法是本地方法,也就是用 c 或 c++ 实现的,该方法直接返回对象的内存地址。
如果没有重写hashCode(),则任何对象的hashCode()值都不相等(而hashmap想让部分值的hashCode值一样,所以就要重写)。
通过该对象的内存地址(物理地址)进行hash计算,最后返回hash值。

5.为什么重写equals,还要重写hashcode方法?

  1. 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相 同。
  2. 如果两个对象不同(即用equals比较返回false),那么它们的hashCode值可能相同也可能不同。
  3. 如果两个对象的hashCode相同(存在哈希冲突),那么它们可能相同也可能不同(即equals比 较可能是false也可能是true)。
  4. 如果两个对象的hashCode不同,那么他们肯定不同(即用equals比较返回false)。

对于对象集合的判重,如果一个集合含有100个对象实例,仅仅使用equals()方法的话,那么对于一个对象判重就需要比较4950次,随着集合规模的增大,时间开销是很大的。但是同时使用哈希表的话,就能快速定位到对象的大概存储位置,并且在定位到大概存储位置后,后续比较过程中,如果两个对象的hashCode不相同,也不再需要调用equals()方法,从而大大减少了equals()比较次数。所以从程序实现原理上来讲的话,既需要equals()方法,也需要hashCode()方法。那么既然重写了equals(),那么也要重写hashCode()方法,以保证两者之间的配合关系。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值