码迷,mamicode.com
首页 > 其他好文 > 详细

面试集锦(二)

时间:2018-11-29 01:34:29      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:它的   交互   app   从服务器   大量   效率   状态   序列   value   

java基础篇

1、BS和CS的区别以及优缺点
2、httpclient
3、什么是事务?
4、事务的传播特性
5、事务的隔离级别
6、事务的传播行为
7、HashMap的底层代码/原理
8、hashmap和hashtable的区别
9、String、StringBuffer、StringBuilder的区别
10、set、list、collection、collections的区别
11、Vector和ArrayList的区别
12、冒泡排序
13、二叉树
14、什么是单例、多例?
15、懒汉式单例模式
16、饿汉式单例模式
17、线程安全式单例模式
18、接口和抽象类的区别
19、get与post请求的区别
20、&和&&的区别
21、==和equals的区别
22、Integer和int的区别
23、
24、运行时异常与一般异常有何不同
25、多线程介绍
26、列举线程池和业务场景
27、jquery的10个常用方法
28、jquery的常用选择器
29、Ajax
30、ajax常用的属性
31、Tomcat优化
32、hibernate优化
33、序列化和反序列化
34、面向对象的特性有哪些方面
35、集群
36、JDK的版本特性
37、linux中的命令
38、jvm相关
39、jvm优化
***

1、BS和CS的区别以及优缺点
BS是浏览器/服务器架构,客户端只要安装一个浏览器,服务器安装数据库,浏览器通过web server跟数据库进行数据交互。
CS是客户端/服务器架构,需要安装专用的客户端软件才能操作,服务器通常采用高性能的pc、工作站或小型机,并采用大型数据库系统。

BS客户端的计算机配置要求较低,可以在任何地方通过浏览器进行访问而不用安装任何专门的软件,客户端不需要安装以及维护。
CS客户端的计算机配置要求较高,每一个客户端都必须安装和配置软件,能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器,所以客户端响应速度快,但客户端维护和升级成本高。

2、httpclient
httpclient是apache的子项目,用来提供高效的、最新的、功能丰富的支持http协议的客户端编程工具包,并且它支持http协议最新的版本和建议,是一个轻量级的框架,灵活易用,适用于多项目之间的数据传输。

httpclient使用步骤
(1)创建httpclient实例
(2)创建连接方式实例,有两种连接方式,getMethod和postMethod
(3)执行httpclient对象的excute方法
(4)读取response方法
(5)处理返回结果,如果状态码为200,说明连接成功,然后再执行response.getEntity()获取相应的实体,使用super.outString()将数据传输给前台
(6)关闭资源,释放连接

项目中的应用以及遇到的问题
当时我们在做xxx项目时,其中一个功能模块,需要调用本公司另一个项目组数据,当时项目经理让我去完成,我就想到使用httpclient来实现,通过上网找资料和看以前的笔记。
首先导入httpclient相关的jar包,通过以上6步连接要调用的项目,开始添加时出现了乱码问题,后来在postMethod中加上编码集设置postMethod.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8")后,解决了乱码的问题。在文件上传时要注意上传的文件名,和要调用的项目中接收的文件名一致。

3、什么是事务?
在数据库中,事务是指一组sql语句,当这组sql语句中的一部分操作失败,整个事务回滚,只有全部正确才能提交。

4、事务特性
事务的ACID特性
(1)原子性Atomicty:事务是一个不可分割的工作单元,事务中的操作要么都执行成功,要么都执行失败。
(2)一致性Consistency:事务必须使一个数据库数据从一个一致性状态变到另一个一致性状态
(3)隔离性Isolation:一个事务的执行不能被其它事务干扰。
(4)持续性Durability:一个事务一旦被提交,它对数据库中数据的改变是永久性的。

5、事务的隔离级别
数据库事务的隔离级别有四种,由低到高分别是读未提交、读提交、重复读、序列化。在事务的并发操作中,可能会出现脏读、不可重复读、幻读。
(1)读未提交,就是一个事务可以读取另外一个未提交事务的数据。
(2)读提交,就是一个事务要等另外一个事务提交后才能读取数据。oracle和sql server的默认隔离级别。
(3)重复读,就是在开始读取数据时,不再允许修改操作。mysql的默认隔离级别。
(4)序列化,是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读和幻读,但这种事务隔离级别效率低,比较耗数据库性能,一般不使用。

6、事务的传播行为
事务的传播行为,是指多个事务方法相互调用时,事务如何在这些方法间传播。spring支持7种事务传播行为
(1)propagation_required:支持当前事务,如果不存在,则新建事务
(2)propagation_supports:支持当前事务,如果不存在,则非事务的方法运行
(3)propagation_mandatory:支持当前事务,如果不存在,则抛出异常
(4)propagation_required_new:新建事务,如果存在当前事务,把当前事务挂起
(5)propagation_not_supported:非事务方法运行,如果存在当前事务,把当前事务挂起
(6)propagation_never:非事务方法运行,如果存在当前事务,抛出异常
(7)propagation_nested:运行在一个嵌套的事务中,如果不存在,则执行与propagation_required类似的操作

7、HashMap的底层代码/原理
HashMap底层是一个数组结构,数组中的每一项又是一个链表。
当新建一个HashMap时,就会初始化一个数组,Entity就是数组中的元素,每个Entity其中就是一个键值对,它持有一个指向下一个元素的引用,这就构成了链表。
HashMap底层采用一个Entity数组来保存所有的键值对,当需要存储一个Entity对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组中上的链表中的存储位置。
当需要取出一个Entity对象时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置中的链表中取出该Entity。
默认是构建一个初始容量为16,负载因子为0.75的HashMap。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过160.75=12时,就把数组的大小扩展为 216=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

