19-07-22-19年基础面试题整理

19年面试题

Posted by Wangchenchen on 2019-07-23

最近想着整理下关于Java基础的面试题,总结如下:项目要清晰,自己负责的模块要在花时间进行一些整理,其次就是面试题的刷,坚持刷,就肯定会记的的;

一. 面试题:
1.简单讲下Java跨平台的原理:

​ 不管是windows或者Linux都是通过指令集对电脑进行指令操作,但是由于系统的不一样所以会有不一样的指令集,但是咋Java开发中在中间层添加了一个虚拟机JVM,只需要在不同的系统上提前安装不一样的虚拟机就可以了,这时不论你的编写程序是在什么环境,只要您在运行的地方提前安装了JVM就可以保证程序是可以正常运行的;​

2.搭建一个Java环境的步骤:

​ 安装jdk;

​ 安装编辑器IDEA;

​ 安装web服务器Tomcat;

重点是要在环境变量中配置JAVA_HOME因为后面的IDEA和tomcat都是以来这个变量;

在IDEA setting中找到tomcat将本地下载解压的地址配置进去,设置端口号安装一些插件就好了;

后面在根据情况安装一些svn/git;

3.JAVA中int数据占几个字节?

基本类型占的字符

int占4个字节32位;

4.面向对象的4大特征?

​ 封装,抽象,继承和多态;

​ 封装·将对象封装成一个高度自治和相对封闭的个体,这个对象所有的属性,由自己提供方法读和写;

​ 抽象·找出事物的相似和共性之处,然后将共同的地方抽调为一个单独的类,这个类只专属为某个动作或某个事物服务;

​ 继承· 定义或者实现一个类的时候可以在另一个类的基础上实现,实现后即有父类的特称也可以加入新的特征,也可以改写父类的特征;

​ 多态· 以父类类型指向子类对象;

5.java中的包装类有哪些?
基础类型 包装类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
6.什么是拆箱和装箱?

​ 拆箱:将包装类型会转变成基础类型;

​ 例: integer->int integer i = 1; int j = i;

​ 装箱:将基础类型装变成包装类型;

​ 例: int -> integer :

​ Integer.valueOf(1);

​ Integer i = 1;//自动装箱

7.为什么有装箱和拆箱:

​ 因为java是一项面向对象的语言,但是基本数据类型不具备面向对象的特征;

8.说说 “==”和equals的区别?

​ 先说“==”:用来判断两个变量之间的值是否相等,变量就可以分为基本类型和引用数据类型;

​ 如果是基本数据类型:

​ 直接比较值

​ 如果是引用数据类型:

​ 比较的是两个变量所指向内存的首地址;

​ 之后在来说一说”equals“ 用来判断两个对象的某些特征是否一样,实际上就是调用对象的equals方法进行比较;

9.谈谈String和stringBuilder的区别(final)?StringBuffer和StringBuilder的区别?

​ java提供三个类String StringBuffer StringBuilder 来表示字符串,字符串就是多个字符的集合;

​ String是内容不可变的字符串,底层使用了不可变字符数组(final char[]);

​ StringBuilder和StringBuffer是可变的字符串,它们底层的数组没有使用final来修饰;

​ 线程安全问题:

​ StringBuilder 是线程不安全的,但是效率比较高;

​ StringBuffer 是线程安全的,但是效率比较低;

10.谈谈对数组的认识?

​ Map接口和Collection接口是所有集合的父接口;

java数组类结构

11.讲一下都有什么特征?

​ 11.1:从上面可知,集合分为两种一种是map(键值对形式—–key value)还有一种是存储形式,

​ 先说说存储:

​ list:有序的可以重复;

​ set:无序的不可以重复;根据equals和hashcode进行判断,意思就是一个对象存储在set中就必须重写equals和hashcode的方法;

​ map:就是一对键值,键值,它们之间可以有一个是空值但是不可以全部都是空值;

​ 11.2:ArrayLIst和LinkedList的区别?

​ List中常用的是arraylist和linkedList两个:

​ ArrayList:底层使用的是数组;里面的内存是连续的,特点是查找特定元素比较快但是,增加删除,修改比较慢;总结,查询一般用arraylist比较多;

