final,finally,finalize的区别
- final:修饰类时,类不能被继承,修饰方法时该方法不能被子类重写,修饰变量时该变量不能被修改
- finally:用于定义一个代码块,通常于try-catch一起使用,无论代码是否抛出异常都会被执行
- finalize:用于垃圾回收机制,不需要显式的调用finalize方法,而是由垃圾回收机制自动调用
equals 与==区别
==用于比较值是否相等,equals是方法比较对象是否相等
重载和重写的区别
- 重载:在同一个类中,可以有多个方法名相同但参数类型,个数,循序不同的方法
- 重写:子类中对父类的方法进行重写
两个对象 hashCode()相同,则equals()否也一定为true?
不一定,有哈希冲突
抽象类和接口有什么区别
- 一个类只能继承一个抽象类,可以继承多个接口
- 抽象类有构造函数,接口没有
- 抽象类可以包含非抽象方法
BIO、NIO、AIO有什么区别
他们三者都是Java中常用的I/O模型,我们从以下三个维度进行对比:
- 阻塞与非阻塞:
- BIO是阻塞式I/O模型,线程会一直被阻塞等待操作完成。
- NIO是非阻塞式I/O模型,线程可以去做其他任务,当I/O操作完成时得到通知。
- AIO也是非阻塞式/O模型,不需要用户线程关注I/O事件,由操作系统通过回调机制处理。
- 缓冲区:
- BIO使用传统的字节流和字符流,需要为输入输出流分别创建缓冲区。
- NIO引入了基于通道和缓冲区的I/O方式,使用一个缓冲区完成数据读写操作。
- 。AIO则不需要缓冲区,使用异步回调方式进行操作。
- 线程模型:
- BIO采用一个线程处理一个请求方式,面对高并发时线程数量急剧增加,容易导致系统崩溃
- NIO采用多路复用器来监听多个客户端请求,使用一个线程处理,减少线程数量,提高系统性能
- AIO依靠操作系统完成I/O操作,不需要额外的线程池或多路复用器。
综上所述,BlO、NIO、AlO的区别主要在于阻塞与非阻塞、缓冲区和线程模型等方面。根据具体应用场景选择合适的I/O模型可以提高程序的性能和可扩展性。
String,Stringbuffer,StringBuilder的区别
String不可变、线程安全, StringBuffer线程安全、可变,StringBuilder线程不安全、可变性能更高。
Java中的基本数据类型有哪些?它们的大小是多少?
- 整数类型:
- byte:1字节
- short:2字节
- int:4字节
- long:8字节
- 浮点数据类型:
- float:4字节
- double:8字节
- 字符类型:
- char:2字节
- 布尔类型:
- 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语句块来捕获和处理异常。具体的处理过程如下:
- 使用try块包裹可能会抛出异常的代码块。一旦在try块中发生了异常,程序的控制流会立即跳转到与之对应的catch块。
- 在catch块中,可以指定捕获特定类型的异常,并提供相应的处理逻辑。如果发生了指定类型的异常,程序会跳转到相应的catch块进行处理。一个try块可以有多个catch块,分别处理不同类型的异常。
- 如果某个catch块成功处理了异常,程序将继续执行catch块之后的代码。
- 在catch块中,可以通过throw语句重新抛出异常,将异常交给上一级的调用者处理。
- 可以使用finally块来定义无论是否发生异常都需要执行的代码。finally块中的代码始终会被执行,无论异常是否被捕获。通过合理使用异常处理机制,可以使程序更具健壮性和容错性。在处理异常时,应根据具体情况选择是恢复正常执行、报告错误给用户,还是终止程序运行。同时,应避免过度捕获异常和不处理异常导致的问题,以及使用异常替代正常程序流程控制的做法。
说说反射用途及实现原理
反射是指在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。
Java 创建对象有几种方式
- 使用new关键字
- 使用反射
- 使用clone方法
- 使用反序列化
如何实现线程的同步
- 使用synchonized关键字
- 使用ReentrantLock
- 使用wait(),notify(),notityAll方法
什么是守护线程?与普通线程的区别
守护线程是一种比较低级别的线程,一般用于为其他类别线程提供服务,因此当其他线程都退出时,它也就没有存在的必要了。例如,JVM(Java 虚拟机)中的垃圾回收线程。
Java中的集合框架有哪些核心接口
- Collection接口:是所有集合类的根接口
- List接口:有序集合,允许重复元素
- set接口:不允许重复元素的集合
- Queue接口:表示一个先进先出的接口
- Map接口:用于存储键值对,不属于
Collection
接口的子接口
ArrayList和LinkedList有什么区别
- ArrayList使用数组来存储,LinkedList使用双向链表存储
- ArrayList查询快,LinkedList插入删除快
- ArrayList空间大,LinkedList空间小
HashMap和Hashtable有什么区别
- Hashtable是线程安全的
- Hashtable不允许键或值为null
- Hashtable继承自Dictionary类,而HashMap则继承自AbstractMap类并实现了接口
- Hashtable在创建时必须指定容器大小,默认11。HashMap不指定大小,采用两倍扩容机制
什么是Java的序列化
Java 的序列化是指将对象的状态转换为字节流的过程,以便将对象持久化存储(如保存到文件或数据库)或通过网络进行传输。反序列化则是将字节流恢复为对象的过程。
说说你对内部类的理解
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
说说你对lambda表达式使用场景
- 集合操作
- 并行编程
- 事件驱动模型
说说你对泛型的理解
Java 泛型提供了一种编写类型安全、可重用代码的方式。通过使用泛型类、接口和方法,可以实现更灵活和通用的代码设计。虽然泛型带来了一些限制和复杂性,但它们在提升代码质量和可维护性方面具有重要作用。理解泛型的基本概念和使用场景,对于编写高质量的 Java 代码至关重要。
notify()和 notifyAll()有什么区别
notify()唤醒单个线程,不确定那个。notityAll唤醒所有线程
静态内部类与非静态内部类有什么区别
Strings 与new String有什么区别
首先,使用字符串字面量赋值给变量时,Java会使用字符串常量池来管理字符串对象,可以提高性能和节省内存。而使用newString创建的字符串对象则在堆内存中独立分配内存空间,每次调用都会创建一个新的对象,因此内存消耗更大。
其次,使用字符串字面量赋值给变量的字符串是不可变的,即不能改变其内容。而使用new String创建的字符串对象是可变的,可以通过调用方法或者使用赋值运算符修改其内容。
最后,使用字符串字面量赋值给变量的字符串比较时,如果多个变量引用相同的字符串字面量,则它们实际上引用的是同一个对象,因此比较它们的引用时将返回true。而使用new String创建的字符串对象,即使内容相同,它们也是不同的对象,因此比较它们的引用时将返回false。
深拷贝和浅拷贝区别
浅拷贝是拷贝对象的引用,深拷贝拷贝对象实例
谈谈自定义注解的场景及实现
- 配置和扩展框架
- 运行时检查
- 规范约束
什么是值传递和引用传递
- 值传递:将实际参数的值复制一份传递给形式参数
- 引用传递:将实际参数的引用传递给形式参数
Java支持多继承么,为什么
不支持,因为有接口的存在,
构造器是否可被重写
不能重写
char型变量能存贮一个中文汉字吗
可能会出现问题char占有2字节,中文字符栈3字节
如何实现对象克隆
浅拷贝,深拷贝
for-each与常规for循环的效率区别
大多数情况下,常规for循环的执行效率比for-each循环高
常规for循环具有更大的灵活性
for-each更加简洁易懂
说说你对懒汉模式和饿汉模式的理解
首次使用时才进行对象初始化,避免不必要的资源消耗,有线程安全问题
内加载时就对象初始化,线程安全,浪费一些资源
有哪些常见的运行时异常
- 空指针异常:当应用程序尝试使用null 对象时抛出。
- 数组越界异常:当应用程序尝试访问数组元素的时候,数组下标超出了数组的范围。
- 类转换异常:当应用程序尝试将一个对象强制转换为不是其实例的子类时抛出。
- 非法参数异):当应用程序传递了一个无效或不合法的参数时抛出。
- .非法状态异常:当应用程序调用了一个不合适的方法或处于不正确的状态时抛出。
2个不相等的对象有可能具有相同hashCode吗
有可能