写在开头

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

面试题

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

Collection接口下常用的为List和Set接口,ArryList、LinkList、线程安全的vector,不存储重复元素的HashSet

Map一般使用无序的HashMap存储数据,如果要用有序的可以用LinkedHashMap,TreeMap是会对数据进行排序

 

删除ArryList的数据

List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
Iterator<String> 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<String,Integer> map = new HashMap<>();
map.put("one",1);
map.put("two",2);
map.put("three",3);
Set<String> set = map.keySet();
Iterator<String> 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(”<b>new stuff</b>”);                        给某元素设置内容

$().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,你此时就会很有自信的挑战自己意向中的公司了。

       对了,我说的是  自信+幽默,可不是  自大+尬笑,这个度,大家把握好就行了。

 

写在最后

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

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