小菜鸟之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

posted @ 2019-08-15 17:21  一片风的独白  阅读(153)  评论(0编辑  收藏  举报