20届应届生北京java面试题及面试总结

写在开头

       先说明下自己的情况,普通二本毕业生,实习了大半年,基础还算扎实,但是对于高并发,缓存什么的经验几乎为0,所以遇到的面试题是相对简单的,有不对的欢迎大家批评指正哈。

面试题

Java集合框架包括Collection接口,Map接口

Collection接口下常用的为List和Set接口,ArryList、LinkList、线程安全的vector,不存储重复元素的HashSet
Map一般使用无序的HashMap存储数据,如果要用有序的可以用LinkedHashMap,TreeMap是会对数据进行排序
 

删除ArryList的数据

如果使用for循环操作,则会抛出索引越界异常,因为删除了元素之后,集合的长度减小了,所以需要使用迭代器进行删除
List list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
Iterator iterator = list.iterator();
while (iterator.hasNext()){
    String string = iterator.next();
    if (string.equals("two")){
        iterator.remove();
    }
}

 

遍历HashMap

思路,首先获取Map的key的Set集合,然后使用迭代器遍历set集合,便利取出key,然后根据key获取value
Map map = new HashMap<>();
map.put("one",1);
map.put("two",2);
map.put("three",3);
Set set = map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
    String key = iterator.next();
    int value = map.get(key);
    System.out.println("key:"+key+",value:"+value);
}

 

Mysql的常用函数

CONCAT(s1,s2...sn)
字符串 s1,s2 等多个字符串合并为一个字符串
合并多个字符串
SELECT CONCAT ( "SQL " , "Runoob " , "Gooogle " , "Facebook" ) AS ConcatenatedString ;
 
INSERT(s1,x,len,s2)
字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
从字符串第一个位置开始的 6 个字符替换为 runoob:
SELECT INSERT ( " google.com " , 1 , 6 , "runnob" ); -- 输出: runoob . com
 
LOWER(s)
将字符串 s 的所有字母变成小写字母
字符串 RUNOOB 转换为小写:
SELECT LOWER ( 'RUNOOB' ) -- runoob
 
REPLACE(s,s1,s2)
将字符串 s2 替代字符串 s 中的字符串 s1
将字符串 abc 中的字符 a 替换为字符 x:
SELECT REPLACE ( 'abc' , 'a' , 'x' ) -- xbc
 
REVERSE(s)
将字符串s的顺序反过来
将字符串 abc 的顺序反过来:
SELECT REVERSE ( 'abc' ) -- cba
ABS(x)
返回 x 的绝对值  
返回 -1 的绝对值:
SELECT ABS (- 1 ) -- 返回 1
 
CURDATE()
返回当前日期
SELECT CURDATE (); -> 2018 - 09 - 19
 
CURTIME()
返回当前时间
SELECT CURTIME (); -> 19 : 59 : 02
 
DATABASE()
返回当前数据库名
SELECT DATABASE ();
-> runoob
 
 

JQ常用方法

$().addClass(css中定义的样式类型);            给某个元素添加样式
$().attr({src:”test.jpg”,alt:”test Image”});        给某个元素添加属性/值,参数是map
$().attr(”src”,”test.jpg”);                                 给某个元素添加属性/值
$().attr(”title”, function() { return this.src });   给某个元素添加属性/值
$().html();                                                      获得该元素内的内容(元素,文本等)
$().html(”new stuff”);                        给某元素设置内容
$().removeAttr(”属性名称”)                           给某元素删除指定的属性以及该属性的值
$().removeClass(”class”)                              给某元素删除指定的样式
$().text();                                                      获得该元素的文本
$().text(value);                                             设置该元素的文本值为value
$().toggleClass(class)                                  当元素存在参数中的样式的时候取消,如果不存在就设置此样式
$().val();                                                       获取input元素的值
$().val(value);                                              设置input元素的值为value
parent()   直接父元素
parents()   祖先元素
children()   直接子元素
find()        所有后代元素
next()   下一个同胞
netx()   后边的所有同胞
prev()   上一个同胞
prevAll()  上面的所有同胞   
 
 

如何判断Long类型数据的值相等

直接调用equals方法即可,Long类型的equals方法进行了重写,重写后的方法会先判断比较的参数类型是否是Long类型,如果是则会调用Long.longValue进行比较
 

equals和==的区别

