Java初级开发⼯程师⾯试题合集
⼀.多线程
什么是多线程?
多线程是指程序中包含多个流,即在⼀个程序中可以同时进⾏多个不同的线程来执⾏不同的任务
多线程的优劣?
优点:可以提⾼CPU利⽤率, 提⾼了程序的效率, 单个程序可以创建多个不同的线程来完成各⾃的任务
缺点:线程也是程序,需要占据内存.多线程需要协调和管理,所以需要CPU跟踪线程.
并发和并⾏的区别?
并发:多个任务在同⼀个CPU上,按照细分的时间⽚段轮流交替执⾏.
并⾏:单位时间内,多个处理器或者多核处理器同时处理多个任务,真正意义上的同时进⾏
并发编程三要素(怎么保证多线程的线程安全,线程安全在哪些⽅⾯体现)?
原⼦性:⼀个或多个操作, 要么全部执⾏且不被打断, 要么就全部不执⾏
可见性: 多个线程操作⼀个共享变量时, 其中⼀个变量修改后, 其他线程可以⽴刻看到修改结果
有序性:程序的执⾏顺序按照代码先后顺序来执⾏
线程与进程的区别?
根本区别:进程是操作系统资源分配的基本单元,线程是处理器任务调度和执⾏的基本单位
包含关系:如果⼀个进程内有多个线程,则执⾏的过程不是⼀条线的,⽽是多条线(多线程),共同完成,线程是进程的⼀部分.
内存分配:同⼀个进程的线程共享本进程的地址空间和资源,进程之间的地址空间和资源是相互独⽴的.
守护线程:服务线程,准确的来说就是服务其他的线程
什么是线程死锁
死锁是指两个或者以上的进程(线程)在执⾏过程中, 由于竞争资源或由于彼此通信造成的⼀种堵塞现象,
若⽆外⼒作⽤,都将⽆法进⾏推进,此时的系统处于死锁状态.
形成死锁的条件及解决办法
互斥条件:⼀个资源只能被⼀个进程占⽤,直到该进程被释放
请求与保持条件:⼀个线程请求被占有资源⽽发⽣堵塞时,对以获取资源保持不放
不剥夺条件:线程以获取的资源在未使⽤完之前不能被其他线程强⾏剥夺, 只有等⾃⼰使⽤完才释放资源.
循环等待条件: 发⽣死锁时, 等待的线程必定形成⼀个环路, 死循环造成永久堵塞.
解决办法:⼀次申请所有资源. 占有部分资源的线程尝试申请其它资源, 申请不到,主动释放它占有的资源. 按顺序来申请资源.
创建线程的四种⽅式
继承Thread类
实现Runnable接⼝
实现Callable接⼝
Executors⼯具类创建线程池
runnable和callable的区别:
runnable中的run()⽅法返回void,只是纯粹执⾏run()⽅法中的代码
callable:中的call()⽅法有返回值,⼀个泛型,和Future,FutureTask配合可获得异步执⾏的结果
run()⽅法和start()⽅法有什么区别
start()⽅法⽤于启动线程, run()⽅法⽤于执⾏线程的运⾏代码, run()可以反复调⽤, ⽽start() ⽅法只能被调⽤⼀次
调⽤start()⽅法启动线程可以使线程进⼊就绪状态, 等待运⾏; run()⽅法只是thread的⼀个普通⽅法调⽤, 还是在主线程⾥执⾏.
线程⽣命周期的6个状态
新建(NEW):初始化状态,未启动
就绪(RUNNABLE):已经调⽤Thread 的start⽅法启动了, 等待CPU调度, 就绪状态
销毁(TERMINATED):死亡状态, 已正常执⾏完run()中的⽅法,或者因为未捕捉的异常⽽终⽌run()⽅法了
计时等待(TIMED_WAITING):睡眠状态, 调⽤sleep(参数)或wait(参数)后线程进⼊计时休眠状态,
等待(WAITING):调⽤wait()⽅法, 释放锁进⼊⽆线等待状态
阻塞(BLOCKED):运⾏的线程执⾏wait()⽅法, 运⾏的线程获取对象的同步锁时, 同步锁被别的线程占⽤, 进⼊阻塞状态.
sleep()和wait()有什么区别
相同:两者都可以使线程进⼊等待状态
不同:sleep()是Thread类下的静态⽅法, wait()是Object类下的⽅法
sleep()不释放锁, wait()释放锁
redis是nosql数据库吗wait()常⽤语线程之间的通信, sleep()常⽤语暂停执⾏.
如何在两个线程之间共享数据?
两个线程之间共享变量即可实现共享数据. ⼀般来说共享变量要求变量本⾝是线程安全的, 然后再线程中对变量使⽤
什么是线程安全?Servlet是线程安全的吗?
线程安全是指某个⽅法在多线程的环境下被调⽤时, 能够正确处理多线程之间的共享变量, 使程序能正确完成.
Servlet不是线程安全的, 它是单实例多线程, 多个线程访问⼀个⽅法时, 不能保证共享变量是安全的
什么是线程池?
提前常见若⼲个线程, 有任务需要处理, 线程池⾥的线程就会处理任务, 处理完线程后线程并不会销毁, ⽽是等待下⼀个任务,存放在线程池中. Java提供了⼀个urrent.Executor接⼝⽤于创建线程池
四种线程池的创建
newCachedThreadPool:创建⼀个可缓存线程池
newFixedThreadPool:创建⼀个定长线程池,提交⼀个任务就创建,可控制线程最⼤并发数
newScheduledThreadPool:创建⼀个固定长度线程池, ⽀持定时及周期性执⾏任务
newSingleThreadExecutor:创建⼀个单线程化的线程池, 它只会⽤唯⼀的⼯作线程来执⾏任务
线程池的五种状态?
Running
ShutDown
Stop
Tidying:
Terminated
线程池的优点?
重⽤存在的线程, 减少对象创建销毁的开销
可有效的控制最⼤并发线程数, 提⾼系统资源的使⽤率, 同时避免过多资源竞争, 避免堵塞
提供定时执⾏, 定期执⾏, 但线程, 并发数控制等功能
什么是乐观锁和悲观锁
乐观锁:对并发间操作产⽣的线程安全问题持乐观状态, 将⽐较-替换这两个动作作为⼀个原⼦去修改内存中的变量; 通过不加锁来处理资源悲观锁: 每次对某资源进⾏操作时, 都会持有⼀个独占的锁; 将资源锁住, 等⼀个之前获得锁的线程释放锁后, 下⼀个线程才可以访问
多线程同步有哪⼏种⽅法?
Synchronized关键字:⽤来给⽅法,代码块加锁。共享对象头。Java⾃带,Jvm层⾯。⾮公平,适合少量代码同步问题
Lock锁实现:共享某个变量。⼀个Java类。公平,适合⼤量同步代码同步问题
分布式锁:多个进程不在同⼀个系统中,使⽤分布式锁控制多个进程对资源的访问。
Synchronized的底层实现原理?
synchronized可以保证⽅法或者代码块在运⾏时,同⼀时刻只有⼀个⽅法可以进⼊到临界区,同时它还可以保证共享变量的内存可见性。Java中每⼀个对象都可以作为锁,这是synchronized实现同步的基础:
普通同步⽅法:锁是当前实例对象
静态同步⽅法:锁是当前类的class对象
同步⽅法快:锁是括号⾥⾯的内容
⼆.集合框架
什么是集合?
集合可以看做是⼀种容器, ⽤来存储对象信息
数组和集合的区别?
数组长度不可变,⽆法保存有映射关系的数据, 集合⽤于保存不确定的数据, 以及保存具有映射关系的数据
数组元素可以使基本类型的值, 也可以是对象, 集合只能保存对象
Java集合类主要有两个接⼝Conllection和Map
Collection接⼝常⽤集合: ArrayList, LinkedList, HashSet, TreeSet, Vector
Map接⼝常⽤集合: HashMap, TreeMap
Collections和Collection的区别
Collections:是集合类的⼯具类提供了⼀系列静态⽅法,⽤于对集合中元素进⾏排序、搜索以及线程安全等各种操作。
Collection:集合的顶级接⼝
List, Set, Map的区别?
List: 有序, 可重复集合, 集合中每个元素都有对应顺序索引
Set: 有序, 不可重复集合, 重复元素会覆盖
Map: 键值对存储, ⽆序, 元素不可重复,重复元素覆盖
HashMap和Hashtable的区别?
都是集合,底层哈希算法
区别:
HashMap线程不安全,效率⾼。可以存储null键值对
Hashtable线程安全(每个⽅法中都加⼊了synchronized),效率低,不可以存储null键值
HashMap的数据结构
jdk1.7: HashMap实际上是⼀个数组和链表结构的散列表
jdkq.8: 链表中的元素超过了8个后, 会将链表转换为红⿊树
HashSet的实现原理?
HashSet底层有HashMap实现
HashSet值存放于HashMap的key上
HashMap的value值统⼀为present
ArrayList和LinkLIst的区别?
ArrayList底层数据结构是数组
LinkList底层数据结构是链表
List转换为数组:ArrayList的toArray⽅法
数组转换为List:调⽤Arrays的asList⽅法
ArrayList和Vector的区别?
Vector是同步的,ArrayList不是。线程安全, 数据增长原来的2倍
ArrayList是同步的,不会过载,⽐Vector快。⾮线程安全, 数据增长没有明确规定, 源码来看是增长原来的1.5倍哪些集合是线程安全的?
vector:线程安全,效率低
HashTable:线程安全
statck:堆栈类,先进后出
三.⽹络编程
TCP与UDP的区别
TCP:传输控制协议, 为应⽤程序提供可靠的通信连接,适合⼀次传输⼤批数据的情况,⾯向连接的协议
UDP: ⽤户数据包协议, 提供⽆连接通讯, 且不对传送包进⾏可靠的保证
TCP为可靠的连接, UDP为不可靠的连接
TCP占有系统资源较多, UDP占有系统资源少
TCP保证数据准确性, UDP可能丢包, TCP保证数据顺序,UDP不保证
三次握⼿,四次挥⼿详细过程及作⽤
建⽴连接:
⼀次握⼿: 客户端发送syn包到服务器,等待服务器确认
⼆次握⼿: 服务器收到syn包, 确认客户的syn, 同时⾃⼰发送syn + ACK包给客户端并进⼊等待
三次握⼿: 客户端收到服务器的SYN + ACK包, 完成三次握⼿, 开始发送数据
三次握⼿完成后, 客户端与服务器才正式开始传送数据
断开连接:
⼀次挥⼿:主动关闭⽅发送FIN⽤来关闭主动⽅到被动关闭⽅的数据传送
⼆次挥⼿: 被动关闭⽅收到FIN包后, 发送⼀个ACK给对⽅
三次挥⼿: 被动关闭⽅发送⼀个FIN,⽤来关闭被动关闭⽅到主动关闭⽅的数据传送
四次挥⼿: 主动关闭⽅收到FIN后, 发送⼀个ACK给被动关闭⽅
四层⽹络模型和七层⽹络模型
四层⽹络模型:
应⽤层:应⽤程序间沟通的层
传输层:负责传输数据,并确认数据已送达并接收
互联⽹络层: 负责提供基本的数据封包传送功能
⽹络接⼝层:对实际的⽹络媒体的管理, 定义如何使⽤实际⽹络
OSI七层⽹络模型:
物理层, 数据链路层, ⽹络层, 传输层, 会话层, 表⽰层, 应⽤层
什么是Socket?
Socket: ⽤于描述IP地址和端⼝, 可以⽤来实现不同虚拟机或者计算机之间的通信, 在Internet上的主机⼀般运⾏了多个服务软件, 每种服务打开⼀个Socket, 并绑定到⼀个端⼝上, 不同端⼝对应不同的服务.
IO流
IO流是⽤来处理设备之间传输数据,下载⽂件,上传⽂件。
按照流向分,可以分为输⼊流和输出流
按照操作单元分,可以分为字节流和字符流
按照⾓⾊划分为节点流和处理流
输⼊流:程序从输⼊流中读取数据,
输出流:程序向输出流写⼊数据。程序将数据输出到外界。
BIO,NIO,AIO的区别?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论