8、hashmap和hashtable的区别
hashmap基于Map接口的实现,hashtable是基于Dictionary类。
hashmap是线程不安全的,hashtable是线程安全的。
hashmap允许空值空键,hashtable不允许空值空键。

9、String、StringBuffer、StringBuilder的区别
它们都是用来定义字符串的。
String是一个字符串常量,被final修饰过,长度不可变,拼接字符串时使用+=,每一次拼接字符串都会是一个新的内存空间。
StringBuffer是字符串变量,存在缓存区,长度可变,拼接字符串使用append,不需要占用新的内存空间,有synchronized,所以线程安全。
StringBuilder也是字符串变量,和StringBuffer差不多,但是没有同步锁,所以线程不安全。

在项目中,我们最常用的是String,因为使用比较简单,不需要new对象,还提供了许多方法,虽然StringBuffer的效率比这个高,但是在数据量小时,差不了多少,只要在大数据量拼接时才会使用StringBuffer和StringBuilder。

10、set、list、collection、collections的区别
set是无序、可重复的集合接口。
list是有序,可重复的集合接口。
collection是集合的顶层接口,继承于它的接口主要有set和list。
collections是封装了一系列关于集合操作的静态方法的一个工具类。

11、vector和arrayList的区别
vector是线程安全的,arraylist是线程不安全的,由于线程的同步会影响性能,所以arralist的性能比vector好。
当vector或arraylist中的元素超过它的初始大小,vector会将它的容量翻倍,而arrylist只增加50%,所以arraylist有利于节约内存空间。

12、冒泡排序

    /**
     * 冒泡排序的基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
     *
     * 代码实现:
     * 
     * 设置循环次数。
     * 
     * 设置开始比较的位数,和结束的位数。
     * 
     * 两两比较,将最小的放到前面去。
     * 
     * 重复2、3步,直到循环次数完毕。
     */
    public void bubbleSort(int[] a) {
        int len = a.length;
        int temp;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len - i - 1; j++) { //注意第二重循环的条件
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }

13、二叉树

14、什么是单例、多例?
(1)单例,所有的请求都用一个对象来处理,比如service和dao层的对象通常都是单例的。
(2)多例,每个请求用一个新的对象来处理,比如action。
就好比,你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例。你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例。

15、懒汉式单例模式

/**
 * 对于Version3中可能出现的问题(当然这种概率已经非常小了,但毕竟还是有的嘛~)
 * volatile关键字的一个作用是禁止指令重排,把instance声明为volatile之后,对它的写操作就会有一个内存屏障(什么是内存屏障?),这样,在它的赋值完成之前,就不用会调用读操作。
 *
 * 注意:volatile阻止的不singleton = new Singleton()这句话内部[1-2-3]的指令重排,而是保证了在一个写操作([1-2-3])完成之前,不会调用读操作(if (instance == null))。
 *
 * 懒汉式单例
 * version4 只需要给instance的声明加上volatile关键字即可
 */
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

16、饿汉式单例模式

/**
 * 懒汉式单例
 * 最简单写法version 1
 */
public class Singleton {
    private static Singleton instance;

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

17、线程安全式单例模式

/**
 * 对于Version3中可能出现的问题(当然这种概率已经非常小了,但毕竟还是有的嘛~)
 * volatile关键字的一个作用是禁止指令重排,把instance声明为volatile之后,对它的写操作就会有一个内存屏障(什么是内存屏障?),这样,在它的赋值完成之前,就不用会调用读操作。
 *
 * 注意:volatile阻止的不singleton = new Singleton()这句话内部[1-2-3]的指令重排,而是保证了在一个写操作([1-2-3])完成之前,不会调用读操作(if (instance == null))。
 *
 * 懒汉式单例
 * version4 只需要给instance的声明加上volatile关键字即可
 */
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

18、抽象类和接口的区别
(1)一个类只可以继承一个抽象类,可以实现多个接口
(2)抽象类可以有构造方法、普通成员变量,静态方法,但接口都没有
(3)抽象类可以有非抽象的普通方法,但接口没有,所有的方法都必须是抽象的
(4)抽象类的抽象方法的访问类型可以是public、protected和默认类型,接口的抽象方法只可以是public类型
(5)抽象类和接口都可以包含静态成员变量,抽象类的静态成员变量的访问类型可以任意,接口的只可以是public static final

19、get与post请求的区别
(1)get请求用来从服务器获取资源,而post是向服务器提交数据
(2)get是将表单中的数据按照name=value的形式,添加到action所指向的url后面,并且两者使用?连接,各个变量之间使用&连接,而post是将表单中的数据放在http协议的请求头或消息体中,传递给action所指向的url
(3)get传输的数据要受到url长度限制(1024字节),而post可以传输大量的数据,上传文件通常使用post
(4)get使用时参数会显示在地址栏上,如果这些是敏感数据,应该使用post。
(5)get使用mime类型application/x-www-form-urlencoded的url编码文本的格式传递参数,为了保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是“%20”

20、&和&&的区别
21、==和equals的区别
22、Integer和int的区别
23、Vector和ArrayList的区别
24、运行时异常与一般异常有何不同
25、多线程介绍
26、列举线程池和业务场景
27、jquery的10个常用方法
28、jquery的常用选择器
29、Ajax
30、ajax常用的属性
31、Tomcat优化
32、hibernate优化
33、序列化和反序列化
34、面向对象的特性有哪些方面
35、集群
36、JDK的版本特性
37、linux中的命令
38、jvm相关
39、jvm优化

面试集锦(二)

标签:它的   交互   app   从服务器   大量   效率   状态   序列   value   

原文地址:https://www.cnblogs.com/acuii/p/10035603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!