2017年6月22号JiaDu科技两轮面试笔记

时间:2022-01-09 15:01:00

通知我是两点到,然而我一点就到地方了,然后坐在一楼大厅里,拿着手机看了一些JAVA基础。然后等到一点50左右,在大厅里拿了套JAVA工程师笔试题,大厅人员给我们找了一个屋子,在里面做题,大概做了50分钟左右吧!然后Hr下来,收了我们的简历,把我们带到了楼上,开始了两轮的面试。

因为和我面试的还有一个本科生,所以两面都是在一起面试的,应该算是群面吧!

第一面:是技术面

第二面:是项目面

第一面:

首先,就是简单的介绍一下自己!

然后开始问问题:

(1)JAVA中集合框架,你们了解多少?

我回答:JAVA集合框架中,Collection是集合框架的基本接口,然后是Set、List、Queue这些接口实现Colllection接口,Set、List、Queue又有很多实现类,比说ArrayList、LinkedList、TreeSet等。还有Map接口下面实现类HashMap和HashTable。ArrayList和LinkedList都是通过add()方法添加数据。HashMap和HashTable是都给put(key,Value)形式添加数据,通过get(value)得到数据。

另一个回答:我就补充一次,ConcurrentHashMap,ConcurrentHashMap是实现了线程安全,然后又讲了一下,JAVA底层是怎么给ConcurrentHashMap加锁实现线程安全的。

我个人感觉这个同学很Nice,一个大三的本科生,能有看实现源码和了解机制的习惯,真的很优秀。

我接着补充到:由于JAVA中HashMap是线程不安全的,而HashTable是线程安全的,但是由于HashMap的操作效率比HashTable高,所以为了保证线程操作安全和操作效率,就有了ConcurrentHashMap。

技术官:嗯,那我在来问一下,你们知道如何得到HashMap的所有键么?

我和那个同学都思考了一会,好像都不会。

面试官给了一点提示:提示的东西我当时不是很了解这个情况,所以也不是很懂。

另一个同学:根据当时面试官的提示,说出了答案。

那么,我现在就来好好看一下这个问题:

正确答案:

(1)获取HashMap键

import java.util.HashMap;
import java.util.Map;
import java.util.Set;


public class HashMapDemo {

public static void main(String[] args) {

Map<String,String> map=new HashMap<String,String>(); //创建一个HashMap
map.put("Microstrong", "好学生");
map.put("Micro", "小");
map.put("strong", "强");

Set<String> keySets=map.keySet(); //获取键的Set集合
System.out.print("Map键:");
for(String keySet:keySets){ //迭代输出键
System.out.print(keySet+" ");
}
}

}

运行结果:

2017年6月22号JiaDu科技两轮面试笔记

(2)获取HashMap的值

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class HashMapDemo {

public static void main(String[] args) {

Map<String,String> map=new HashMap<String,String>(); //创建一个HashMap
map.put("Microstrong", "好学生");
map.put("Micro", "小");
map.put("strong", "强");

Collection<String> values=map.values(); //获取HashMap值
System.out.print("Map值:");
for(String value:values){
System.out.print(value+" ");
}
}

}

运行结果:

2017年6月22号JiaDu科技两轮面试笔记

(3)获取HashMap键值对

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapDemo {

public static void main(String[] args) {

Map<String,String> map=new HashMap<String,String>(); //创建一个HashMap
map.put("Microstrong", "好学生");
map.put("Micro", "小");
map.put("strong", "强");

Set<Entry<String,String>> sets=map.entrySet(); //获取HashMap键值对

for(Entry<String,String> set:sets){ //遍历HashMap键值对
System.out.println("Key:"+set.getKey()+" value:"+set.getValue());
}
}
}

结果:

2017年6月22号JiaDu科技两轮面试笔记

个人建议:

1、知道HashMap和HashTable的JAVA底层实现机制?

我先来回答一下我自己的理解:

(1)HashMap和HashTable底层是一个散列表,它存储的内容是键值对(key-value)映射。

(2)Hashtable 中的几乎所有的 public 的方法都是 synchronized 的,而有些方法也是在内部通过 synchronized 代码块来实现。所以有人一般都建议如果是涉及到多线程同步时采用 HashTable,没有涉及就采用 HashMap,但是在 Collections 类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的 Map 对象,并把它作为一个封装的对象来返回。

(3)HashMap所有的方法没有实现synchronized,所以在多线程中不能做到数据同步。在多线程中使用时,是线程不安全的。

(4)HashTable实现的线程安全,是给自己的散列表加锁。

2、知道ConcurrentHashMap的所有用法和出现背景,及JAVA底层实现机制?


(2)简单问了一些多线程的东西,是否对线程熟悉和了解?

因为这道题就在笔试卷子上,面试官手里拿的就是我们笔试的卷子,所以,没仔细问

卷子的试题是这样的:线程有哪几种实现方法,请描述并指出它们之间的差别?

(3)是否对JAVA中IO流熟悉?

我回答:还行,这部分不是常用,一般都是用InputStream、OutputStream。我最近刚看了字节流跟字符流的区别?

面试官:那你简单说一下,字节流跟字符流区别?

我回答:字节流的读取不需要缓冲区,而字符流的读取需要缓冲区。

面试官接着问:你们了解过StringBuffer类么?

我们回答:用过,但是不熟悉。面试官就没接着问下去。

学习:

String是不变类,用String修改字符串会新建一个String对象,如果频繁的修改,将会产生很多的String对象,开销很大.因此Java提供了一个StringBuffer类,这个类在修改字符串方面的效率比String高了很多。
在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。

StringBuffer不是不变类,在修改字符串内容时,不会创建新的对象,因此,它比String类更适合修改字符串。
StringBuffer类没有提供同String一样的toCharArray方法
StringBuffer类的replace方法同String类的replace方法不同,它的replace方法有三个参数,第一个参数指定被替换子串的起始位置,第二个参数指定被替换子串的终止位置,第三个参数指定新子串。

(4)问了一些JDBC的问题,这方面还是要好好看看呢!


(5)问了一些JAVA中反射的问题!

(6)int转换成float会不会造成信息的丢失?float转换成int会不会造成信息的丢失?int在JAVA占几个字节?float占几个字节?

-----------------------------------接下来就是数据库中的问题了-----------------------------------------------

(1)数据库中连接查询问题

1.内连接与外连接

2.左连接与右连接

(2) 技术面试官,直接在黑板上出的题:

给出一张表:

2017年6月22号JiaDu科技两轮面试笔记

查询出这张表中,每个学生的平均成绩:

select name, AVG(score)
from student
group by name

就是这么简单的一个问题,当时想了,好久都没有弄出来。伤心。。。。。。

---------------------------------------------------------------操作系统------------------------------------------------------

生产者与消费者问题

问:生产者往一块存储区域中放物品,消费者往存储区中拿物品,如何做到不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。

---------------------------------------------------------设计模式----------------------------------------------------------

如何理解单一职责原则

---------------------------------------------------------还有JSP问题-----------------------------------------------------

(1)谈谈对servlet的理解。

(2)说说springMVC的机制