java面试-基础语法与面向对象

简介: 本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。

1.1 重载与重写的区别

  • 重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
  • 重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
  • 重载在编译阶段,由编译器根据传递给方法的参数来区分方法,例如
    MyObject obj = ...
    obj.test(123);   // 应该是调用 test(int x) 这个方法
    obj.test("abc"); // 应该是调用 test(String x) 这个方法
    
  • 而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法,例如
    Super obj = ...
    obj.test();     // 到底是调用父类,还是子类的 test 方法,必须检查引用对象的实际类型才能确定
    
  • 有没有发生重写,可以使用 @Override 来检查
    重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符
    重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常
    重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类
    

    1.2 == 与 equals 的区别

  • 对于基本类型,== 是比较两边的值是否相同
  • 对于引用类型,== 是比较两边的引用地址是否相同,用来判断是否引用着同一对象
  • equals 要看实现
    • Object.equals(Object other) 的内部实现就是 ==,即判断当前对象和 other 是否引用着同一对象
    • 比如 String,它的内部实现就是去比较两个字符串中每个字符是否相同,比较的是内容
    • 比如 ArrayList,它的内部实现就是去比较两个集合中每个元素是否 equals,比较的也是内容
      // Java 示例
      String a = new String("text");
      String b = new String("text");
      System.out.println(a == b);       // false(地址不同)
      System.out.println(a.equals(b));  // true(内容相同)
      
      image.png

      1.3 String,StringBuilder 和 StringBuffer 的区别

  • 它们都可以用来表示字符串对象
  • String 表示的字符串是不可变的,而后两者表示的字符串是内容可变的(可以增、删、改字符串里的内容)
    image.png
// 示例:String 的不可变性
String s1 = "hello";
s1 += " world";  // 创建新对象 "hello world",原对象 "hello" 仍在内存中

// 示例:StringBuilder 的修改
StringBuilder sb = new StringBuilder("hello");
sb.append(" world");  // 直接修改为 "hello world",无新对象生成
  • StringBuilder 不是线程安全的,StringBuffer 是线程安全的,而 String 也算是线程安全的
    image.png
// 示例:StringBuffer 的同步方法
StringBuffer buffer = new StringBuffer();
buffer.append("A");  // 内部加锁,保证多线程安全

image.png

// 性能测试示例(单线程)
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
   
    sb.append(i);  // 耗时约 5ms
}

StringBuffer sbf = new StringBuffer();
for (int i = 0; i < 100000; i++) {
   
    sbf.append(i);  // 耗时约 15ms(同步开销)
}

适用场景

  • 大部分场景下使用 String 就足够了
  • 如果有大量字符串拼接的需求,建议用后两者,此时
    • 此字符串对象需要被多线程同时访问,用 StringBuffer 保证安全
    • 此字符串对象只在线程内被使用,用 StringBuilder 足够了
      另外针对 String 类是 final 修饰会提一些问题,把握下面几点
  • 本质是因为 String 要设计成不可变的,final 只是条件之一
  • 不可变的好处有很多:线程安全、可以缓存等

    4.Java 中的异常

    image.png
    image.png
    image.png
    image.png
// 自定义 Checked 异常
class PaymentFailedException extends Exception {
   
    public PaymentFailedException(String message) {
   
        super(message);
    }
}
// 自定义 Unchecked 异常
class InvalidInputException extends RuntimeException {
   
    public InvalidInputException(String field) {
   
        super("字段 " + field + " 值非法");
    }
}

image.png

  • 常见的非检查异常有
    • 空指针异常
    • 算术异常(例如整数除零)
    • 数组索引越界异常
    • 类型转换异常
相关文章
|
1月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
129 14
|
1月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
60 13
|
8天前
|
运维 Cloud Native Java
postman发起post请求遇到报错:java.io.FileNotFoundException (文件名、目录名或卷标语法不正确。)
遇到bug报错,多猜可能的原因,控制变量反复测试,直至找到问题的关键,然后再思考如何解决或者回避。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来
|
2月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
106 16
|
2月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
102 9
|
7月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
4月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
4月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
4月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
121 4
|
5月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
214 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等