​ LinkedList: 底层使用的是链表,里面的内存是不连续的,但是每一块存放上面一块的地址,和下一块的地址,特点是查询时需要从头开始查,所有会比较慢,插入时不需要移动移动内存,只需要改变引用指向,所以插入删除效率比较高;总结:添加和删除一般用linkedList比较多;

​ 11.3:HashMap和hashTable有什么区别? HashTable和conCurrentHashMap的区别?

​ 相同点:HashMap 和HashTable都可以使用存储key—-value的数据。

​ 不同点:

​ 11.3.1 HashMap是可以把null作为key或value的,而hashTable不可以的;

​ 11.3.2 HashMap是线程不安全的,效率高;而hashTable是线程安全的,效率低;

​ 11.3.2.1:了解以下hashMap为什么不安全?

​ jdk1.8中,Hshmap,中使用了个node<k,v>数组,数组中定义了一个node类型的变量next,就说明它是一个链表的结构,还有一点,hashMap具有自动扩容的功能,在重新计算每个元素在数组中的位置;存储的内容key一样的会指向同一个内存,具备以上三个点,多个线程在put()时,假设有两个key一样,就会同时对一个node去扩容,同时计算位置,但只有一个会存入进去,其他都会丢失;

​ 11.4:我想线程安全又想效率高怎么办?

​ 效率比较:ConCurrentHashMap > SynchronizedMap > HashTable;

12.实现一个拷贝文件工具类使用字节流还是字符流?

​ 如果是音频,图片,歌曲是使用字节流;如果是文本尤其是中文的时候要使用字符流;

​ 12.1 具体说一说:

​ inputStream和outPutStream是字节流,主要用来处理字节或二进制;

​ writer和reader是字符流,一个字符占两个字节,主要用来处理字符和字符串;

​ 所有字符流都是虚拟机将2位的字节的unicode字符为单位的字符而成;

在磁盘上都是以字节保存的;

13.线程的几种实现方式?启动方式?区分?

​ 13.1 实现方式:

​ 13.1.1 通过继承Thread类实现一个线程;

​ 13.1.2 通过继承Runnable接口实现一个线程;

java只支持单继承,如果一个类继承Thread就不能在继承其他类了

​ 13.2 怎么启动?

​ Thread thread = new Thread(继承了Thread的对象/实现了Runnable的对象)

​ thread.setName(“设置一个线程名”);

​ thread.start();

启动线程使用的是start方法,而启动以后执行的是run方法;

​ 13.3 怎么区分线程?

​ thread.setName(“设置一个线程名”);

14. 有没有使用过线程并发库?

​ java通过Executors提供四种静态方法创建四种线程池,分别是:

​ newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

​ newFixedThreadPool 创建一个定长线程池,可控制最大并发数,超出的线程会在队列中等待;

​ newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行;

​ newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行;

15.线程池的作用?

​ 限制线程的个数不会由于线程过多运行缓慢或奔溃;

​ 线程池不需要每次创建和销毁;

​ 响应时间很快;

16.讲一下什么是设计模式?常用的设计模式有哪些?

​ 16.1 就是可以解决特定问题的设计方法;

​ 16.2 单例(饱汉和饥汉)

​ 16.2.1 构造方法私有化,除了自己类中能创建其他地方都不能创建;

​ 16.2.2 在自己的类中创建一个单例(饱汉是一开始就创建,饥汉是需要的时候才创建)

​ 16.2.3 提供一个方法获取该实例对象(创建时需要进行方法同步)

​ 16.3 工厂模式:

​ spring IOC 就是使用了工厂模式,将对象的创建都交给了工厂;

​ 16.4 代理模式:

​ spring AOP 就是使用了动态代理。

17.讲讲http get和post请求的区别?

​ 17.1首先它们都是http请求,get一班用于请求,而post一般用于更新资源;

​ 17.1.1 get 会在地址栏显示,但是post不会,get请求的参数会在url后,用?分割;但post把数据放在 http包中;

​ 17.1.2 get,传输的数据通过浏览器地址栏所以数据长度有限,但是post是通过http包所以地址栏长度限制于它无关;

​ 17.1.3 post 比get安全;

