Java基础面试题

什么类什么是对象

对象是类的一个实例化。从程序的角度来看,对象是被封装起来的代码块,或者称之为一个功能模块。在对象中,包含着若干个属性和方法。类是对象的抽象,它描述了对象的特征。从软件设计的角度来说,类就是一种数据结构,用于模拟现实中存在的对象和关系,类封装了对象的静态属性和动态的方法,而且可以通过继承性和多态性等机制产生新类。


字节流以字节(8位)为单位进行读写操作。它们主要用于处理二进制数据,如图像、音频和视频等。

字符流以字符(16位)为单位进行读写操作。它们主要用于处理文本数据,如文本文件。常见的输入字符流类有 Reader,常见的输出字符流类有 Writer

2.封装类和基本类型是Java中的两个概念,它们之间有一些重要的区别。

数据类型:基本类型是Java语言中的内置数据类型,包括int、double、boolean等。而封装类是对基本类型进行封装,以便在面向对象的编程中使用,每个基本类型都对应一个封装类,如Integer、Double、Boolean等。

包装功能:封装类提供了许多额外的功能,如方法、属性和常量,可以用于处理基本类型的数据。这些额外的功能使得封装类更加灵活和功能丰富。

封装类提供了对基本类型的封装和更多功能的扩展,可以用于面向对象的编程和处理空值情况。然而,由于额外的功能和对象引用的操作,封装类可能会引入一些性能开销。在选择使用封装类还是基本类型时,需要根据具体情况权衡使用的需求和性能要求。

JDK8新特性?

1.Lambda表达式

2.如果经常对集合进行过滤,排序的操作可以使用stream流

集合生成流的方式有两种:

1.stream()主要为集合生成串行流-----常用

2.parallelStream()主集合生成并行流

谈谈面向对象的理解

面向对象编程就是面向类来编程,抽象的类创建对象实例,面向对象有继承封装多态

继承:子类继承父类的方法和属性,让程序更灵活

封装:可以设置类和属性的权限,让程序更安全

接口就是多态,一个接口被多个实现类实现就是多态

设计模式

单例模式:一个类只有一个实例,记录日志,数据库连接池

工厂模式:根据不同条件,产生不同对象的方法

代理模式,观察者模式,访问者模式等等

代理模式:spring中的aop就是基于动态代理实现的

String,StringBuffer,StringBuilder的区别

String是字符串常量被final修饰,创建之后不能修改

StringBuffer是字符串变量(线程安全),toString方法会进行对象缓存,以减少元素复制开销

StringBuilder是字符串变量(线程不安全),toString的时候,会直接返回一个新对象

访问权限修饰符

public所有包中所有的类都可以访问

protected同一个包中可以访问,不同包中的类也可以访问

default只有同一个包中可以访问

private只能当前类访问

操作集合的方法?

创建集合ArrayList,LinkedList

添加元素,add()

删除元素remove()

遍历元素for-each,Iterator

获取元素个数:size()

排序:用Collections类里的sort()方法

JDK,JRE,JVM有什么区别

JDK是Java开发和运行环境

JRE是Java运行环境

JVM是Java虚拟机

== 和 equals 的区别是什么

"==" 是用来比较两个值是否相等的运算符。它比较的是两个值的内存地址。

而 "equals" 是用来比较两个值是否“相等”的方法。它比较的是两个值的内容。

==对于基本数据类型,判断值是否相同

引用类型,比较的是地址

equals比较的是内容是否一致

swtich选择语句中支持哪些数据类型?

byte short char int,JDK1.7开始支持String

Throw 和 Throws 的区别?

thorw是抛出自定义异常,throws是在方法上抛出异常

以下是一些常见的抛出异常的情况:

输入错误数据:当用户或外部系统传递了错误的数据时,应该抛出异常来提示用户或者停止程序继续执行。

系统错误:当系统硬件或软件出现错误时,应该抛出异常来记录错误日志或尝试修复错误。

超出程序设计范围:当程序运行时发现任务超出设计的范围,比如操作系统权限不够、内存溢出等,应该抛出异常。

调用外部服务失败:当程序需要调用外部服务,但服务不可用或返回错误结果时,应该抛出异常来处理这种情况。

非法操作:当程序执行了非法操作,比如数组越界、访问空指针等,应该抛出异常来防止程序崩溃。

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

可以,但是有特殊汉字没在Unicode编码字符集中就不能存储,占用两个字节

char 接口和抽象类有什么区别?

接口用implements实现,抽象类用extends继承

抽象类可以有构造函数,接口没有;

接口默认访问修饰符是public,变量是公共静态变量

