java面试题

发布时间 2023-05-31 11:43:19作者: coooooookie

一、面向对象的特性有哪些?

  1. 封装(Encapsulation):将数据和方法封装在一个类中,通过访问修饰符控制数据的访问权限,提高程序的安全性和可维护性。

  2. 继承(Inheritance):可以从父类继承属性和方法,避免重复编写代码,简化程序设计和维护。

  3. 多态(Polymorphism):同一种类型的对象,可以以不同的方式处理,实现代码复用和灵活性。

 

二、Java 中重写和重载是什么意思?

  1. 重写(Override):指在子类中重新定义与父类中同名的方法,具有相同的方法名、返回类型和参数列表。重写可以修改方法的实现逻辑,但是不能改变方法的签名。当调用该方法时,会优先执行子类中的方法实现。重写通常用于实现多态特性。

  2. 重载(Overload):指在一个类中定义多个同名的方法,但是方法的参数类型、数量或顺序不同,也称为方法的签名。重载可以让方法名在程序中具有更广泛的应用场景,提高程序的灵活性和可维护性。在进行方法调用时,会根据传入参数的类型和数量匹配到最合适的方法实现。

 

三、构成重载的条件有哪些?

  1. 方法名必须相同。
  2. 参数列表必须不同,可以是参数类型、参数数量或者参数顺序不同。
  3. 方法的返回值类型可以相同也可以不同。
  4. 方法的修饰符可以相同也可以不同。例如public、private、protected、default等。
  5. 重载方法可以抛出不同的异常。

 

四、抽象类和接口的区别?

Java中的抽象类(Abstract Class)和接口(Interface)都是用于实现抽象和多态的机制,但是它们之间有以下几个主要区别:

  1. 实现方式不同:抽象类是一种基于继承的机制,即只能通过继承抽象类来实现其子类;而接口则是一种独立的概念,可以被多个类实现,实现类与接口之间不存在继承关系。

  2. 方法的实现:抽象类可以拥有构造器、普通方法和抽象方法,其中抽象方法必须在子类中实现;而接口只能定义抽象方法和常量,所有抽象方法必须在实现类中进行实现。

  3. 访问修饰符:抽象类中的方法可以使用public、protected、private等访问修饰符进行限定;而接口中的方法都是public的,不能使用其他访问修饰符进行限定。

  4. 变量的定义:抽象类中可以定义普通变量和静态变量,并且可以对变量进行初始化;而接口只能定义常量,而且必须在定义时进行初始化。

  5. 多重继承的支持:由于Java语言不支持多重继承,因此一个类只能继承一个抽象类,但是可以实现多个接口。

 

五、常见的集合有哪些?

  1. 列表(List):以线性方式存储数据,允许重复元素,可以根据下标进行访问和修改。常见的列表实现类包括ArrayList、LinkedList、Vector等。

  2. 集合(Set):不允许重复元素,可以用于去重和判重等场景。常见的集合实现类包括HashSet、TreeSet、LinkedHashSet等。

  3. 映射(Map):将键值对关联起来,可以按照键进行查找和更新。常见的映射实现类包括HashMap、TreeMap、LinkedHashMap等。

  4. 栈(Stack):先进后出(FILO)的数据结构,常用于实现撤销和回退等功能。常见的栈实现类包括Stack和ArrayDeque。

  5. 队列(Queue):先进先出(FIFO)的数据结构,常用于实现消息队列和处理任务等。常见的队列实现类包括LinkedList、PriorityQueue、ArrayBlockingQueue等。

 

六、HashMap 和 HashTable 的区别有哪些?

  1. 线程安全性:HashTable是线程安全的集合类,所有的方法都被synchronized修饰,可以保证在多线程环境下不会出现并发问题;而HashMap则不是线程安全的集合类,需要通过一些手段(例如使用Collections.synchronizedMap()方法或者使用ConcurrentHashMap)来保证线程安全。

  2. null键和null值的支持:HashTable不允许key或value为null,否则会抛出NullPointerException异常;而HashMap则允许key和value为null,并将其视为特殊的键值对进行处理。

  3. 初始容量和加载因子:HashTable的初始容量为11,负载因子为0.75;而HashMap的初始容量为16,默认负载因子也为0.75。因此,在存储大量数据时,HashMap比HashTable具有更好的性能和扩展性。

 

七、ConcurrentHashMap 和 HashTable 的区别?

ConcurrentHashMap和HashTable都是Java中线程安全的哈希表实现类,但是它们之间有以下几个主要区别:

  1. 分段锁机制:ConcurrentHashMap采用分段锁机制,将整个哈希表分成多个段(Segment),每个段都可以独立地加锁和解锁,可以并发地进行读写操作,提高了并发性能;而HashTable则使用全局的synchronized锁来保证线程安全,所有的方法都是串行执行的,会影响并发性能。

  2. null键值的支持:ConcurrentHashMap允许key和value为null,与HashMap一样;但是HashTable不允许key或value为null,否则会抛出NullPointerException异常。

 

八、List 和 Set 的区别是什么?

List和Set都是Java中常见的集合类型,但它们之间有以下几个主要区别:

  1. 元素重复性:List允许元素重复,可以按照插入顺序进行访问,支持根据索引进行快速访问、修改和删除;而Set不允许元素重复,不能根据索引进行访问,通常用于去重或判重等场景。

  2. 排序方式:List可以按照元素的插入顺序或者自定义排序规则进行排序;而Set不保证元素的顺序,具体顺序取决于具体实现类。

 

九、线程和进程的区别是什么?

1、进程:程序的一次执行过程,是系统运行程序的基本单位,启动 main 函数时其实就是启动了一个 JVM 的进程

2、线程:比进程更小的执行单位,一个进程在其执行的过程中可以产生多个线程。多个线程共享进程的方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。