Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。
以下是几个面试技巧:
1. 复习核心概念:回顾 Java 的核心概念,如面向对象编程、类和对象、继承和多态、异常处理、集合框架等。确保对这些基础知识有清晰的理解。
2. 熟悉常见问题:预测并准备常见的面试问题,如 "什么是 Java 的封装、继承和多态?","什么是抽象类和接口?它们的区别是什么?" 等。熟悉这些问题的答案,以便能够流利、清晰地回答面试官的提问。
3. 编码实践:练习编写一些简单的 Java 代码,以加深对基础概念的理解。尝试解决一些常见的编程问题,如逆序字符串、查找数组中的最大值等。这将有助于您在面试中展示自己的编码能力。
4. 项目经验准备:复习您在 Java 开发方面的项目经验。准备一些项目细节和亮点,强调您在项目中所承担的角色和技术贡献。面试官通常会关注您的项目经验,因此务必能够清晰而有条理地介绍您的项目经历。
5. 注意优缺点:在回答问题时,尽量不仅停留在正确的答案上,还要深入思考并表达特定功能、概念或语言特性的优缺点。面试官通常会更关注您的思考能力和对技术的全面理解。
6. 积极参与:在面试中,积极与面试官互动。表达自己的观点和思考,提出问题或寻求澄清。这不仅能展示您的积极性和好奇心,还能促进面试的互动和对话。
7. 准备好问题:在面试结束时,通常会给您提供机会提问。为了展示您对岗位和公司的兴趣,准备一些相关问题,例如关于公司文化、技术栈、团队合作等方面的问题。
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!
目录
八、算法: 给定—棵二叉树,找到这棵树最中最后—行中最左边的值
(一面题)
一、Java Object类有哪些方法,分别作用
Java中的
Object
类是所有类的超类(父类),任何类都直接或间接地继承自Object
类。因此,Object
类中的方法对所有Java对象都是可用的。下面是一些最常用的Object
类方法及其作用:
1. public boolean equals(Object obj)
- 检查调用该方法的对象是否等于参数传递的对象。默认实现是比较两个对象的内存地址(即它们是否为同一对象),但很多类重写此方法以提供有意义的相等性比较。
- Object中的equals方法比较的是对象的地址是否相同; equals方法可以被重写,重写后equals方法比较的是两个对象值是否相同。
- 在Java规范中,对equals方法的使用必须遵循以下几个规则:
- 自反性:对于任何非空引用值X,X.equals(X)都应返回true;
- 对称性:对于任何非空引用值X和Y,当且仅当 Y.equals(X)返回true时, X.equals(Y)也应该返回true;
- 传递性:对于任何非空引用值X,Y,Z,如果X.equals(Y)返回true,并且Y.equals(Z)返回true,那么X.equals(Z)应返回true;
- 一致性:对于任何非空引用值X和Y,多次调用 X.equals(Y)始终返回true或始终返回false。
- equals和 ==的区别
- equals比较的是两个对象值是否相等,如果没有被重写,比较的是对象的引用地址是否相同;
==用于比较基本数据类型的值是否相等,或比较两个对象的引用地址是否相等;
String hello = new String("hello"); String hello1 = new String("hello"); System.out .println(hello.equals(hello1)); //重写了 ,比较的是值 ,输出结果为true System.out .println(hello == hello1); //比较的是引用地址 ,输出结果为false int age = 10; int age2 = 10; //比较基本类型的值 System.out.println(age == age2); //输出为true
2. public int hashCode()
- 返回调用对象的哈希码值。默认情况下,这个方法返回对象的内存地址转换成的整数值。重写
equals()
时通常也需要重写hashCode()
,以便保持equals()
为true
的两个对象具有相同的哈希码。
3. public String toString()
- 返回对象的字符串表示形式。
Object
类的默认实现返回一个由类名,符号“@”以及对象哈希码的无符号十六进制表示组成的字符串。通常,类会重写这个方法,提供更有意义的信息。- 比如System.out.print(person)等价于System.out.print(person.toString()); //默认返回对象的地址
getClass().getName是返回对象的全类名, Integer.toHexString(hashCode())是以16进制无符号整数形式返回此哈希码的字符串表示
形式。
4. public final native Class<?> getClass()
- 返回运行时类的
Class
对象。Class
类的实例表示正在运行的Java应用程序中的类和接口。
5. protected native Object clone() throws CloneNotSupportedException
- 创建并返回调用该方法的对象的一个副本。
- 对象的类必须实现
Cloneable
接口,否则抛出CloneNotSupportedException
。clone生成的新对象与原对象的关系,区别在于两个对象间是否存在相同的引用或对应的内存地址是否存在共用情况;若存在,则为 “浅复
制” ,否则为 “深复制” ,“深复制”时需要将共同关联的引用也复制完全。
6. public void finalize()
- 当垃圾收集器确定不存在对该对象的更多引用时,由垃圾收集器在垃圾回收前调用此方法。子类可以重写
finalize()
以进行清理工作(诸如释放资源等)。
7. protected void finalize() throws Throwable
- 虽然标记为
protected
,但这是对finalize()
方法的解释。从Java 9开始,已经不再推荐使用finalize()
方法,取而代之的是使用Cleaner
和PhantomReference
这样的替代方案。
8. public final void wait()
throws InterruptedException
- 导致当前线程等待,直到另一个线程调用此对象的
notify()
方法或notifyAll()
方法。- 调用wait方法的当前线程一定要拥有对象的监视器锁。
- wait方法会把当前线程放在对应的等待队列中,在这个对象上的所有同步请求都不会得到响应。线程调用将不会调用线程,线程一直处于休眠状态。要注意的是, wait方法把当前线程放置到这个对象的等待队列中,解锁也仅仅是在这个对象上;当前线程在等待过程中仍然持有其他对象的锁。
- 如果当前线程被其他线程在当前线程等待之前或正在等待时调用了interrupt()中断了,那么就会抛出InterruptException异常。
- 为什么wait方法一般要写在while循环里?
- 在某个线程调用notify到等待线程被唤醒的过程中,有可能出现另一个线程得到了锁并修改了条件使得条件不再满足;只有某些等待 线程的条件满足了,但通知线程调用了notifyAll有可能出现“伪唤醒”。
- wait方法和sleep方法的区别?
- wait方法属于object类,当调用wait方法时,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify方法后 本线程才会进入对象锁定池,准备获取对象锁进入运行状态。
- sleep方法属于thread类,sleep方法导致程序暂停执行指定的时间,让出CPU给其他线程,但是它的监控状态依然保持,当指定的时间到了又会恢复运行状态。在调用sleep方法过程中,线程不会释放对象锁。
9. public final native void notify()
- 唤醒正在等待对象监视器的单个线程。
唤醒可能等待该对象的对象锁的其他线程。由JVM(与优先级无关)随机挑选一个处于wait状态的线程。
在调用notify()之前,线程必须获取该对象的对象锁,执行完notify()方法后,不会马上释放锁,直到退出synchronized代码块,当前线程 才会释放锁; notify一次只能随机通知一个线程进行唤醒。