面试题-J2SE基础(一)

本文详细解析了Java面试中常见的问题,包括基本数据类型及其封装类、switch使用字符串参数、equals与==的区别、Object公共方法、引用类型以及hashcode的作用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试题自我总结

1. 九种基本数据类型的大小,以及他们的封装类。

答:事实上应该是八种基本数据类型,String类并不属于基本类型。      

整型有四种。其中byte和short应用于底层文件处理或者需要占据存储空间量的大数组。

浮点型有两种。

char类型大小为4字节,封装类为Character,不推荐使用。

boolean类型大小可以认为是1字节或者4字节,分装类为Boolean,

对于boolean的大小问题:单个的boolean 类型变量在编译的时候是使用的int 类型。而对于boolean 类型的数组时,在编译的时候是作为byte array来编译的所以boolean 数组里面的每一个元件占一个字节!

2. Switch能否用string做参数?

在 Java 7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。在 Java 7中,String支持被加上了。Switch实现对String的操作,主要是对他做了一次hashCode(),而且hashCode()正好返回的是int。

3. equals与==的区别。

 

==用于判断两边的变量的值是否相等,如果是基本数据类型,就是判断他们的值是不是相等;如果==两边是对象的引用,那么指的是这两个引用是否指向同一个对象,及引用的值是否相等。

equals()是Object里的方法。在Object的equals中,就是使用==来进行比较,比较的是引用。与==不同的是,在某些Object的子类中,覆盖了equals()方法,比如String中的equals()方法比较两个字符串对象的内容是否相同。

hashCode()方法也是继承自Object,它用来获取一个对象的hash值,返回int值。Object.hashCode规定,equals()相等的对象,它们的HashCode()返回值也必须相等,否则无法与集合类结合在一起使用。(List, Set, Hashmap..)

4. Object有哪些公用方法?

Object是所有类的父类,任何类都默认继承Object。

clone-----保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常

equal-----在Object中与==是一样的,子类一般需要重写该方法

 

hashCode----该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到返回int值。

 

 

getClass----final方法,获得运行时类型

wait----使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 

 

调用该方法后当前线程进入睡眠状态,直到以下事件发生: 
1. 其他线程调用了该对象的notify方法 
2. 其他线程调用了该对象的notifyAll方法 
3. 其他线程调用了interrupt中断该线程 
4. 时间间隔到了 
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常

notify----唤醒在该对象上等待的某个线程

notifyAll----唤醒在该对象上等待的所有线程

toString----转换成字符串,一般子类都有重写,否则打印句柄

5. Java的四种引用,强弱软虚,用到的场景。

http://droidyue.com/blog/2014/10/12/understanding-weakreference-in-java/       参考本链接中的内容。

6. Hashcode的作用。

1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的

2、如果两个对象equals相等,那么这两个对象的HashCode一定也相同

3、如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写

4、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

作用如下:

 

1、假设内存中有0 1 2 3 4 5 6 7 8这8个位置,如果我有个字段叫做ID,那么我要把这个字段存放在以上8个位置之一,如果不用HashCode而任意存放,那么当查找时就需要到8个位置中去挨个查找

2、使用HashCode则效率会快很多,把ID的HashCode%8,然后把ID存放在取得余数的那个位置,然后每次查找该类的时候都可以通过ID的HashCode%8求余数直接找到存放的位置了

3、如果ID的 HashCode%8算出来的位置上本身已经有数据了怎么办?这就取决于算法的实现了,比如ThreadLocal中的做法就是从算出来的位置向后查找第 一个为空的位置,放置数据;HashMap的做法就是通过链式结构连起来。反正,只要保证放的时候和取的时候的算法一致就行了。

4、如果ID的 HashCode%8相等怎么办(这种对应的是第三点说的链式结构的场景)?这时候就需要定义equals了。先通过HashCode%8来判断类在哪一 个位置,再通过equals来在这个位置上寻找需要的类。对比两个类的时候也差不多,先通过HashCode比较,假如HashCode相等再判断 equals。如果两个类的HashCode都不相同,那么这两个类必定是不同的。

举个实际的例子Set。我们知道Set里面的元素是不可以重复的,那么如何做到?Set是根据equals()方法来判断两个元素是否相等的。比方 说Set里面已经有1000个元素了,那么第1001个元素进来的时候,最多可能调用1000次equals方法,如果equals方法写得复杂,对比的 东西特别多,那么效率会大大降低。使用HashCode就不一样了,比方说HashSet,底层是基于HashMap实现的,先通过HashCode取一 个模,这样一下子就固定到某个位置了,如果这个位置上没有元素,那么就可以肯定HashSet中必定没有和新添加的元素equals的元素,就可以直接存 放了,都不需要比较;如果这个位置上有元素了,逐一比较,比较的时候先比较HashCode,HashCode都不同接下去都不用比了,肯定不一 样,HashCode相等,再equals比较,没有相同的元素就存,有相同的元素就不存。如果原来的Set里面有相同的元素,只要HashCode的生 成方式定义得好(不重复),不管Set里面原来有多少元素,只需要执行一次的equals就可以了。这样一来,实际调用equals方法的次数大大降低, 提高了效率。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值