实习生面试经历
03.23 参加了腾讯2018暑期实习生在线模拟测试,我个人选择的方向是Web开发,在此谈谈自己对于此次模拟测试的感受。
03.27 网易实习生在线测试(Java方向)
03.28 阿里电话面试(Java研发工程师)
3.23:Tencent暑期实习生在线模拟测试
模拟测试分为两大题,第一题是不定项选择题
,第二题为编程题
。
不定项选择:
一共10道选择题,涉及的内容还不算太多,
- 数据结构
- 数据库
- 计算机组成原理
- 计算机网络
- ……
数据结构
数据结构应该算是此次模拟题的重点吧,多次出现相关的一些数据结构,比如
- 线性表
- 链表
- 二叉树
- ……
其中线性表
和链表
考查的是相关的定义。
二叉树
考查的是三种遍历(先序遍历、中序遍历、后序遍历)
我自己在做这个题目的时候一开始懵了。题目给的是对称排序
(也就是中序遍历
),一想二叉树里面没听说过这个对称排序啊,后来看到选项之后才明白是所谓的中序遍历。这个题目给出的是中序遍历结果
和后序遍历结果
,要求选出符合条件的先序遍历结果
。
数据库
数据库是给出两张表和一条SQL语句。
join
的几种表连接方式- 对结果降序排
desc
limit
关键字- 不同SQL语句的效果
Join
有四种表的连接方式有内连接
、左连接
、右连接
、全连接
。
测试的时候对limit
这个关键字的作用忘记了,所以这道题感觉凉凉。
上网查找limit
:对搜索结果进行偏移
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
在我们使用查询语句的时候,经常要返回前几条或者中间某几行的数据,这个时候就可以使用limit
了。
SELECT * FROM table LIMIT 5,10;
上面的sql语句表示检索记录行 6-15
计算机组成
虚拟内存的求解
32位的Linux操作系统,内存为2GB,硬盘大小为64GB,问最大(?)虚拟内存的大小。(不太记得题目了)。
还有一题是:
一个QQ号有8种状态,全球有42亿个QQ号,问多大的存储空间可以全部存储这些QQ号的全部状态。
计算机网络
就是一些TCP/UDP/...
的一些协议
编程题
第一题
给定n组数据,依次给出每组数据的四个点的横坐标,再依次给出纵坐标,,判断其是否能组成一个正方形
输入:
3
0 0 2 2
0 2 0 2
0 1 5 6
1 6 0 5
0 0 7 7
0 3 0 3
输出:
Yes
Yes
No
我自己的思路
- 每两个顶点求一次距离,判断距离是否相等
- 求对角线的斜率相乘等于-1
第二题
小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2,4,4……,小Q卖东西需要支付元钱,请问小Q想知道有多少种组合方案。
输入:一个n (1<=n<=10^18),代表要付的钱
输出:表示小Q可以拼凑的方案数目
输入:
6
输出:
3
我自己的思路
- for循环求解
- 然后发现
1<=n<=10^18
,就知道肯定运行不起来 - 卒
PS:编程一开始想用C语言来编写,发现很多基础的语法都不是很记得了,最后还是改用Java来写的。
编程题题解
3.27:网易实习生在线测试
选择题
- 待更新……
编程题
1、矩形重叠
2、正数对问题
3、小伙伴找工作
问答题
第一小题
Vector、ArrayList、LinkedList在各个情况下的性能
第二小题
同步/异步IO
3.28:阿里电话面试
自我介绍
介绍自己参与过的项目
数据库部分
1、JDBC连接数据库的过程
- 加载JDBC驱动程序
try{
//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
}
- 提供JDBC连接的URL
jdbc:mysql://localhost:3306/test?useUnicode=true & useSSL=false & characterEncoding=gbk;
- 创建数据库的连接
//连接MySql数据库,用户名和密码都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con = DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("数据库连接失败!");
se.printStackTrace() ;
}
- 创建一个Statement
tatement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
- 执行SQL语句
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
- 遍历结果集
/*
两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
*/
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
}
- 关闭JDBC对象
/*操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
*/
if(rs != null){
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
2、MySQL的优势
开源、免费
3、你认为阿里使用的数据库是什么?原因。
我回答的是
Oracle
,然后就被问到如果非要使用MySQL
呢?
其实阿里巴巴在SQL Server
和Oracle
中自创了一个去IOE
概念(我也是后来询问老师得知的)。
4、MySQL数据库优化
5、事务、事务隔离级别
事务的四个特性:
原子性
、一致性
、隔离性
、持久性
。
事务的隔离级别:Read uncommitted(读未提交)
、Read committed(读提交)
、Repeatable read(重复读)
、Serializable(序列化)
。
6、脏读、不可重复读
脏读
:
事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。
分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。
不可重复读
:
事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…
分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。
7、hibernate与ibatis有什么区别
区别
:
ibatas
的sql语句需要自己手动写,而hibernate
能够在程序运行时自动生成。但是不要就这样以为hibernate
比ibatas
方便,其实二者熟悉之后的效率差不多。而hibernate
还能够自动建表等等,这样的好处就在于你带着这个程序,无论到什么机器上,你都不需要数据库,应为它能自动为你完成,而ibatas
就必须要有相应的数据库表才能进行移植
Java基础部分
1、基本数据类型与封装类
基本数据类型:
整数类型:byte
、int
、short
、long
浮点类型:float
、double
布尔型:boolean
字符型:char
然后问了一个问题(问输出的结果):
long a = 100;
long b = 100;
System.out.println(a == b);
//输出:true
2、HashMap的get( )方法
这个操作的原理就比较简单,只需要根据key
的Hashcode
算出元素在数组中的下标,之后遍历Entry对象链表,直到找到元素为止。
int hash = (key == null) ? 0 : hash(key);
for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
分四步:
- 判断key,根据key算出索引。
- 根据索引获得索引位置所对应的键值对链表。
- 遍历键值对链表,根据key找到对应的Entry键值对。
- 拿到Value。
分析:
以上四步要保证HashMap的时间复杂度O(1)
,需要保证每一步都是O(1)
,现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n)
,与链表长度有关。我们要保证那个链表长度为1
,才可以说时间复杂度能满足O(1)
。但这么说来只有那个hash算法尽量减少冲突,才能使链表长度尽可能短,理想状态为1
。因此可以得出结论:HashMap的查找时间复杂度只有在最理想的情况下才会为O(1)
,而要保证这个理想状态不是我们开发者控制的。
3、Java反射机制
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
4、什么是线程安全和线程不安全?
线程安全
:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTab;le)
线程不安全
:不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap等)
5、Synchronized关键字
6、分布式系统
什么是分布式系统,如何学习分布式系统
7、设计模式:代理Proxy、动态代理
Java设计模式之代理模式