万字长文,62道Java核心面试题,一次性打包送给积极向上的你(5)

简介: 万字长文,62道Java核心面试题,一次性打包送给积极向上的你

42、如何在 Java 中对自定义对象的集合进行排序?


需要对自定义对象的类实现 Comparable 接口,重写 compareTo(T obj) 方法,该方法在排序的时候会被调用进行排序。


关于 Comparable 和 Comparator 接口更详细的内容,可以参照我之前写了另外一篇文章:


一文彻底搞懂Java中的Comparable和Comparator


43、什么是内部类?


我们可以在一个类中定义一个类,这个类被称为内部类。内部类可以访问外部类的所有变量和方法,内部类中不能有任何静态变量。


44、什么是匿名内部类?


没有名称的内部类称为匿名内部类,它通过单个语句进行定义和实例化,总是需要扩展一个类或者实现一个接口。


由于匿名内部类没有名称,所以无法为匿名内部类定义构造方法。


45、什么是 Java 中的 Classloader(类加载器)?


当我们要访问任何类时,都需要通过 Java Classloader 将该类的字节码加在到内存当中,可以通过继承 ClassLoader 并重写 loadClass(String name) 方法来创建自定义的类加载器。


46、有哪些不同的类加载器?


Bootstrap 类加载器,用来加在 JDK 的内部类,比如说 rt.jar。


Extensions 类加载器,它从 JDK 扩展目录(JAVA_HOME/lib/ext)中加载类。


System 类加载器,它从当前类路径加载类。


47、什么是三元运算符?


三元运算符是 if-then-else 语句的一个替换,示例如下:


result = testStatement ? value1 : value2;


48、super 关键字有什么用?


当在子类中重写了父类方法时,可以通过 super 关键字访问父类方法。


也可以使用 super 关键字在子类构造方法中调用父类构造方法,它必须是构造方法中的第一条语句。


public class SuperClass {
  public SuperClass(){
  }
  public SuperClass(int i){}
  public void test(){
  System.out.println("父类的测试方法");
  }
}


来看子类中如何使用 super 关键字:


public class ChildClass extends SuperClass {
  public ChildClass(String str){
  // 调用父类的构造方法
  super();
  // 调用子类的 test 方法
  test();
  // 使用 super 关键字调用父类的 test 方法
  super.test();
  }
  @Override
  public void test(){
  System.out.println("child class test method");
  }
}


49、什么是 break,什么是 continue?


我们可以使用 break 关键字终止 for、while、do-while 循环;可以在 switch 语句中使用 break 退出 case 条件。


我们可以使用 continue 关键字在 for、while、do-while 循环跳过当前迭代;甚至可以使用带有标签的 continue 语句来跳过最外层循环的当前迭代。


50、什么是 this 关键字?


this 关键字提供对当前对象的引用,主要用于确保使用了当前对象的变量,而不是具有相同名称的局部变量。


//constructor
public Point(int x, int y) {
    this.x = x;
    this.y = y;
}


还可以使用 this 关键字在构造方法中调用其他构造方法:


public Rectangle() {
    this(0, 0, 0, 0);
}
public Rectangle(int width, int height) {
    this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}


关于 this 关键字更详细的内容,可以参照我之前写了另外一篇文章:


我去,你竟然还不会用 this 关键字


51、什么是默认的构造方法?


一个类的无参构造方法被称为默认构造方法。当我们没有为一个类定义构造方法时,Java 编译器会自动为该类创建一个默认的无参构造方法。如果定义了其他构造方法,编译器就不会在为我们创建默认构造方法了。


52、try 块可以没有 catch 吗?


是的,可以直接使用 try-finally,而不需要 catch 捕获异常。


53、什么是垃圾回收?


垃圾回收(Garbage Collection,简称 GC)会查看堆内存,识别正在使用和未使用的对象,以及会自动删除未使用的对象,用来释放内存。


54、什么是序列化和反序列化?


我们可以把一个 Java 对象转化成一个数据流,这被称为序列化。一旦对象被转化为数据流后,就可以将其保存到文件或者通过网络套接字发送。


如果一个对象实现了 Serializable 接口,就可以使用 java.io.ObjectOutputStream 将对象写入文件。


将数据流再转化为 Java 对象被称为反序列化。


55、如何通过命令提示符运行 jar 文件?


可以通过 java 命令运行 jar 文件,但需要 jar 文件中有 main 方法。


56、System 类有什么用?


System 类是 Java 的一个核心类,比较常用的就是 System.out.println()。


System 类是 final 的,因此我们不能通过继承来重写它的方法,System 类没有提供任何 public 的构造方法,因此无法实例化,它的所有方法都是 static 的。


57、什么是 instanceof 关键字?


我们可以使用 instanceof 关键字检查对象是否属于一个类。


public static void main(String args[]){
  Object str = new String("沉默王二");
  if(str instanceof String){
  System.out.println("字符串值为:" + str);
  }
  if(str instanceof Integer){
  System.out.println("数字的值是:" + str);
  }
}


58、可以在 switch 中使用字符串吗?


Java 7 改进的一个功能就是允许在 switch 语句中使用字符串。


关于 switch 更详细的内容,可以参照我之前写了另外一篇文章:


我去,你写的 switch 语句也太老土了吧


59、Java 是按值传递还是按引用传递?


可以很确定地说,Java 是按值传递的。


关于这个问题,可以参照我之前写了另外一篇文章:


面试官:兄弟,说说Java到底是值传递还是引用传递


60、堆(heap)和栈(stack)有什么区别?


堆内存被应用程序的所有部分使用,而栈内存仅由执行线程使用。

当我们创建对象时,它始终存储在堆空间上;栈仅存储该对象的引用,栈内存还可以存储局部的基本类型数据变量。

栈的内存管理方式是 LIFO(后进先出)形式,而堆的内存管理方式更复杂。


61、Java 编译在 JDK 中,还是 JRE,还是 JVM 中?


Java 编译器的任务是将 Java 源代码转换为字节码,可以通过 javac 命令执行,因此它在 JDK 中,JRE 中不需要它。


62、下面这段程序输出什么?


public class Test {
  public static String toString(){
  System.out.println("测试 toString 方法有没有被调用");
  return "";
  }
  public static void main(String args[]){
  System.out.println(toString());
  }
}



这段代码无法编译通过,因为 java.lang.Object 中的 toString() 方法不是 static 的,它无法被 static 修饰的方法重写。


那下面这段代码呢?


public class Test {
    public static String foo(){
        System.out.println("测试 foo 方法有没有被调用");
        return "";
    }
    public static void main(String args[]){
        Test obj = null;
        System.out.println(obj.foo());
    }
}



这段代码会输出 测试 foo 方法有没有被调用,没有出现 NullPointerException。为什么呢?


命名 obj 为 null 啊,通过 obj 调用 foo() 方法的时候应该抛出 NullPointerException 异常才对啊!


之所以没有抛出异常,是因为 Java 编译器对这段代码做出了优化,因为 foo() 方法是静态方法,所以 obj.foo() 会被优化为 foo(),所以就不会抛出异常了。


来看一下这段代码的字节码就明白了:


public class Test {
    public Test() {
    }
    public static String foo() {
        System.out.println("测试 foo 方法有没有被调用");
        return "";
    }
    public static void main(String[] args) {
        Test obj = null;
        System.out.println(foo());
    }
}
相关文章
|
2月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
5月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
336 0
|
5月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
289 3
|
4月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
452 0
|
4月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
227 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
2月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
5月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
3063 48
|
5月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
168 5
|
5月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
264 5
下一篇
oss云网关配置