常见的异常有哪些?

非检查性异常:

NullPointerException:空指针异常

IndexOutOfBoundsException:数组下标越界异常

ArithmeticException:运算异常

IIlegalArgumentException:非法参数

list map set 在项目中的应用,阐述底层实现原理

List , Set, Map都是接口

List 有序,可重复

ArrayList 底层数据结构是数组,查询快,增删慢。

LinkedList底层数据结构是链表,查询慢,增删快。

线程不安全

Set 无序,唯一

设计模式知道哪几种详细说一下?

单例模式(Singleton Pattern):日志记录,全局缓存,全局配置

单例模式确保一个类只有一个实例,并提供全局访问点。

一个类只能实例化一次

1.私有构造

2.静态私有成员变量

2.公有静态的方法

场景:数据库连接,记录日志

工厂模式(Factory Pattern):

工厂模式通过提供一个公共接口来创建对象。方便统一管理和维护

代理模式:通过创建代理对象来控制对真实对象的访问。

观察者模式(Observer Pattern):

观察者模式定义了对象之间的一对多关系,当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。

策略模式(Strategy Pattern):

策略模式定义了一族算法,并使得它们可以相互替换,使得算法的变化独立于使用算法的客户端。

原型模式(Prototype Pattern):

原型模式通过复制一个已经存在的实例来创建新的实例,从而避免了通过实例化的方式创建新对象的开销。

MVC模式(Model-View-Controller Pattern):

MVC模式将应用程序分为三个部分:模型(数据和业务逻辑)、视图(用户界面)和控制器(处理用户输入和模型的交互),从而实现了解耦和模块化。

数组和链表有什么区别?

数组是一块连续的内存地址,通过索引查找的,效率高,用for循环遍历数组,indexof通过索引查找

链表通过节点存储的,通过指针,插入删除效率高,add(int index,E element)添加元素,remove(int index)

HashMap和Hashtable区别

1.开发时经常用HashMap,虽然线程不安全但存储效率比较高,自定义返回json字符串,封装到List中进行返回

2.HashMap存储键值对实现快速存取,允许为null,底层是hash表,JDK1.8之后采用数组+链表+红黑树的数据结构

1.HashMap是非线程安全的,而Hashtable是线程安全的。

2.HashMap允许键或值为null,而Hashtable不允许。

3.HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的Enumerator迭代器不是fail-fast的。

Hashtable源码里put方法前面加了synchronized同步,效率低

HashSet与TreeSet的区别

1.HashSet可以接受null值,有且只有一个

2.TreeSet默认不可以接受null值,会直接抛出空指针异常

红黑树是一种平衡二叉树,TreeMap 来实现红黑树,插入,创建一个节点,旋转着色,实现平衡。

ArrayList与LinkedList区别?

ArrayList用数组存储数据,根据索引查询块

LinkedList用双向链接方式存储数据,插入,删除数据比较快

ArrayList 适合频繁查询和访问,LinkedList 适合频繁插入和删除。

在Java中,可以使用不同的方式来遍历Map集合。以下是几种常见的遍历方式:

怎么遍历map?

1.使用entrySet()方法遍历:通过获取Map的entrySet(),然后利用增强for循环遍历每个键值对。这种方式可以同时获取到键和值,并且性能较高。

Map<String,String>map=newHashMap<>();// 添加键值对到map中...for(Map.Entry<String,String>  entry : map.entrySet()){ 

Stringkey=entry.getKey();

Stringvalue=entry.getValue();

System.out.println("Key: "+key+", Value: "+value);}

2.使用keySet()方法遍历:通过获取Map的keySet(),然后利用增强for循环遍历每个键,再通过键获取对应的值。这种方式只能访问到值,无法直接获取键。

```java

Map<String,String>map=newHashMap<>();// 添加键值对到ma中...

for(String key : map.keySet()){

String value=map.get(key);

System.out.println("Key: "+key+", Value: "+value); } 

```

##使用forEach()方法遍历:这是Java 8引入的一种新的方式,在Map接口中新增了forEach()方法,可以使用Lambda表达式进行遍历。

Map<String,String>map=newHashMap<>();// 添加键值对到map中...map.forEach((key,value)->{System.out.println("Key: "+key+", Value: "+value);});

runnable和callable区别?

Runnable接口run方法无返回值

Callable接口call方法有返回值

GC是什么?为什么要有GC?

GC是垃圾回收的意思,垃圾回收可以有效防止内存泄漏

Collection和Collections有什么区别?

Collection是一个集合接口

Collections是一个工具类,提供了一系列方法对集合进行操作

