Java面试总结(2018)

1. 请讲讲冒泡排序 、快速排序这两种排序的原理
冒泡排序原理
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
快速排序原理
先定义两个指针,一个在最前面,一个在最后面,第一次要对数组进行划分,先找出一个中间数,
一般默认把第一个数作为中间数,然后从后往前找比中间数小的,把他放在前一个指针的位置,
在从前往后找比中间数大的,找到后把它放在第二个指针的位置,直到前面和后面的指针指向同一个位置,
我们就把中间值放在这里即可,这样根据中间数,把整个需要排序的数组分为两部分,
前一部分都小于中间数,后一部分都大于中间数,此时这两部分的数还是无序的,最后递归调用排序方法,对两部分分别进行排序即可。
2.请手写一下冒泡排序,接着再用递归的方式写一遍

/**
 *@Description: 这题面试频率极高,可以说是必来的
 *@Author: https://blog.csdn.net/chen_2890
*/
public class Test{

    public static void main(String[] args) {
    // 12,45,9,67,455,用冒泡排序实现升序排列。
        int[] arr = { 12, 45, 9, 67, 455 };
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                   }
               }
           }
        System.out.println("排序后:");
        for (int i = 0; i < arr.length; i++)
        System.out.print(arr[i] + "\t");
        
        
         //创建一个数组用于排序
        int[]arr2={1,4,3,2,6,12,10};
        //调用递归的冒泡
        arr2=recursiveBubble(arr2,arr2.length);
        for(int i=0;i<arr2.length;i++){
            System.out.print(arr2[i]);
        }
     
     
     }
    //冒泡排序之递归方法
    public static int[] recursiveBubble(int[] arr2,int e){
        if(e==0){
            return arr2;
        }
        else{
            for(int i=0;i<e-1;i++){
                int temp=0;
                if(arr2[i]>arr2[i+1]){
                    temp=arr2[i];
                    arr2[i]=arr2[i+1];
                    arr2[i+1]=temp;
                }
            }
            e--;
            //System.out.println(e);
            recursiveBubble(arr2,e);
        }
        return arr2;
    }
}
3.讲讲你理解的递归
递归就是方法里调用自身。

出口:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

效率:递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

栈溢出:在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

4.List和set集合的区别
set集合中的数据没有顺序,且如果add两个一样的对象或基本类型的数据,set集合里也是只有一个,
即set集合中的数据都是独一无二的;不能使用加强的for循环;
list中的数据是有顺序的,可以加入多个一样的对象和基本类型的数据,可使用加强的for循环;
5.如何让list变成线程安全
使用Collections.synchronizedList();    把new关键字换一下就可以了其他的都没变

//让list变成线程安全写法
List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());
1
2
6.ArrayList和LinkedList的区别
ArrayList 是基于动态数组的数据结构,LinkedList 是基于链表的数据结构;
对于随机访问 get 和 set,ArrayList 较优,因为 LinkedList 要移动指针;
对于新增和删除操作 add 和 remove,LinedList 较优,因为ArrayList 要移动数据。
7.ArrayList和Vector的区别
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),
而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
当Vector或ArrayList中的元素超过它的初始大小时,
Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
8.HashTable和HashMap的区别
Hashtable的方法是同步的,而HashMap的不是。
HashMap 允许空键值,Hashtable 不允许
9.get和set区别
get和set在英文中就是获取和存放的意思,
在java中一般定义get的方法都是用来取值,set是用来赋值的,
方法名都是自定义的,只不过用get和set比较通用,给人一看就能明白是取值和赋值的方法
10.request和session区别
最大的不同是生命周期
request:生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一起请求,当请求完毕之后,request里边的内容也将被释放
session:也是针对一个客户端,但是却是在别人设置的会话周期内(一般是20-30分钟) session里边的内容将一直存在,即便关闭了这个客户端浏览器 session也不一定会马上释放掉的
javabean对应的scope为request、session的不同
request:如果是request,在不同的页面,这个bean是不同的,也就是说你在不同的页面对同一个ID的bean操作,不会影响到其他页面。
session:如果是session的话,你在所有页面的bean是同一个,在任意一个页面操作它,在其它页面也能看它改变了。
11.cookie和session的区别
session:

session机制采用的是在服务器端保持状态的方案
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE
cookie:

cookie机制采用的是在客户端保持状态的方案
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session
12.localStorage和cookie有什么区别?
localStorage全部浏览器都支持,cookie全部浏览器也都支持
localStorage可以存储5m的大小,cookie存储4kb的大小
localStorage都是以字符串的方式存储,所以存储内容是json的时候,未来使用这个数据的时候需要使用eval转化(string转json)
13.wait和sleep的区别(线程)
sleep()来自 Thread 类,wait()来自 Object 类;
调用 sleep()方法,线程不会释放对象锁。而调用 wait 方法线程会释放对象锁;
sleep()睡眠后不出让系统资源,wait 让其他线程可以占用 CPU;
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒。而 wait()需要配合 notify()或者 notifyAll()使用。
14.说说你对多态的理解
现象:一个调用语句出现多种形态。
实现多态的三个条件:1)要有继承;2)要有方法重写;3)要有父类指针(引用)指向子类对象。2.实现多态的三个条件:1)要有继承;2)要有方法重写;3)要有父类指针(引用)指向子类对象。
多态的原理:动态连编,根据实际对象的类型来判断重写方法的调用。多态的原理:动态连编,根据实际对象的类型来判断重写方法的调用。
15.你听说过静态多态和动态多态吗
面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态。
应用形式上:
静多态是发散式的,让相同的实现代码应用于不同的场合。
动多态是收敛式的,让不同的实现代码应用于相同的场合。
思维方式上:
静多态是泛型式编程风格,它看重的是算法的普适性。

动多态是对象式编程风格,它看重的是接口和实现的分离度。

16.1个英文字母等于多少字节(或一个中文占几个字节)
ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节
17.如何获取下一天的时间
/**
 *@Description: 经典面试题
 *@Author: https://blog.csdn.net/chen_2890
*/
public class Test{

    public static void main(String[] args) {
           // 获取Calendar的实例
           Calendar cal = Calendar.getInstance();    
        // 28天之后的日期
        // cal.add(Calendar.DAY_OF_YEAR,28);
        // 28 天之前的日期
        // cal.add(Calendar.DAY_OF_YEAR,-28);
        // 8个月以后的今天是几号
        // cal.add(Calendar.MONTH,8);
        // 1 年以后的今天是几号
               cal.add(Calendar.YEAR,1);

               System.out.println(cal.getTime().toLocaleString());
     
     }
}     
18.Calendar是单例吗
不是,代码说明如下:

/**
 *@Description: Calendar不是单例
 *@Author: https://blog.csdn.net/chen_2890
*/
public class Test{

    public static void main(String[] args) {
        //Calendar实例1
        Calendar c1 = Calendar.getInstance();
        //Calendar实例2
        Calendar c2 = Calendar.getInstance();
        //获取下一天的时间
        c1.add(Calendar.DAY_OF_YEAR,+1);
        //打印
        System.out.println(c1.getTime().toLocaleString());
        System.out.println(c2.getTime().toLocaleString());
        //打印出来的时间不一样,说明不是同一个对象,即Calendar不是单例的
     
     }
}     
19.Servlet/Filter的生命周期
第一次请求Servlet的时候,此时会调用Servlet的init方法,初始化这个Servlet,Servlet只需要初始化一次,在当前tomcat不关闭的情况下,就会一直提供服务
初始化完成之后,调用Servlet的中方法doGet、doPost方法(根据请求方式自动识别),处理业务
业务处理完成,响应数据
当处理完某次请求之后,servlet就进入等待状态,等待浏览器的下一次请求
当关闭tomcat的时候,自动销毁servlet
20.什么是工作流
简单地讲,工作流是指整个或部分经营过程在计算机支持下的全自动或半自动化。
在实际情况中可以更广泛地把凡是由计算机软件系统(工作流管理系统)控制其执行的过程都称为工作流。
一个工作流包括一组活动及它们的相互顺序关系,还包括过程及活动的启动和终止条件,
以及对每个活动的描述。

21.JSP的九大内置对象,是哪些?各代表什么?(web那块的知识点很少,不太好问)
out:页面输出
page:当前页面
pageContext:当前上下文(编译之后的当前页面)
request:请求
response:响应
session:会话
application(ServletContext):tomcat启动的时候自动创建,tomcat停止的时候,自动销毁
config:配置文件(获取在web.xml中配置的Servlet的init-param配置信息)
exception:异常
22.常见的表单元素
- 文本域、密码域、单选按钮、复选框、按钮、重置按钮、提交按钮、隐藏域、上传域、图片域、下拉列表、lable、文本区域