18.说说你对servlet的理解?或者servlet是什么?

​ 18.1 主要是交互的浏览和修改数据,生成动态web内容,servlet运行于支持java的应用服务器中;

​ httpServlet重写doGet和doPost方法或者你也可以重写service方法完成对get和post请求的响应;

19.简单说下servlet的生命周期?

​ servelt 有良好的生存期定义,包括实例化,初始化,处理请求,以及服务结束;都是在 javax.servelt.Servlet接口的init,service和destory方法表达;

​ 过程:加载Servelt的class—> 实例化Servlet ——> 调用Servelet的init完成初始化 —–>响应请求 ——> 关闭·servelt的方法;

20.servelt 中 forward() 与 redirect() 的区别?

​ 20.1 forward()是服务端的转向,redirect()是客户端的跳转。

​ 20.2 使用forward浏览器的地址不会发生改变,而redirect会发生改变;

​ 20.3 forward是一次请求中完成,而redirect是重新发起请求。

​ 20.4 forward是在服务器完成,而不用客户端重新发起请求;

21.什么是jsp?

​ 服务器页面

22.jsp和Servlet有哪些相同点和不同点?

​ JSP是Servlet的技术扩展,所有jsp文件都会被翻译为一个继承HttpSevlt的类,所以说jsp最后也是一个servelt

​ 不同点:jsp测重视图而servlet侧重于逻辑。

23.jsp有哪些内置对象?作用本别是什么?

​ 9个内置对象:

​ request 用户端请求,此请求会包含来子get/post请求的参数

​ response 页面传回用户端的回应。

​ pageContext: 管理网页属性

​ session 与请求有关的会话期

​ application: servlet正在执行的内容

​ out 传送回应的输出

​ config : servelt的构架部件

​ page: JSP 网页本身

​ exception 针对错误网页,未捕捉的例外

​ 有四大作用域:

​ pageContext request session application

​ jsp能传递值,request,session,application,cookie也能传值

24.说下session和cookie的区别,都在哪些地方用过它们?

​ session和cookie都是绘画跟踪技术,cookie通过客户端记录信息确定用户身份,session通过服务端记录信息确定用户身份,生成一个唯一的·sessionId存在客户端;

​ cookie和session的区别:

​ 24.2.1cookie数据在浏览器上,session数据在服务器上

​ 24.2.2 使用上cookie不是很安全,只有session才是比较安全的;

​ 24.2.3 session会在一定的时间内保存在服务器上。当访问多占用你服务器性能时,可以考虑cookie

​ 24.2.4 单个cookie保存不超过4k,一个站点最多保存20个cookie。

​ 24.2.5 登陆信息放session其他信息可以放cookie

25. MVC的各个部分都有哪些技术来实现?

​ M(model) 模型 javabean

​ V(view) 视图 html jsp volicity freemaker

​ C(control) 控制 Servlet Action

26. 数据库分类,常用数据库

​ 关系型: mysql oracle sqlserver

​ 非关系型: redis mongodb

27 数据库的三大范式

​ 就是规范,想要满足第二范式就要先满足第一范式,要满足第三范式就必须先满足第二范式;

​ 27.1 第一范式 :每一列都是不可分割的基本数据项,同一列中不能有多个相同的值;

​ 27.2 第二范式: 非主键列完全依赖于主键;

​ 27.3 第三范式:非主键列直接依赖于主键

28.事务的四个基本特征?

​ 事务是一个并发控制单位,指用户定义的一个操作序列,这个操作序列要么都做要么都不做;

​ 事务的基本特性: 原子性(要么都成功,要么都失败),一致性(失败了要对前面回滚),隔离性(一旦开始不能有其他事务干扰), 持久性(事务开始就不能终止),

29.mysql数据库最大连接数?

​ 100

30.mysql分页?oracle分页?

​ mysql关键字limit来进行分页,limt offset,size 表示从多少索引去多少位。

1
2
3
mysql:
String sql =
"selet * from students order by id limit"+pageSize*(pageNumber-1)+pageSize;

​ oracle分页,三层嵌套查询

1
2
3
4
5
oracle:
String sql =
"select * from " +
(select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" +
"where t>" + pageSize*(pageNumber-1);