sort()排序,reverse()翻转

indexof()查询,replaceAll()

List,Set,Map三者的区别

List有序可重复

Set无需不可重复

Map键值对,key,value

递归的优缺点

递归就是在函数里调用自身,得有结束条件

效率比较低,递归次数多容易造成栈溢出

场景:对树形结构进行便利(查找树中的特定元素),数组的排序(快速排序、归并排序)

什么是线程,什么是进程?

进程:程序执行的一个实例

线程:而线程则是进程中执行任务的最小单位

关系:一个进程可以有多个线程,处理并发任务的时候用到了多线程

创建线程的两种方式?

1.继承Thread类(重写了run()方法)

2.实现Runnable接口(执行Runnable对象的run()方法)

线程的生命周期?

新建状态(New):新建线程对象后,线程处于新建状态。

就绪状态(Runnable): 线程被创建后,调用start()方法启动线程,此时线程处于就绪状态。就绪状态的线程已经在JVM中分配了内存空间和其他系统资源,并等待CPU分配时间片来执行其任务。

运行状态(Running):一旦线程获得了CPU的时间片,它就进入了运行状态。处于运行状态的线程正在执行代码。

阻塞状态(Blocked): 当线程等待某些操作完成(如从磁盘读取数据,等待用户输入,等待其他线程完成等)时,它需要进入阻塞状态,让出CPU并释放系统资源,等待操作完成后再次进入就绪状态。

终止状态(Terminated):当线程正常执行完毕或发生异常、错误等情况导致线程无法继续执行时,线程进入终止状态。终止状态的线程释放占用的内存空间和其他系统资源,成为垃圾对象,最终被JVM回收。

线程的run()和start()有什么区别?

start()方法用来启动线程,只调用一次

run()方法是执行线程,不会创建新的线程,可以调用多次

什么是多线程?

是指一个程序中包含了多个执行流,可能造成线程死锁,不安全

多线程使用场景:

1.并发任务处理(一个电商网站需要同时处理多份订单)

2.数据库操作(会涉及到大量的磁盘读写操作,可以使用多线程来执行数据库操作,从而提高系统的并发性能)

了解线程池吗?

线程池是管理线程的,能有效控制线程的数量,减少开销,提高程序的响应速度

七大核心参数:

核心线程数

最大线程数

线程存活时间

存活时间单位

任务队列

线程工厂

拒绝策略

线程安全和不安全是什么意思?

多个线程同时访问共享资源时候

线程安全是多线程并发访问的时候,不会死锁,线程安全问题场景一般是在多线程并发

场景:

1.共享资源访问

2.缓存操作

3.数据库连接池

线程安全:

1.加锁,用synchronized关键词,确保资源只能被一个线程访问,其他资源会被阻塞等待

2.避免资源共享

3.并发容器:Map,List,Queue等容器

线程死锁是什么?怎么解决线程死锁问题?

两个或多个线程互相等待对方释放资源,都阻塞了,程序无法执行

解决方式:

1.避免嵌套锁

2.按顺序获取锁

3.用加锁超时机制

乐观锁和悲观锁区别?

乐观锁:读取频繁,冲突较少的情况

悲观锁:写入频繁,冲突较多的情况,通过主动加锁保证数据一致性

读锁:LOCK table test_db read

写锁:LOCK table test_db write

释放锁:UNLOCK table

IO流相关知道多少?

输入流InputStream读数据

输出流OutStream写数据

字节流:操作二进制数据的,以字节方式读取数据

字符流:以字节流读写数据的

处理大文件用缓冲区的流提高效率BufferedReader和BufferedWriter

处理IO异常用try-catch-finally,在finally中释放资源

final和finally的区别

final和finally是两个在编程语言中具有不同含义和用途的关键字。

final:final是一个修饰符,可以用于类、方法和变量。它具有以下含义:

当用于类时,表示该类是最终类,不能被继承。

当用于方法时,表示该方法是最终方法,不能被子类重写。

当用于变量时,表示该变量是一个常量,它的值在初始化后不能被修改。

finally:finally是一个关键字,用于异常处理和资源清理。它通常与try-catch结构一起使用。具体含义如下:

在 try-catch 结构中,finally 语句块中的代码始终会执行,无论是否出现异常。

finally 通常用于释放资源、关闭文件、关闭数据库连接等必须要执行的清理操作,以确保代码在任何情况下都能得到正确的处理。

总结:

final 是一个修饰符,用于类、方法和变量,表示不可改变或不可重写的特性。

finally 是一个关键字,在异常处理中用于定义一定会执行的代码块,主要用于资源清理和善后操作。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容