equals方法来自object类,原生的equals方法和==没有区别,都是比较的参数的存储地址,但是很多的类都对equals方法进行了重写
 

mysql、sqlServer、Oracle的默认端口号

 
sqlserver:1433
mysql:3306
Oracle:1521
 

long怎么转化为double

long转化为double直接转化即可,double转化为long需要类型强转换
 
Long转化为Double需要调用doubleValue方法,Double转为Long需要调用longValue方法
 

Redis的List数据的特点

插入的数据时有序的,可以在头部和尾部插入数据,LPUSH在头部插入数据,RPUSH在尾部插入数据
 

使用Redis的注意事项

key名设计要简介易读,一般应包括数据的唯一标识
尽量为key设置过期时间,时间不要过于集中避免缓存雪崩
 

get和post请求的区别

 
get参数会放在url请求中,post传递参数通过request body传递参数,因此get相对来说不安全
get传递的参数资源是有限的有长度限制,post没有
get和post都是基于Http协议,但是get请求会一次把httpheader和data一起传递过去,然后服务器返回数据相应200;
post请求会先将header发送给服务端,服务端响应100continue时,浏览器再发送data,然后服务器响应200
 

char和varchar的区别

char代表定长字符串,若没有存满则未存储的空间会被英文空格代替
varchar代表可变字符串,根据窜出数据的内容自动分配空间大小
 

int(10)和varchar(10)的区别

varchar中的数字代表存储的字符长度,若超过了此范围将会报错
int中的数字代表展示的数字长度,若不足10位则前面补0显示,若超过10位则正常显示,
 

String、StringBuffer、StringBuilder的区别

String是不可变的字符串,不可以为null
StringBuffer是可变字符串,不可以为null,线程安全
StringBuilder是可变字符串,不可以为null,线程不安全
 

反射创建对象

//设已经有了一个Test类,全类名为com.gzf.Test
Test test = new Test();
//获取Class对象,三种方式
Class class1 = test.getClass();
class1 = Test.Class;
class1 = Class.forName("com.gzf.Test")
//创建Test对象,两种方式
Test test1 = (Test)class1.newInstance();
test1 = (Test)class1.getConstructor.newInstance();

 

 

js判断数组类型

 
//较为简单的方法1
function isArrayFn(array){

    return array instanceof Array;
}

//2
function isArrayFn(array){

    return Array.isArray(array);
}

//最为严谨的方法
function isArray(array){
    if(typeof Array.isArray === "function"){
        return Array.isArray(value);
    }else{
        return Object.prototype.toString.call(value) === "[object Array]";
    }
}

 

XML和json的区别,以及解析方式

两者都是一种数据交换格式,但XML更倾向于是一种语言,多用做配置文件,json多用作数据交互
XML:扩展标记语言,在格式上更类似一种语言,具有严格的标签语法,是重量级的,在传输过程中比较占带宽
json:js对象简谱,是轻量级的类似于键值对的数据结构,传输过程中占据带宽较少
解析方式
json用jackson、gson解析,xml用dom,sax,demo4j解析
 
 

类的实例化顺序

1、父类静态变量,静态初始化块,按照代码书写顺序依次执行
2、子类静态变量,静态初始化块,按照代码书写顺序依次执行
3、父类非静态变量、非静态初始化块,按照代码中书写的顺序依次执行
4、父类构造方法
5、子类费静态变量,非静态初始化块,按照代码中书写的顺序依次执行
6、子类构造方法
 

&&和&的区别

 
&&是逻辑运算符,&是位运算符
当两边是布尔值时,&&具有短路的功能,当第一个条件不成立时则不再计算第二个条件,而&会运算所有条件
当两边不是布尔值,而是整数值时,&&不支持此种运算,&会根据其二进制数进行与操作
 

jsp如何配置过滤器

创建一个类,让其实现Filter接口,重写里面的doFilter()方法,然后在web.xml中进行注册
 

过滤器,拦截器,监听器的区别

过滤器是servlet支持的,拦截器是Spring框架支持的,因此拦截器可以调用Spring容器中的资源,比如service对象
在处理请求时,过滤器先执行,拦截器后执行;在处理响应时,拦截器先执行,过滤器后执行
拦截器拦截粒度更细,可以在请求controller之前,return ModuleAndView之前,视图完成渲染之前被调用
过滤器拦截粒度较粗,只能在请求controller之前,视图完成渲染之后被调用
监听器是随着项目的启动而启动,随着项目的关闭而销毁,一般用于配置文件的初始化工作
 

