小菜鸟之JAVA面试题库1
四次挥手
客户端发送释放连接报文,关闭客户端到服务端的数据传输
服务端收到后,发送确认报文给客户端
服务端发送释放连接报文,关闭服务端到客户端的数据传输
客户端发送一个确认报文给服务端
----------------------------------------------------------------
UDP和TCP区别
TCP:
可靠,传输大小无限制,连接需要建立时间,开销大
UDP:
不可靠,传输大小在64K以下,不需要简历连接,开销小
----------------------------------------------------------------
视图:
集合几张表的数据,字段来自一个或多个数据库的表。
触发器:
不能直接调用执行,通过数据库相关表实现级联更改,
当有操作影响到触发器保护的数据时,触发器自动发生。
项目中要慎用触发器,滥用会导致数据库难以维护。
存储过程:
将常用的或很复杂的工作,预先用sql语句写好并用指定名称存储起来,
以后要调用相同服务时,直接execute即可。
进行了预编译,不用每次编译,提高了数据库的执行速度。
----------------------------------------------------------------
JVM五大空间
Java栈,
存放快速执行的任务,基本数据类型的引用,和对象的引用.
(递归函数如果没有退出,就会溢出,发生在Java栈)
线程隔离
本地方法栈,保存native方法进入区域的地址.
线程隔离
堆,new 出来的类对象(留意垃圾回收器)
线程共享
寄存器,保存下一条将要执行的指令地址.
线程隔离
方法区,又叫静态区,存放所有的类,静态变量,静态方法,常量区.
线程共享
java栈和本地方法栈的区别?
-------------------------------------------------------------------------
java为什么能跨平台?
编译器先将java源程序编译生成.class文件,
再由虚拟机对字节码解释执行成相应平台的机器语言,
这个过程由类加载器完成。不同平台有不同的JVM,一次编译,多处运行。
-------------------------------------------------------------------------
反射机制?
一种机制,能在运行时获取类的基本信息.,调用对象的属性,方法.
获取Class对象?Class的forName()全限定名,类.getClass(),类.class
----------------------------------------------------------------
TCP的跨平台?
它是传输层协议,封装了windows和linux的底层函数
----------------------------------------------------------------
工厂模式和抽象工厂模式的区别
1:工厂方法模式
一个抽象产品类,
可以产生出多个具体产品类。
一个抽象工厂类,可以产生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
--------------------------------------------------------------------------------
2:抽象工厂模式
多个抽象产品类,每个抽象产品类可以产生出多个具体产品类。
一个抽象工厂类,可以产生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
--------------------------------------------------------------------------------
JDBC步骤
1.加载数据库驱动
2.通过DriverManager获取数据库链接
3.通过Connection对象创建Statement对象
4.
查:
增删改:
5.关闭数据库会话close()
-------------------------------------------------------------------------
序列化和反序列化
将对象转换为字节流保存起来,在以后根据保存的信息,
在内存重新创建一个对象
1 类实现Serializable
2序列化 ObjectOutputStream os
os.writeObiect()
3反序列化 ObjectInutStream oi
oi.readObject()
4 static的变量不能被序列化
5不想 被序列化 就加transient
6增加成员变量的话 把versionid写死强制和另一个一样,那么就会增加成员变量给它个初始值
--------------------------------------------------------------------------------
IO流
IO流三种解码方式
1,string:new string(byte[ ],字符集)
byte[] getbytes(字符集)
2,转换流 inputStreamReader(inputStream,字符集)
outputStreamReader(outputStream,字符集)
3 Scanner(inputStream,字符集)
只可以读
为什么记事本写代码可以编译?
记
事本存的内容就是写入的字符内容,比如写入‘a’就是编码97,
但是比如word写代码就不能编译
,因为word是带有格式的,存储的时候除了字符内容外还存储了格式内容。
(eclipse虽然也有颜色,但是并未存储这些信息,只是在显示的时候取出内容判断关键字后显示出来)
字节流和字符流:
字节流与字符流的区别
操作代码的不同之外
字节流在操作的时候本身是不会用到缓冲区(内存)的,
是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),
文件也能输出,
但是如果字符流不使用close方法的话,
则不会输出任何内容,
说明字符流用的是缓冲区
,并且可以使用flush方法强制进行刷新缓冲区,
这时才能在不close的情况下输出内容
那开发中究竟用字节流好还是用字符流好呢?
字节流和字符流默认都是采用与操作系统相同的编码格式,
对于windows下文本文件的读写,有时为了解决汉字显示的乱码问题,
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,
包括图片也是按字节完成,而字符是只有在内存中才会形成的,
所以使用字节的操作是最多的。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),
并且采用边读边写的方式(节省内存)。
------------------------------------------------------------------------------------------------
论述什么是MVC架构,并结合你熟悉的一种MVC架构进行阐述其工作原理?
Mvc架构是一种框架模式,有三个模,模型,视图,控制器。Sping mvc
,前端控制器(DispatcherServlet)接受用户的请块求。处理器映射器(HandelMapping)根据url不同去找不同的的处理器。
处理器(Handle)处理业务逻辑。
处理器适配器(Handle Adapter)
把处理器包装成适配器。视图解析器(View)进行视图解析,
处理并解析成相应页面。
mvc好处:
能做到代码重用
分层架构的设计,
易于维护和扩展
更好的分工,程序员可以专注于自己擅长的领域
----------------------------------------------------------------
业务层:面向接口编程()
持久层ORM
业务板块为什么要先写个接口
,写一些方法,在业务中重写这些方法?
spring IOC 实现代码的解耦,
创建对象不用每次new一个对象,交给spring容器创建和托管。
Resource是 j2ee自动装配的注解, 先按名,再按类型
。autowire是spring自动装配的注解,可以指定类型
----------------------------------------------------------------
get post 区别
get,post都是提交方式。get在请求头里面,数据量有限。
post放在请求体里面,不受限制。
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用
。
然而,在以下情况中,请使用 POST 请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向
服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,
POST 比 GET 更稳定也更可靠
----------------------------------------------------------------
那每次request请求Servlet都会经历一次生命周期吗?
不会,第一次发出请求时,服务器会创建一个servlet实例,
调用servlet的init方法,
如果服务器已经存在一个servlet实例,那就直接使用这个实例;
然后调用service方法。
当server退出,或者reload时,此servlet会被distory
----------------------------------------------------------------
request和session的区别
生命周期不一样,request在一次请求完毕或者获取参数结束后,
就会被释放,占用资源少,相对安全。
session的生命周期在一个会话内,在这个绘画内,session一直存在,
差不多半个小时左右会被释放,占用资源大,可以实现会话跟踪,相对不怎么安全。
----------------------------------------------------------------
SqlSessionFactory
是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像.
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,
每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.
同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,
应该在应用执行期间都存在.在应用运行期间不要重复创建多次,建议使用单例模式.SqlSessionFactory是创建SqlSession的工厂.
----------------------------------------------------------------
SqlSession
是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.
SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,
它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句.
每个线程都应该有它自己的SqlSession实例.
SqlSession的实例不能被共享,
同时SqlSession也是线程不安全的,
使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它.
----------------------------------------------------------------
数据库连接池的用处
在JDBC编程中,每次创建和断开 connection对象都会消耗一定的时间和IO资源。
频繁地创建,断开数据库会影响数据库的访问效率,甚至导致数据库崩溃。
数据库连接池负责分配,管理和释放数据库连接,
允许应用程序重复使用现有的数据库连接,而不是重新建立。
要考虑多线程问题,用synchronized。用栈,队列。
----------------------------------------------------------------
JSP
动态网页技术,基于servlet,最终转换成servlet。
里面主要重写service方法:所有html文件out出来,所有java代码执行。
属于服务端脚本,在服务端执行。回传到浏览器的是html文件。jsp文件名就作为这个servlet的url。
----------------------------------------------------------------
cookie
cookie是把少量的信息存储在用户自己的电脑上,它在一个域名下是一个全局的,
只要设置它的存储路径在域名www.a.com下 ,那么当用户用浏览器访问时,就可以从这个域名的任意页面读取cookie中的信息。
这种方案很不错,也很快速方便,但是由于cookie 是存在用户端,
而且它本身存储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。
----------------------------------------------------------------
session
在一次会话中解决2次HTTP的请求的关联,让它们产生联系,
让2两个页面都能读取到找个这个全局的session信息。session信息存在于服务器端,
所以也就很好的解决了安全问题。
----------------------------------------------------------------
Session如何工作
有了Session ID,
服务端就可以创建HttpSession对象了,第一次触发通过request.getSession()方法。
如果当前的Session ID还没有对应的HttpSession对象,那么就创建一个新的,并将这个对象加到sessions容器中保存。
Manager类将管理所有Session的声明周期,Session过期将被回收,服务器关闭,Session将被序列化到磁盘等。
只要这个HttpSession对象存在,用户就可以根据Session ID来获取这个对象
----------------------------------------------------------------
session的销毁?
//第一种方法:调用invalidate()方法直接销毁
session.
invalidate();
//第二种方法:调用setMaxInactiveInterval()方法设置超时,参数单位秒
session.setMaxInactiveInterval(600);
//第三种方法:在web.xml中初始化servlet时添加超时参数,单位是秒
Example
com.*.*.Example
timeout
600
//第四种方法:在web.xml中添加超时配置,单位是分钟
10
//第五种方法:重启服务器。
//第六种方法:关闭浏览器,等待其自动销毁。
----------------------------------------------------------------
COOKIE和SESSION有什么区别?
cookie保存在客户端,session保存在服务器端,
cookie目的可以跟踪会话,
也可以保存用户喜好或者保存用户名密码
session用来跟踪会话
-------------------------------------------------------------------------
J2EE
三大组件:sevelt,filter,listener.
servelt用的较多,
filter现多用于编码
servlet继承HTTPServlet,HTTPServletRequest,HTTPServletResponse,
生命周期:init,service,distory
service: doget,dopost都在里面。
URL真正把请求发送给server
@webServlet自动配置
web.xml手动配置:给webserver用,
主要配置首页,servlet,filter,listener
一个servlet对应一个业务,servlet适合单例模式
filter:webserver接收到请求,
优先查过滤器,然后查servlet。多用于编码转换;
解决请求体的内容
listener:监听session的生命周期,监听在线人数的统计。
servlet为什么能够实现动态网页技术?
servlet处理完请求后,可以动态输出一个html文件。
-------------------------------------------------------------------------
面向对象设计的七大原则
单一职责原则(Single Responsibility Principle):
每一个类应该专注于做一件事情。
里氏替换原则(Liskov Substitution Principle):
超类存在的地方,子类是可以替换的。
依赖倒置原则(Dependence Inversion Principle):
实现尽量依赖抽象,不依赖具体实现。
接口隔离原则(Interface Segregation Principle):
应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
迪米特法则(Law Of Demeter):又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
开闭原则(Open Close Principle):
面向扩展开放,面向修改关闭。
组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP):尽量使用组合/聚合达到复用,尽量少用继承。
原则: 一个类中有另一个类的对象。
-------------------------------------------------------------------------
请求转发和重定向有何异同?
forword请求转发:客服端只有一次请求
,服务端将请求转发给另一个服务端,并可以增加数据,更加高效。
url不变
sendredict重定向:相当于客户端发送了两次请求,服务端将资源给客户端,
客户端再次请求,无法增加数据,低效。url变化
-------------------------------------------------------------------------
mybatis.xml
扫描与自动装配。
配置数据源,创建sqlSessionFactory,
指定mybatis的配置文件(别名),扫描映射接口
-------------------------------------------------------------------------
不用第三个数值交换两数值
public class Demo8 {
public static void main(String[] args){
int x=1;int y=2;x=x+y;y=x-y;x=x-y;//
y=1,x=2
}
} -
------------------------------------------------------------------------
java四大引用
强引用
:
只要引用存在,垃圾回收器永远不会回收
Object obj = new Object();
//可直接通过obj取得对应的对象 如obj.equels(new Object());
而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,
这也是我们经常所用到的编码形式
软引用:
非必须引用,内存溢出之前进行回收,
可以通过以下代码实现
Object obj = new Object();
SoftReference sf = new SoftReference(obj);
obj = null;
sf.get();//有时候会返回null
这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;
软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据
弱引用:
第二次垃圾回收时回收,可以通过如下代码实现
Object obj = new Object();
WeakReference wf = new WeakReference(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。
虚引用:
垃圾回收时回收,无法通过引用取到对象值,可以通过如下代码实现
Object obj = new Object();
PhantomReference pf = new PhantomReference(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除
虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。
虚引用主要用于检测对象是否已经从内存中删除
-------------------------------------------------------------------------
-------------------------------------------------------------------------
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
如果您希望通过 GET 方法发送信息,请向 URL 添加信息:
xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);
xmlhttp.send();
如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。
然后在 send() 方法中规定您希望发送的数据
-------------------------------------------------------------------------
事务的基本要素
1)原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
2)一致性(Consistent):事务结束后系统状态是一致的;
3)隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
4)持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。
通过日志和同步备份可以在故障发生后重建数据。
事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,
对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,
但是系统管理员B就在这个时候插入了一条具体分数的记录,
当系统管理员A改结束后发现还有一条记录没有改过来,
就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
-------------------------------------------------------------------------
一. 什么是死锁?
????
如果一个进程集合里面的每个进程都在等待这个集合中的其他一个进程(包括自身)才能继续往下执行,
若无外力他们将无法推进,这种情况就是死锁
二. 死锁产生的原因?
1.因竞争资源发生死锁?现象:系统中供多个进程共享的资源的数目不足以满足全部进程的需要时,就会引起对诸资源的竞争而发生死锁现象
(1)可剥夺资源和不可剥夺资源:可剥夺资源是指某进程在获得该类资源时,该资源同样可以被其他进程或系统剥夺,不可剥夺资源是指当系统把该类资源分配给某个进程时,不能强制收回,只能在该进程使用完成后自动释放??
(2)竞争不可剥夺资源:系统中不可剥夺资源的数目不足以满足诸进程运行的要求,则发生在运行进程中,不同的进程因争夺这些资源陷入僵局。
举例说明:? 资源A,B; 进程C,D
资源A,B都是不可剥夺资源:一个进程申请了之后,不能强制收回,只能进程结束之后自动释放。内存就是可剥夺资源
进程C申请了资源A,进程D申请了资源B。
接下来C的操作用到资源B,D的资源用到资源A。但是C,D都得不到接下来的资源,那么就引发了死锁。
(3)竞争临时资源
2.进程推进顺序不当发生死锁
?
三. 产生死锁的四个必要条件?
(1)互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源
(2)请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放
(3)不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
(4)环路等待条件:是指进程发生死锁后,必然存在一个进程--资源之间的环形链
?
四. 处理死锁的基本方法
1.预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件
2.避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁
3.检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉
4.解除死锁:该方法与检测死锁配合使用
-------------------------------------------------------------------------
-------------------------------------------------------------------------
JDBC如何执行事务
先把setAutoCommit置为false,最后再置为true
-------------------------------------------------------------------------
-------------------------------------------------------------------------
如何解决高并发问题
1.HTML静态化,效率高,消耗小适用于频繁使用数据库查询但是内容更新很小的应用,避免大量的数据库访问请求。
2.图片服务器分离,图片是最消耗资源的,将图片与页面进行分离采用独立的图片服务器,降低服务器的压力,保证系统不会因为图片问题崩溃。
3.数据库集群和库表散列,mysql提供了master和slave方案,但是数据库集群在架构,成本,扩张性收到DB类型的限制 ,采用库表散列市更高效的解决方案,对不同的业务,功能进行数据库分离,不同的模块对应不同的数据库和表,低成本的提高性能,并且有很好的扩展性。
4.缓存,更高效的存取。
5.镜像,提高性能和数据安全性。
6.负载均衡,解决高负荷访问和大量并发请求。
-------------------------------------------------------------------------
-------------------------------------------------------------------------
sleep和wait?
他们都可以使线程等待
区别:
最大的区别,sleep没有释放锁,wait释放了锁;
sleep属于Thread的方法,wait属于Object的方法
sleep作用在任意位置,wait只能用在同步方法和同步代码块里
sleep需要捕获异常,wait不需要
简单介绍一下http协议
简单介绍一下socket
最新文章
- 用Windows+VirtualBox搭建嵌入式Linux开发环境
- yii2-basic后台管理功能开发之四:图片上传FileInput
- .NET领域驱动设计—实践(穿过迷雾走向光明)
- Maven与Ant使用reportNG代替testng
- HDU 5071 Chat(2014鞍山赛区现场赛B题)
- ADB无线连接
- 【HDOJ】2699 Five in a Row
- VC++中调用cmd的集中方式
- 简单的iOS抽屉效果
- 如何在 Linux 中找出最近或今天被修改的文件
- selenium工具简介
- PHP中将ip地址转成十进制数的两种实用方法
- Java数据结构和算法
- LeetCode 219. Contains Duplicate II (包含重复项之二)
- Contributed to JFairy
- 洛谷P2336 喵星球上的点名
- 隐藏非选中的checkBox
- win10 uwp unix timestamp 时间戳 转 DateTime
- Wannafly挑战赛9 E - 组一组
- sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结)
热门文章
- codeforces555B
- codeforces1C
- 关于项目在网页中运行部分jsp出现乱码(由request.getRequestDispatcher(";XXX.jsp";).forward(request, response)造成)的解决方法
- Jmeter(十一)函数助手
- 本地Git连接远程Gitlab
- 为什么还需要学习TypeScript
- InnoDB记录存储结构
- State Threads之网络架构库
- 【Blog怎么玩】什么叫EntryName友好地址名?
- Javascript和JQuery获取浏览器窗口各种尺寸