当前位置: 首页 > news >正文

上海某海外视频平台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有什么区别?

都是对象锁,没什么本质的不同。

相关文章:

  • 短剧系统开发动漫短剧系统源码开发上线小程序app教程
  • K8s中CPU和Memory的资源管理
  • 实验二 Mybatis参数传递方式及特殊SQL操作
  • 钱包开发:技术、功能与安全的深度探索
  • ARM-----数据处理、异常处理、模式切换
  • Fluent-Rocky耦合插件排错(2025R1版)
  • Python 实现的运筹优化系统代码详解(整数规划问题)
  • 用户行为分析系统开发文档
  • [Linux系统编程]进程间通信—管道
  • Spark,HDFS客户端操作
  • 利用line_profiler分析函数运行时间
  • 当编程语言有了人格
  • Scala(三)
  • [leetcode]回溯法
  • 安卓 Java 中比 RxJava 更好用的多线程异步框架 MultithreadingExecutor
  • Kafka 4.0入门到熟练
  • vue3项目技术点总结,vue难点 (适合0-1开发小伙伴)
  • 编译玄铁处理器RISC-V指令测试用例
  • SpringBlade 部署文档
  • 基于Python的CATIA装配体全约束自动化解决方案
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超
  • 古巴外长谴责美国再次将古列为“反恐行动不合作国家”
  • 4台肺癌手术,2名“90后”患者,这届年轻人的肺怎么了?
  • 北京今日白天超30℃晚间下冰雹,市民称“没见过这么大颗的”
  • 国家林草局原党组成员、副局长李春良接受审查调查
  • 泽连斯基批准美乌矿产协议