mysql,oracle,sqlserver查询a表的11至20行数据

#mysql
select * from a limit 10,10;
 
#oracle  先取前20条,再取前10条进行差运算
select * from a where rownum <=20
minus
select * from a where rownum <11;
 
#sqlServer 先取前20条进行倒序,再取前10条
select top10 * from (select top20 * from a) oreder by column desc;
 
 

创建索引

creat index index_name on table_name ('column')
 

索引类型及其作用

普通索引:最基本的索引,对数据没有任何限制,可以加快检索速率
唯一索引:要求数据不能重复,数据可以null,同一个表中可以建立多个唯一索引
主键索引:数据不能重复,数据不可以为null,同一个表中只能有一个主机索引
组合索引:多个列的值组成一个索引
全文索引:对文本的内容进行分词,进行搜索
 
 

sql日期操作

 
日期增加:date_add(now(),interval 1 day) 也可以为负的,一天之后的
日期减少:date_sub(now(),interval 1 day)也可为负值,一天之前的
日期相减: datediff(date1,date2),  左边减去右边
时间相减:timediff(time1,time2)   左边减去右边
 

 

面试总结

       面试了大概10多个,感觉对于我这种没有太多工作经验的应届生来说,问的问题的方向还是基于基础的实操类,比如如何遍历map这些。如果不是去什么很牛逼的大厂,我感觉不用纠结什么JVM,Spring实现原理这些。当然了什么是AOP,什么是DI,这些肯定是要知道的,也建议在面试中去总结自己应该复习的知识点。
 
       面试的重点:(1)首先是集合,这个很重要,这个很重要,这个很重要;(2)其次是数据库实操,我上面没有写数据库的面试题。因为有很多人发出来了,大家随便搜一个,过一遍就行,题型大概就是学生表,课程表,分数表这种几个表联合查询求平均分,哪个学生选了哪些课这些;(3)再其次的题型是线程,你可以不知道很牛逼的线程各种操作,但是对于synchronized、volatile这些还是要了解一些的吧;(4)最后呢,对于一些中间件也要多多少少会一些,比如Nginx,redis这些,不用太复杂,要求你知道原理,但是比如redis的基本数据类型,持久化方式,nginx的实际操作配置,这些也是应该有所了解的。(5)对了,有的时候还会问你一些比较主观的问题,比如你是如何把一个需求变成真正的项目实现的,你是如何在团队中进行协作开发的,这种主观的问题,大家都可能回答的比我好,这里也就是提醒大家要提前有所准备。
 
      面试建议:一定要自信,这种自信是非常非常非常重要的,因为这种自信可以让你更加的能够侃侃而谈,适时的幽默也是一个加分点,当然不强求,不过如果有的话毕竟给面试官留下很好的印象。自信有什么作用呢,说下我自己的例子,面试一家公司的时候,他们使用的是ssh框架,用的oracle数据库,我都没用过,按理说这种公司的基础架构我都不会用直接就pass了,但是我自己能感觉那场面试我掌握着面试的主动权,当然也可能是面试官不太健谈的原因,但无论如何,面试时的自信是很重要的一个面试成功因素,而且如果你面试的时候充满着那种不自信的态度的话,就算面试成功,也很容易被压工资啊。
        现在很多人急着找工作,所以可能并没有那么多自信,我起初也是没有很多自信的,但是很快就调整过来了。建议大家可以先找一些对技术能力要求不高的公司,就是那种小公司嘛,然后等你收到了那么2.3个offer,你此时就会很有自信的挑战自己意向中的公司了。
       对了,我说的是  自信+幽默,可不是  自大+尬笑,这个度,大家把握好就行了。
 

写在最后

      因为我自己也不是什么技术大牛嘛,不然也不会面试那么艰难,也正是这么艰难,所以想把自己的一点总结分享给大家,不过个人的观点,难免会比较片面,大家也可评论和私信我,我们互相探讨交流,帮助跟多人。

     最后希望大家都能找到自己心仪的工作,一直学习,一直进步!

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(java知识,面试,java,mysql,redis,数据库)