上海某海外视频平台Android高级工程师视频一面
问的问题比较细,有很多小细节在里面,平时真不一定会注意到,做一个备忘:
1.Object类里面有哪些方法?
Object 类是 Java 中所有类的根类,它定义了一些基本方法,供所有类继承和重写
1. 常用方法
1.1 equals(Object obj)
比较两个对象是否“相等”。默认实现是比较对象的引用地址是否相同,
可以在子类中重写实现内容比较。
默认行为:判断引用是否相同。
重写场景:比较内容相等(如 String 类)。
示例:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2)); // true
1.2 hashCode()
返回对象的哈希码,用于散列存储(如 HashMap、HashSet 等)。
默认实现基于对象地址,常与 equals 一起重写。
约定
如果两个对象通过 equals 方法相等,它们的 hashCode 必须相等。
如果重写 equals,必须重写 hashCode。
示例:
Object obj = new Object();
System.out.println(obj.hashCode()); // 输出哈希码
1.3 toString()
返回对象的字符串表示形式。默认实现是对象的类名和内存地址,
可以在子类中重写以提供更有意义的描述。
默认格式:类名@十六进制哈希值
这个 "十六进制哈希值" 是通过调用 hashCode() 方法的结果转换成十六进制表示得来的,
默认hashcode()实现是基于对象的内存地址根据哈希算法计算得出的,
只不过又将结果转换为了16进制
常用场景:日志输出、调试。
示例:
java复制代码Object obj = new Object();
System.out.println(obj.toString()); // 类名@哈希码
// 重写示例
@Override
public String toString() {
return "Custom String Representation";
}
1.4 clone()
clone()方法
clone是Java提供的一种方法,用来复制对象。
当你调用一个对象的 clone() 方法时,它会创建一个新的对象。
为什么要实现cloneable接口
默认的 clone() 方法由 Object 类定义。如果一个类希望支持克隆,
它需要实现 Cloneable 接口,告诉 JVM:**“我支持克隆,
你可以调用我的 clone() 方法。”** 否则,调用 clone() 方法时,
会抛出 CloneNotSupportedException 异常。
Cloneable 是一个标记接口,不包含任何方法,只起到一个标记作用。
默认行为:浅拷贝
浅拷贝是 clone() 方法的默认行为,它的特点是:
1、基本数据类型——会直接复制值
2、引用数据类型——只会复制引用,说白了就是只会复制地址。
通俗地说:
浅拷贝创建的新对象的字段内容看起来一样,但是如果字段是引用类型,
它们指向的是同一个内存地址。
改变引用类型字段的内容,会影响原对象和克隆对象。
如何实现深拷贝?
深拷贝是指,不仅要复制对象本身,还要复制对象引用类型字段指向的对象。
说白了就是克隆对象和原对象完全独立,修改一个不会影响另一个。
1.5 finalize()
在垃圾回收前调用,主要用于释放资源。不推荐使用,因为垃圾回收时间不确定。
不推荐的原因:垃圾回收不保证及时性,finalize 可能不被调用。
示例:
@Override
protected void finalize() throws Throwable {
System.out.println("Finalize called");
}
2. 线程相关方法
2.1 wait()
让当前线程进入等待状态,直到另一个线程调用 notify() 或 notifyAll()。
必须在同步块(synchronized)中使用。
重载方法
wait():无限等待。
wait(long timeout):等待指定时间。
wait(long timeout, int nanos):等待精确时间。
2.2 notify()
唤醒在当前对象上等待的一个线程(随机唤醒一个)。
2.3 notifyAll()
唤醒在当前对象上等待的所有线程。
3. 其他方法
3.1 getClass()
返回对象的运行时类(Class 对象),用于反射——想要使用反射的话,
第一步就是先获取类对象。
示例:
Object obj = new Object();
System.out.println(obj.getClass()); // class java.lang.Object
3.2 registerNatives()
这是 Object 类中的一个本地方法,用于 JVM 的内部初始化,不需要手动调用。
总结:Object 类的方法清单
方法名 功能描述
equals(Object obj) 判断对象是否相等(默认是比较引用地址)。
hashCode() 返回对象的哈希码(默认基于内存地址)。
toString() 返回对象的字符串表示(默认是类名@哈希值)。
clone() 返回对象的浅拷贝。
finalize() 在垃圾回收前调用(不推荐使用)。
wait() 使线程等待,直到被唤醒。
notify() 唤醒在当前对象上等待的一个线程。
notifyAll() 唤醒在当前对象上等待的所有线程。
getClass() 返回对象的运行时类(反射时常用)。
面试准备提示
equals 和 hashCode 的关系?
如果两个对象相等(equals 返回 true),它们的 hashCode 必须相等。(这是一种约定)
hashCode 不相等时,equals 一定不相等。
toString 在实际开发中的用途?
用于调试和日志输出,重写 toString 提供更有意义的信息。
wait() 和 sleep() 的区别?
wait() 释放锁,必须在同步块中使用。
sleep() 不释放锁,不需要同步块。
finalize 为什么不推荐?
垃圾回收时间不可控,finalize 可能导致资源泄漏或性能问题。
了解这些方法的用法、注意事项及典型面试问题,能帮助你在实际开发和面试中更加游刃有余
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/2301_79819426/article/details/143928329
2.GC Roots对象有哪些?
栈帧中的局部变量和参数
这类对象属于上下文中的对象。当线程在执行方法时,
它会将方法打包成一个栈帧压入到栈中去执行,
方法里用到的局部变量会存放到栈帧的本地变量表中。
只要方法还在执行,还没有出栈,就以为这些本地变量表中的对象还会被访问,
GC 就不能回收。所以,这类对象可以作为 GC Roots。
例如,一个方法中定义的局部变量的引用,如果该方法正在执行中,
那么这些引用的对象会被认为是存活的:
public void test() {
Object obj = new Object(); // 局部变量 obj 引用的对象可能作为 GC Roots
}
方法区常量池引用的对象
常量池中的对象是全局的,它在整个应用程序运行期间是有效的,
所以,作为 GC Roots 也不过分。
例如,字符串常量 "skjava.com" 存在于常量池中,而常量池中的引用也会被视为 GC Roots。
String str = "skjava.com"; // 常量池中的字符串常量
方法区静态变量引用的对象
静态变量属于类级别的变量,它们在整个应用程序生命周期内都存在。
当类被加载时,静态属性被初始化并持有对象的引用。
同时,Class 对象本身是非常难被回收的,只要 Class 对象不回收,静态属性就不能被回收。
public class Test {
public static Object staticObj = new Object(); // staticObj 引用的对象可能作为 GC Roots
}
JNI本地方法栈中引用的对象
Java 可以通过 JNI(Java Native Interface)调用本地代码,
而 JNI 中的本地代码可以持有对 Java 对象的引用,这些引用是不能被回收的。
所以,也会被视为 GC Roots。
Java 虚拟机内部的引用
JVM 内部的一些特殊数据结构也可能包含对对象的引用,
例如,某些 JVM 内部的管理结构、类加载器相关的对象等。这些对象也会作为 GC Roots。
被同步锁持有的对象
使用 synchronized 关键字进行同步的对象,会被视为 GC Roots。
这些对象在同步块或者方法执行期间会被 JVM 保留,防止被垃圾回收。回收了,锁咋搞?
synchronized (lockObject) {
// lockObject 持有锁,被视为 GC Roots
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/smart_an/article/details/145236728
3.GET请求和POST请求有什么区别?还有哪些其他请求
[Java网络安全系列面试题] GET 和 POST 的区别在哪里?_get和post请求面试题-CSDN博客
4.Https对比Http有哪些不同?
JAVA面试题分享九十三:HTTPS和HTTP 原理?_java 面试题 ssl握手-CSDN博客
5.客户端在使用HTTPS方式与Web服务器通信流程是什么?
JAVA面试题分享九十三:HTTPS和HTTP 原理?_java 面试题 ssl握手-CSDN博客
面试官又问了一个很好的问题:为什么客户端还要产生一个密钥?
答:如果客户端不随机产生一个密钥,拿到公钥就可以直接破解发送的数据了。
6.你是怎么做WebView的性能优化的?
秒开WebView?Android性能优化全攻略_android webview优化-CSDN博客
7.除了锁,还有其他线程安全的方式吗?
Java中的线程安全是如何保证的?_java保证线程安全的方式-CSDN博客
8.Http的Response Code有哪些?
Http请求Response Code含义_responsecode-CSDN博客
9.了解LruCache吗?底层数据结构是怎样的?
小程序【面试官的宝典】里面Android基础部分有讲到。
10.Synchonized锁方法和锁this有什么区别?
都是对象锁,没什么本质的不同。