web最全面试题
Java全套面试题
- 简单的讲一下夸平台原理
1.1由于各系统支持的不同的指令,就会让我们的程序在不同的操作系统上要执行不同程序的代码。java开发为了避免这种差异。提供了统一的接口,我们只需要在不同的系统上提供不同的虚拟机即可。并不是java是跨平台的语言,而是不同平台上装有不同的虚拟机。所以说java是与平台无关性的语言
- 搭建一个java开发环境步骤
- 适用于我们开发环境的jdk
- 对应的开发环境jre
- 还需要tomcat
三.讲一下java的数据类型
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0
int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
四.面向对象的特征有哪些方面
有四种基本特征 封装、抽象、继承、多态
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:便于使用,提高重用性。提高安全性
抽象:
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处。
好处::抽象类和抽象方法必须用abstract关键字修饰
:抽象类不一定有抽象方法,有抽象方法的类一定是抽象或者是接口
:抽象类不能实例化那么(如果可以实例化,那就可以调用类中的抽象方法,没有具体的方法实现,没有意义)
多态:同一类型的引用指向不同的对象时,有不同的实现
好处:提高了代码的维护性,提高了代码的扩展性
继承:子类的对象拥有父类的全部属性与方法
好处:实现了代码的复用
- 有了基本数据类型,为什么还需要包装类型
基本类型:java中提供的8种基本类型
包装类型: 每一个基本类型都会一一对应一个包装类型。 boolean----->Boolean int------>Integer
装箱和拆箱:
装箱:把基本的数据类型转化为包装类型;
自动装箱:自动装箱实际上在编译的时候会调用Integer.valueof方法来装箱
拆箱:就是把包装类型转化为基本数据类型
自动拆箱:实际上会在编译时调用intValue
值缓存:
- 说一下“==”和equals方法究竟有什么区别
==用来判断两个变量之间的值是否相等。变量就可以分为基本数据类型,引用类型。如果是基本类型的变量比较值而引用类型比较的引用的内存的地址的首地址
equals用来比较两个对象是否一样。判断两个对象的某些特征是否一样,实际上就是调用对象的equals方法进行比较
- 讲一下String和stringBuilder stringBuff的区别
String是内容不可变的字符串。String的底层使用了一个不可变的字符数组(final)
而stringBuilder stringBuff是内容可以改变的字符串,他们的底层使用了可变的字符数据(没有被final修饰)
拼接字符串不能使用string进行,要使用stringBuilder stringBuff
stringBuilder 是线程不安全的,效率比较高
stringBuff 线程安全的,效率较低
八:讲一下java中的集合
Java中的集合分为value, key value(collection Map)两种
存储的方式分为list和set
list是有序的,可以重复
Set是无序的,不可以重复。
- Arraylist和linkdList的区别,和使用场景
Arraylist:底层使用的数组。查询快,删除和查询比较慢
linkdList:底层使用的链表(不需要内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头开始找,插入式不需要移动),而插入和删除效率高,查询比较慢。
Arraylist:使用查询比较多,删除和插入比较少
linkdList:使用删除和插入比较多,使用查询少
十.讲一下HashMap和HashTable的区别
他们都是键值对的形式存在
HaspMap可以把键或值为null 而HashTable不可以
HaspMap是线程不安全的,效率较高 HaspTable是线程安全的,效率较低
我想用线程安全但是又想效率高:
通过整个Map分为n个segment,可以提供相同的线程安全
- 实现一个拷贝文件的工具类使用字节类还是字符流
我们拷贝的文件不确定只包含字符流,有可能有字节流(图片、声音)为考虑通用性,要使用字节流
- 讲一下线程的几种创建方式
- 通过继承Thread类实现一个线程
继承扩展性不强,java总只支持单继承,如果一个类继承Thread就不能继承其他的类了
- 通过实现Runnable实现一个线程
怎么启动:
启动start方法 ,启动之后执行run方法
怎么区分线程?在一个线程中有很多线程,每个线程都会打印日志,我想区分是哪里打印怎么办?
Thread thread=new Thread;
Thread.setName(“设置一个线程名称”)
- 有没有使用过线程并发库
简单了解过?
Java5增加了Douglea.提供了线程的运行,线程池的创建,线程生命周期的控制。
Java通过Execuors提供四个静态方法的线程池:
线程池的作用:
- 限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃
- 线程池不需要每次都去创建或销毁,节约了资源
- 线程池不需要每次都去创建。响应时间更快
十四:讲一下什么是设计模式?常用的设计模式有哪些
设计模式就是经过前人无数次的实践总结的。
单例模式
饱汉模式
饱汉模式是一出来就创建
饥汉模式
需要时候才创建
工厂模式:spring IOC
对象的创建交给一个工厂去创建
代理模式 :spring AOP就是使用的动态代理
包装模式 :
Java web部分
- 讲一下http get 和post请求的区别
都是http的请求方式
①Get请求提交的数据会在地址栏显示出来,而post不会在地址栏显示
②传输数据的大小
Get请求不会由于浏览器对地址长度的限制而导致传输的数据有限制。而post不会因为地址的长度限制而导致传输数据的限制
③安全性post的安全性要比get的安全性高
由于数据会在地址中呈现,所以通过历史纪录可以找到相关信息
- 说一下你对servlet的理解,或者servlet是什么
是一种java编写的服务器端程序,而这些servlet都要实现这个接口,主要功能是在于交互的浏览器和修改数据生成web内容
httpServlet重写了doGet和doPost方法或者重写service方法完成对get和post请求的响应
- 简单那说一下servlet的生命周期
Servlet创建:当第一次访问的时候被创建,而且只执行一次,只要访问就执行
什么时候销毁:当服务停止时被销毁(没有办法手动销毁只要访问了就一直存在tomcat里面)
- jsp的内置对象?作用分别是什么:分别有什么用法
Request 用户端请求,
Response 网页传回用户的回应
pageContext 网页的属性时这里管理
Session 会话
Appliaction 正在执行的内容
Out 输出
Config
Page
Excption
四大作用域
PageContext,Request ,Response ,Appliaction 通过四大作用域取值
- session和cookie的区别,你在项目中哪里使用
Sessiom和cookie都是会话,cookie通过客户端记录用户信息,session通过服务器端记录用户信息,但是session的实现依赖于cookie,
Cookie和session的区别:
1. cookie数据存放在浏览器上,seeion数据存在服务器上
2. cookie很不安全
3.session会在一定时间内保存在服务器上。访问增多时,会比较占用你的服务器性能。
建议:把登陆信息放在session里面
其他信息放在cookie里面
- MVC的各个部分都有哪些技术来实现
数据库的分类
1.数据库的分类和常用的数据库
关系型数据库:
节构严谨,符合关系理论。可以存储结构化数据。支持比较复杂的的数据关联查询,支持事务,可以保障数据安全。支持sql语句做操作
非关系型数据库:
结构简单、键值对的方式存在。而且大多数都是直接存在内存中,具有很高的性能;大多数都是开源的,可以免费使用。
2.事务四个基本特性ACID
事务就是要么都做要么都不做。买东西要从A用户先B用户转账,A用户扣钱成功,B账号加钱成功。
事务必须满足四大特征:
原子性:表示事务内操作不可分割,要么都成功,要么都失败
一致性:要么都成功,要么都失败,后面的失败要对前面的操作进行回滚
隔离性:一个事务开始后,不能其他事务干扰
持久性:表示事务开始了就不能停止
4.mysql数据库的默认最大连接数
为什么要有最大连接数?
特定服务器上的数据库只能支持一定数目同时连接,这时候我们要设置最多多少连接。
最大连接数100
5.数据库连接池的作用:
限定数据库的连接个数,不会导致数据库连接过多而导致系统崩溃
数据库连接不需要每次被创建或销毁,节约了资源
数据库连接不需要每次都去创建,响应时间快
- 简单说一下你对jdbc的了解
Java自定义接口让数据库厂商自己实现接口,对我们开发者而言,只需要导入厂商开发的实现即可。然后以接口的方法调用(mysql+mysql驱动)
- 简单的jdbc程序。写一个访问的程序
加载驱动
获取连接
设置参数
执行sql语句
关闭连接
前端
- 简单说一下Ajax
什么时ajax :异步的js和xml
作用是什么 :使用ajax与服务器进行数据交换,ajax可以使网页实现局部更新。这意味着可以不重新加载整个网页的情况下,对网页的某部分进行跟新。
使用场景: 登陆失败时不跳转页面,注册账号提示用户已存在
- js和jQuery
Jquery是js的一个框架,封装了js的属性和方法,并且增强了js的功能。让用户用起来更加方便
原声的js要处理很多兼容性的问题,有jQuery封装了底层,就不用考虑兼容性了
- jQuery的常用选择器
Id选择器 通过id获取元素
Class选择器 通过css获取
便签选择器 通过标签获取
通用选择器 获得所有的选择器
层次选择器 儿子选择器 :获取下面的子元素
后代选择器 获取下面后代,包括儿子孙子等后代
框架部分
- MVC模式
当控制器收到来自用户的请求
控制器调用javaBean完成业务
完成业务后通过控制器跳转jsp页面的方式给用户反馈
Jsp做出响应。
- MVC框架
什么是MVC框架
是为了解决传统的MVC模式问题而出现的框架
传统模式问题
所有的servlet的servlet映射都要配置在web.xml中 ,如果项目太大 。Web.xml就会变大,并且不能实现模式化管理。
Servlet接受参数比较麻烦。不能通过model接受,只能单个接受,接受完毕后封装为model
3 .Struts2中的拦截器,你都用它干什么
通过动态配置方式,可以执行action的方法后加入相关的逻辑完成业务
使用场景:
用户登陆判断,在执行action的前面判断是否登陆。如果没有登陆就跳转登录页面
简单讲一下spring的执行流程?
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
- 说一下spring中的两大核心
Spring是什么
Spring
IOC:控制反转,我的service需要调用dao,service就需要创建dao
spring发现你servce依赖于dao就是给你注入
AOP:
面向切面编程
核心原理:使用动态代理的方式在执行前后或出现异常 做后逻辑
我们主要使用Aop来做:
- 事务处理
- 权限管理
- 日志
- AOP是什么?用它做什么
核心原理:使用动态代理的设计模式在执行前后或出现异常加入相关的逻辑
我们主要使用Aop来做:
事务处理 执行方法前 ,开启事务、执行完成后关闭事务,出现异常时就回滚
权限管理 在执行方法前,判断是否具有权限
日志
- 什么是ORM?
ORM 框架可以作为面向对象编程语言和数据库之间的桥梁。
ORM:为了解决面向对象与数据库存在的不匹配的现象的框架来解决
- Hibernate和mybatis的区别
相同点:
都是Orm框架、屏蔽了jdbc 底层的访问细节。都可以完成数据库的持久化操作
Mybatis的好处:
将sql语句与java代码进行分离,提供了将将结果自动封装为实体类对象和对象的集合功能。
Hinernate:
他是一个全自动的orm的映射工具,他可以自动生成sql语句,并将执行返回java结果
不同点:
Hinernate要比mybatis功能强大。因为他可以自发生成sql语句。
Mybatis需要我们自己在xml文件中写sql语句。Hibernate可以很好帮我们完成,但是对于特别复杂的查询hubernate很难适应,这时候有mybatis就是不错的选择。因为他是有我们来写sql语句。
- Hibernate映射对象的状态
瞬时状态:刚刚new语句创建,没有被持久化
不处于session中(没有使用session的方法去操作临时对象)
持久化状态:已经被持久化,加入了session的缓存中,session是没有关闭该状态的对象为持久化对象
游离状态:已经被持久化,但不处于session中
删除状态:
对象有关联的id,并且在session管理下,但是已经被计划(事务提交的时候,commit())删除。如果没有事务就不能删除
- 简单说一下Hibernate的缓存
为什么提供缓存:
为了提高访问速度,把磁盘或数据库变为内存访问
一级缓存:
又称为seeion的缓存
二级缓存:
又称为sessionFactory.默认下不会启动这个插件
什么样的数据适合放在二级缓存中
- 很少修改的数据
- 经常查询的数据
- 不会被并发访问的数据
高级部分
1.有没有使用过liunx 你用它来干嘛
Linux是一个长时间运行比较稳定的操作系统,所以我们一般拿他作为服务器。
2.说一下linux下面的常用命令
Pwd获取当前路径
Cd 跳转到目录
Su-u 切换到管理员
Ls ll 列举目录
文件操作命令:
Tail 查看
Rm -rf 删除
Vi 编辑
3.有没有使用过云主机
没有使用过但是有所了解
云主机就是一些云服务云营商提供的远程的服务器功能,我们在开发者或者企业只需要按付费可以租用对应的服务器
- 数据库优化
- 表的优化
根据自己的业务选择自己合适的字段,不要浪费空间
表的设计尽量符合三范式:
- 第一范式:表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库就自动的满足。
- 第二范式:表中的记录是唯一的, 就满足第二范式, 通常我们设计一个主键来实现
- 第三范式:表中不要有冗余数据, 即表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放.
Sql优化
- 批量插入几百万条数据怎么实现
设置数据库连接池的数量
- 有没有使用过redis ? 是什么
Rdeis是一个key value的非关系型数据库,他是存在内存中的。即使断电数据也不会丢失。支持的数据类型较多
主要用来做缓存数据库的数据和web集群时当作中央缓存存放session
- 简单说一下redis的使用场景
1.高性能
redis 是基于内存的非关系型数据库
2.支持的数据类型丰富
memache :只有字符串一种数据类型
支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型
3. 支持数据持久化
memache : 不支持持久化
redis:支持,比较强大
4. 高可用
redis提供非常好的自动分区功能
5. 各种云端技术都对redis有很好的支持
6. 使用广泛
新浪微博 全球使用redis比例最高的公司
StackOverFlow 博客
github
用途:
1.数据库
2. 缓存
3. 消息队列
8. Redis的类型和使用场景
- String
增 set
删 del
改 自增:incr 自减 decr 增加/减去一个数 incrBy/decrBy 字符串拼接 append
查 get
- hash
适用于存储对象
增 hset hmset
删 hdel
改 增加数 对某个hash键进行拼接
查 hget hgetAll
3. list
底层使用链表实现 集合 增加和删除速度比较快
有序的列表 ,按照插入先后顺序 可以重复的
4. set
无序的,没有重复的
秒杀
5. sortSet
有序的,不可重复的
比分的权重来实现有序。
游戏排名
补充
1.Java8新特性
lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
方法引用
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 ::
函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为lambda表达式。
函数式接口可以现有的函数友好地支持 lambda。
默认方法
Java 8 新增了接口的默认方法。
简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个default关键字即可实现默认方法。
为什么要有这个特性?
首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
- 、线程相关
继承Therad类
实现Runnable接口
.什么是线程死锁
就是多个线程互相等待,造成多不执行的情况.举个例子,两个中国人进门,两个都很有礼貌,都想等待对方先进才能进,结果最后两个都没进都在等待.还有个就是哲学家问题,4个哲学家围在一起吃饭,中间放一只筷子,然后规定他们只有先取左边的筷子再取右边的筷子才能吃饭.我们来分析筷子作为临界值,当大家都拿起左边的筷子的时候,大家发现右边没筷子了,所以都在希望等对方把筷子放下,然后拿右边的筷子,结果一直僵持着.
所以我们知道造成线程死锁的条件:
(1)互斥条件:一个资源每次只能被一个进程使用。比如:4个哲学界,却只有两双筷子
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 比如:他们都不想放下自己手中的筷子
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 比如:他们都不能取抢夺别人手中的筷子
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。比如:所以他们之间就形成了循环等待条件
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTab;le)
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap等)
- Mysql的优化
1、选取最适用的字段属性。
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
2、使用连接(JOIN)来代替子查询(Sub-Queries)。
MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
3、使用联合(UNION)来代替手动创建的临时表。
MySQL 从4.0的版本开始支持UNION查询,它可以把需要使用临时表的两条或更多的SELECT查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。
4、事务。
要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。
5、锁定表。
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。
6、使用外键。
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。
7、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(), MIN()和ORDERBY这些命令的时候,性能提高更为明显。
8、优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。
- leftjoin和fulljoin的区别:
外连接:
LEFT JOIN :以左表为基础,显示左表中的所有记录,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的记录,不匹配的记录以NULL字符填充. left join 是left outer join的简写,left join默认是outer属性的。
FULL JOIN :显示多个表中的所有的记录,不匹配关联条件的列以NULL字符填
- Gc
gc不仅负责垃圾回收,还决定内存分配。
java内存管理主要是对内存中的对象进行内存的分配和回收,我们都知道当我们创建一个对象时,对象的引用放在栈(Stack)中,对象放在堆(heap)中,gc只回收堆里面的对象。当gc检测到一个堆中的一个对象不在被引用时,就会对这个对象进行回收。
当我们创建一个对象时,gc就会监视这个对象的地址,大小以及状态。gc有特定的回收算法,通常使用有向图来记录管理堆中的对象,通过这种方式来确定那些对象正在被引用,那些已经不在被引用,当一个对象不在被引用时,gc就有权回收这个对象。当然可以使用System.gc();Runtime.getRuntime().gc();来显示调用gc。但是java规范不保证gc不一定立即回收。
gc可以使我们在开发时候不用考虑内存回收的事情了,可以防止内存泄漏。
7.restful风格:
restful就是一个资源定位及资源操作的分格。不是标准也不是协议,只是一种分格。基于这个风格设计的软件可以更简介,更有层次,更有益于实现缓存机制。
- Get和post
get主要用于从服务器查询数据,post用于向服务器提交参数
get通过url传递数据,post通过http请求传递数据
Get传输数量有限制,不能大于2kb,post传递的数据量较大,一般大量的数据提交都是通过post方式
Get安全性较低,容易在url中暴露数据,post安全性较高
- http与https的区别:
- https协议需要申请证书,一般免费证书较少,因而需要一定费用
- http超文本传输协议,信息是明文传输,https则是安全性的ssl加密传输协议
- http和https使用的完全不同的连接方式,用的端口号也不一样,前者是80,后者是443
- http的来连接很简单,是无状态的;HTTPS协议是由ssl+HTTP协议构建的可进行加密传输、身份认证的网络协议比http协议安全
- 、熟悉JVM,包括内存模型、类加载机制以及性能优化
JVM类加载机制
概述:JVM要想执行class文件,首先会将文件载入虚拟机的方法区内,根据类文件的格式相应的存放数据。在需要产生对象时,从方法区中获取对应的类信息,在堆中建立对象。
内存模型:
- 程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址,java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序记数器,互不影响,该区域为“线程私有”
- Java虚拟机栈:线程私有的,与线程生命周期相同,用于储存局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用
- 本地方法栈:跟虚拟机很像,不过他是为虚拟机使用到的Native方法服务
- Java堆:所有线程共享的一块内存区域,对象实例化几乎都在这分配内存
- 方法区:各个线程共享的区域,对象实例几乎都在这分配内存
- 运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译似的数字常量方法或者域的对象
Io
java中有几种流:
字节流和字符流
区别:字节流直接操作文本
字符流数据先放在缓冲区之后,再从缓冲区写入文件
如果在操作中 字符流和字节流完成之后都不关闭输出流,那么字节流就会的发生改变,字符流却没有发生改变
这是因为字符流操作使用了缓存区,而关闭字符流时会强制将缓存区的内容输出,但是如果没有关闭,则缓存区的内容无法输出(这一点证明字符流使用了缓存区,字节流没有使用)
对于我们来说,所有的文件在硬盘或传输是都是以字节的方式进行包括图片都是以字节的方式存储的,而字符只有在内存中才能形成,所以在开发中字节流好
分布式、集中式
集中式:
一台机器:所有的东西(软件)都放在此计算机上
分布式:
多台机器:讲东西进行划分,每台机器都存放一部分。
Git和svn:
svn的优点:
- 管理对象,逻辑明确,符合一般人思维习惯
- 易于管理,集中式服务器更能保证安全性
- 代码一致性非常高
- 适合开发人数不多的项目开发
缺点:
- 服务器压力大,数据容量暴增
- 如果不能连接到服务器,基本上不可以工作,如果服务器连接不上就不能提交,还原、对比等
- 不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
Git:
优点:
- 适合分布式开发,强调个体
- 公共服务器压力和数据量都不会太大
- 速度快、灵活
- 任意两个开发者之间可以很容易的解决冲突
- 离线工作
缺点:
- 学习周期相对而言比较长
- 不符合常规思维
- 代码保密性差,一旦开发者把整个克隆下来就可以完全公开所有代码和版本信息
SpringMVC执行原理:
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet控制器查询一个或多个HandlerMapping找到处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller调用业务逻辑处理后,返回ModelAndView
- DispathcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示到客户端
总结来两天的面试题