JAVA基础常见问题

final,finally,finalize的区别
  1. final:修饰类时,类不能被继承,修饰方法时该方法不能被子类重写,修饰变量时该变量不能被修改
  2. finally:用于定义一个代码块,通常于try-catch一起使用,无论代码是否抛出异常都会被执行
  3. finalize:用于垃圾回收机制,不需要显式的调用finalize方法,而是由垃圾回收机制自动调用
equals 与==区别

==用于比较值是否相等,equals是方法比较对象是否相等

重载和重写的区别
  1. 重载:在同一个类中,可以有多个方法名相同但参数类型,个数,循序不同的方法
  2. 重写:子类中对父类的方法进行重写
两个对象 hashCode()相同,则equals()否也一定为true?

不一定,有哈希冲突

抽象类和接口有什么区别
  1. 一个类只能继承一个抽象类,可以继承多个接口
  2. 抽象类有构造函数,接口没有
  3. 抽象类可以包含非抽象方法
BIO、NIO、AIO有什么区别

他们三者都是Java中常用的I/O模型,我们从以下三个维度进行对比:

  1. 阻塞与非阻塞:
    1. BIO是阻塞式I/O模型,线程会一直被阻塞等待操作完成。
    2. NIO是非阻塞式I/O模型,线程可以去做其他任务,当I/O操作完成时得到通知。
    3. AIO也是非阻塞式/O模型,不需要用户线程关注I/O事件,由操作系统通过回调机制处理。
  2. 缓冲区:
    1. BIO使用传统的字节流和字符流,需要为输入输出流分别创建缓冲区。
    2. NIO引入了基于通道和缓冲区的I/O方式,使用一个缓冲区完成数据读写操作。
    • 。AIO则不需要缓冲区,使用异步回调方式进行操作。
  3. 线程模型:
  4. BIO采用一个线程处理一个请求方式,面对高并发时线程数量急剧增加,容易导致系统崩溃
  5. NIO采用多路复用器来监听多个客户端请求,使用一个线程处理,减少线程数量,提高系统性能
  6. AIO依靠操作系统完成I/O操作,不需要额外的线程池或多路复用器。

综上所述,BlO、NIO、AlO的区别主要在于阻塞与非阻塞、缓冲区和线程模型等方面。根据具体应用场景选择合适的I/O模型可以提高程序的性能和可扩展性。

String,Stringbuffer,StringBuilder的区别

String不可变、线程安全, StringBuffer线程安全、可变,StringBuilder线程不安全、可变性能更高。

Java中的基本数据类型有哪些?它们的大小是多少?
  1. 整数类型:
    1. byte:1字节
    2. short:2字节
    3. int:4字节
    4. long:8字节
  2. 浮点数据类型:
    1. float:4字节
    2. double:8字节
  3. 字符类型:
    1. char:2字节
  4. 布尔类型:
    1. boolean:1位
Comparator与Comparable有什么区别

Comparator和Comparable都是Java中用于对象排序的接口,它们之间有一些关键的区别。
Comparable接口是在对象自身的类中实现的,它定义了对象的自然排序方式。一个类实现了Comparable接口后,可以使用compareTo方法来比较当前对象和其他对象的大小关系。这个接口只能在对象自身的类中实现,不需要额外的比较器。
Comparator接口是一个独立的比较器,它可以用于对不同类的对象进行排序。Comparator接口允许在对象类之外创建一个单独的比较器类或匿名类,并使用它来定义对象的排序规则。比较器通过实现compare方法来比较两个对象的大小关系。
因此,主要区别如下:

  • Comparable接口是在对象自身的类中实现,定义了对象的自然排序方式。
  • Comparator接口是一个单独的比较器,定义了用于排序的规则,可以用于不同类的对象排序。. Comparable是内部排序,对象的类必须实现Comparable接口才能进行排序。
  • Comparator是外部排序,可以独立定义排序规则,并与任何类的对象一起使用。

在使用时,如果需要对对象的默认排序进行操作,可以实现Comparable接口。如果需要对不同类的对象进行排序,或者需要定义多种不同的排序规则,可以使用Comparator接口。

String类能被继承吗,为什么

不能,String是被关键字final关键字修饰

Java中变量和常量有什么区别
  • 变量可以在程序执行中改变
  • 变量会在内存中占一块空间,常量在编译时被替换为对于的值
int和Integer的区别
  • int是基本数据类型,Integer是对象
  • int不能为空,Integer可以为空
  • int的值赋给Integer这个过程称为装箱,
  • int空间小、速度快,Integer空间大,速度快
说说你对Integer缓存的理解

Integer类对于一定范围的整数值进行缓存。这意味着当创建一个Integer对象并赋值为在此范围内的整数时,会直接从缓存中读取

Java中的异常处理机制是怎样的 

异常是在程序执行过程中可能出现的错误或意外情况。它们通常表示了程序无法正常处理的情况,如除零错误、空指针引用、文件不存在等。
Java中的异常处理机制通过使用try-catch-finally语句块来捕获和处理异常。具体的处理过程如下:

  1. 使用try块包裹可能会抛出异常的代码块。一旦在try块中发生了异常,程序的控制流会立即跳转到与之对应的catch块。
  2. 在catch块中,可以指定捕获特定类型的异常,并提供相应的处理逻辑。如果发生了指定类型的异常,程序会跳转到相应的catch块进行处理。一个try块可以有多个catch块,分别处理不同类型的异常。
  3. 如果某个catch块成功处理了异常,程序将继续执行catch块之后的代码。
  4. 在catch块中,可以通过throw语句重新抛出异常,将异常交给上一级的调用者处理。
  5. 可以使用finally块来定义无论是否发生异常都需要执行的代码。finally块中的代码始终会被执行,无论异常是否被捕获。通过合理使用异常处理机制,可以使程序更具健壮性和容错性。在处理异常时,应根据具体情况选择是恢复正常执行、报告错误给用户,还是终止程序运行。同时,应避免过度捕获异常和不处理异常导致的问题,以及使用异常替代正常程序流程控制的做法。 
