什么类什么是对象
对象是类的一个实例化。从程序的角度来看,对象是被封装起来的代码块,或者称之为一个功能模块。在对象中,包含着若干个属性和方法。类是对象的抽象,它描述了对象的特征。从软件设计的角度来说,类就是一种数据结构,用于模拟现实中存在的对象和关系,类封装了对象的静态属性和动态的方法,而且可以通过继承性和多态性等机制产生新类。
字节流以字节(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 是一个关键字,在异常处理中用于定义一定会执行的代码块,主要用于资源清理和善后操作。