- HTML5拥有多个新的表单输入类型。这些新特性提供了更好的输入控制和验证。

  1.Input 类型- email

  email 类型用于应该包含e-mail 地址的输入域。在提交表单时,会自动验证email 域的值。

  2.Input 类型- url

  url 类型用于应该包含URL 地址的输入域。在提交表单时,会自动验证url 域的值。

  3.Input 类型- number

  number 类型用于应该包含数值的输入域。您还能够设定对所接受的数字的限定:

  4.Input 类型- range

  range 类型用于应该包含一定范围内数字值的输入域。

  range 类型显示为滑动条。

  您还能够设定对所接受的数字的限定:

  5.Input 类型- Date Pickers(数据检出器)

  HTML5 拥有多个可供选取日期和时间的新输入类型:

  date - 选取日、月、年

  month - 选取月、年

  week - 选取周和年

  time - 选取时间(小时和分钟)

  datetime - 选取时间、日、月、年(UTC 时间)

  datetime-local - 选取时间、日、月、年(本地时间)

  6.Input 类型- search

  search 类型用于搜索域,比如站点搜索或Google 搜索。

  search 域显示为常规的文本域。

23.前端选择器有哪些(能说出常见几种即可,当然知道的越多越好)
通配符选择器
ID选择器
类别选择器
子元素选择器
元素过滤选择器
标签选择器
伪类选择器
兄弟选择器
兄弟选择器(所有)
标签[属性]选择器
24.https和http的区别
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
25.什么是盒子模型
盒子模型,英文即box model。无论是div、span、还是a都是盒子。

但是,图片、表单元素一律看作是文本,它们并不是盒子。这个很好理解,比如说,一张图片里并不能放东西,它自己就是自己的内容
一个盒子中主要的属性就5个:width、height、padding、border、margin。如下:

width和height:内容的宽度、高度(不是盒子的宽度、高度)。
padding:内边距。
border:边框。
margin:外边距。

26.Spring MVC流程
Model(模型):包含数据和行为。不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。

View(视图):负责进行模型的展示,一般就是展示给用户的界面。

Controller(控制器):接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示,起了调度的作用。

Spring MVC围绕DispatcherServlet设计。

处理流程:

1.客户端发出HTTP请求,服务器接收

如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),Web容器将该请求转交给DispatcherServlet处理。

2.DispacherServlet接收到此请求后,根据请求的信息(URL、HTTP方法、请求报头文、请求参数、Cookie等)及HandleMapping的配置匹配Handler

匹配成功,则返回一个HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)。

3.DispacherServlet得到Handler后,把Handler封装为适配器

以适配器接口真正调用了处理器的功能处理方法(先执行拦截器的preHandler方法)

返回ModelAndView(如其名,包含了视图逻辑名和模型数据信息)。

4.DispacherServlet借由ViewResolver完成逻辑视图名到真实对象的解析工作。

5.DispacherServlet得到视图对象View,使用它对ModelAndView中的模型数据进行渲染。

6.客户端得到响应(可能是HTML页面、XML、JSON串、PDF……)

27.你知道有哪些设计模式
单例模式:

保证一个类仅有一个实例,并提供一个访问它的全局访问点
1
工厂模式:

为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的
1
建造(Builder)模式:

是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
1
观察者模式:

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式又叫发布-订阅(Publish/Subscribe)模式
1
适配器(Adapter)模式:

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
1
代理模式:

为其他对象提供一种代理以控制对这个对象的访问。也可以说,在出发点到目的地之间有一道中间层,意为代理。
1
28.常见的sql函数有哪些(能说出常见几种即可,当然知道的越多越好)
----统计函数---- 
AVG  --求平均值 
COUNT  --统计数目
MAX  --求最大值
MIN  --求最小值
SUM  --求和

----日期函数----
DAY()  --函数返回date_expression 中的日期值
MONTH()  --函数返回date_expression 中的月份值
YEAR()  --函数返回date_expression 中的年份值

----算术函数----
三角函数:
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
反三角函数:
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角 
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角

----字符串函数----
CHAR()  --函数用于将ASCII 码转换为字符
LOWER()  --函数把字符串全部转换为小写
UPPER()  --函数把字符串全部转换为大写
STR()  --函数把数值型数据转换为字符型数据
LTRIM()  --函数把字符串头部的空格去掉
RTRIM()  --函数把字符串尾部的空格去掉

----系统函数---- 
APP_NAME()   --函数返回当前执行的应用程序的名称 

ok,Java面试总结到这里
一定会及时更新最新Java面试题
要是对我的文章感兴趣的话,就快关注我吧
--------------------- 
作者:我要取一个响亮的昵称 
来源:CSDN 
原文:https://blog.csdn.net/chen_2890/article/details/84312126 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/Architect_CSDN/article/details/87779498