说说反射用途及实现原理

反射是指在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。

Java 创建对象有几种方式
  1. 使用new关键字
  2. 使用反射
  3. 使用clone方法
  4. 使用反序列化
如何实现线程的同步
  1. 使用synchonized关键字
  2. 使用ReentrantLock
  3. 使用wait(),notify(),notityAll方法
什么是守护线程?与普通线程的区别

守护线程是一种比较低级别的线程,一般用于为其他类别线程提供服务,因此当其他线程都退出时,它也就没有存在的必要了。例如,JVM(Java 虚拟机)中的垃圾回收线程。

Java中的集合框架有哪些核心接口
  1. Collection接口:是所有集合类的根接口
  2. List接口:有序集合,允许重复元素
  3. set接口:不允许重复元素的集合
  4. Queue接口:表示一个先进先出的接口
  5. Map接口:用于存储键值对,不属于 Collection 接口的子接口
ArrayList和LinkedList有什么区别 
  1. ArrayList使用数组来存储,LinkedList使用双向链表存储
  2. ArrayList查询快,LinkedList插入删除快
  3. ArrayList空间大,LinkedList空间小
HashMap和Hashtable有什么区别
  1. Hashtable是线程安全的
  2. Hashtable不允许键或值为null
  3. Hashtable继承自Dictionary类,而HashMap则继承自AbstractMap类并实现了接口
  4. Hashtable在创建时必须指定容器大小,默认11。HashMap不指定大小,采用两倍扩容机制
什么是Java的序列化

Java 的序列化是指将对象的状态转换为字节流的过程,以便将对象持久化存储(如保存到文件或数据库)或通过网络进行传输。反序列化则是将字节流恢复为对象的过程。

说说你对内部类的理解
  1. 成员内部类
  2. 静态内部类
  3.  局部内部类
  4. 匿名内部类
说说你对lambda表达式使用场景
  1. 集合操作
  2. 并行编程
  3. 事件驱动模型
说说你对泛型的理解

Java 泛型提供了一种编写类型安全、可重用代码的方式。通过使用泛型类、接口和方法,可以实现更灵活和通用的代码设计。虽然泛型带来了一些限制和复杂性,但它们在提升代码质量和可维护性方面具有重要作用。理解泛型的基本概念和使用场景,对于编写高质量的 Java 代码至关重要。

notify()和 notifyAll()有什么区别 

 notify()唤醒单个线程,不确定那个。notityAll唤醒所有线程

静态内部类与非静态内部类有什么区别
Strings 与new String有什么区别

首先,使用字符串字面量赋值给变量时,Java会使用字符串常量池来管理字符串对象,可以提高性能和节省内存。而使用newString创建的字符串对象则在堆内存中独立分配内存空间,每次调用都会创建一个新的对象,因此内存消耗更大。
其次,使用字符串字面量赋值给变量的字符串是不可变的,即不能改变其内容。而使用new String创建的字符串对象是可变的,可以通过调用方法或者使用赋值运算符修改其内容。
最后,使用字符串字面量赋值给变量的字符串比较时,如果多个变量引用相同的字符串字面量,则它们实际上引用的是同一个对象,因此比较它们的引用时将返回true。而使用new String创建的字符串对象,即使内容相同,它们也是不同的对象,因此比较它们的引用时将返回false。

深拷贝和浅拷贝区别

浅拷贝是拷贝对象的引用,深拷贝拷贝对象实例

谈谈自定义注解的场景及实现
  1. 配置和扩展框架
  2. 运行时检查
  3. 规范约束
什么是值传递和引用传递
  1. 值传递:将实际参数的值复制一份传递给形式参数
  2. 引用传递:将实际参数的引用传递给形式参数
Java支持多继承么,为什么 

不支持,因为有接口的存在,

构造器是否可被重写

不能重写

char型变量能存贮一个中文汉字吗

可能会出现问题char占有2字节,中文字符栈3字节

如何实现对象克隆

浅拷贝,深拷贝

for-each与常规for循环的效率区别

大多数情况下,常规for循环的执行效率比for-each循环高

常规for循环具有更大的灵活性

for-each更加简洁易懂

说说你对懒汉模式和饿汉模式的理解

首次使用时才进行对象初始化,避免不必要的资源消耗,有线程安全问题

内加载时就对象初始化,线程安全,浪费一些资源

有哪些常见的运行时异常
  1. 空指针异常:当应用程序尝试使用null 对象时抛出。
  2. 数组越界异常:当应用程序尝试访问数组元素的时候,数组下标超出了数组的范围。
  3. 类转换异常:当应用程序尝试将一个对象强制转换为不是其实例的子类时抛出。
  4. 非法参数异):当应用程序传递了一个无效或不合法的参数时抛出。
  5. .非法状态异常:当应用程序调用了一个不合适的方法或处于不正确的状态时抛出。
2个不相等的对象有可能具有相同hashCode吗 

有可能

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值