今天下午进行了维恩贝特的面试,之前看这个公司的面经,都是常规题,我还蛮有信心的,今天面试,完了之后,我的内心有点拔凉。
因为紧张,有些问题不太记得了,记录一下我还记得的问题,并且把答案整整清楚。
!!!答案都是我百度之后的自己的理解,会存在很多不正确的地方,请指出来,让我学习学习,谢谢啦!!!
- 自我介绍
- 简单描述一下实习期间做的项目
- oracle分页方式,mysql分页方式
oracle使用rownum关键字得到数据的行数,再加where条件对rownum进行行数的限制
mysql使用limit关键字
- 数据库事务是什么?数据库隔离级别有什么用
数据库的事务就是一些操作的序列,这些序列要么都执行要么都不执行
隔离级别有四种,可以防止数据库并发导致的一些问题,如脏读、不可重复读、幻读
- 脏读是怎么发生的,幻读是怎么发生的
脏读是一个线程读到了其他线程还没有提交的数据,可能是另外这个线程数据还没有提交,之后需要回滚了
幻读是一个线程两次读取数据的行数不一样多,第二次比第一次多,可能是因为另外一线程插入了数据到数据库中
- 若有多个用户同时操作数据库中的数据,怎么保证数据的正确性?
加锁处理
- 数据库中的事务是怎么实现的
事务日志,写入数据与进行的操作
MVCC:在表后有两个隐藏的列,创建时间和过期时间,里面存储的是相应的版本号
- 说说数据库中的索引
索引是给数据表的一列或者多列进行排序,从而提高查找信息的速度
- 为什么加了索引查找速度会变快
索引的底层是用B+树实现的,而非索引是进行全表扫描的形式进行查询的
- 说说B+树比B树好在哪里
B+树内存中存有更多的元素,减少IO次数,性能高
B+树查找元素都在叶子结点中,查找性能稳定
B+树的叶子节点有序地组成链表结构,范围查找更方便
- 说说mybatis映射的实现原理
mybatis中映射的实现其实是使用动态代理进行的。我们编写Mapper接口,mybatis使用JDK的动态代理MapperProxyFactory为我们生成实现类
- mybatis怎么实现分页的
方法一:可以使用PageHelper来实现,需要自定义一个Page类接收返回值
方法二:可以使用mysql数据库的limit或者oracle的rownum来实现,使用#传入参数值进行数据行数的限定
- 常用的Object的方法有哪些
hashcode:获取对象的散列值,默认返回对象的堆内存地址
equals:比较两个对象的值是否相等
clone:实现对象的复制
toString:返回一个String对象,默认是:对象的class名称+@+hashcode的十六进制字符串
notify:唤醒该对象上等待的某个线程
notifyAll:唤醒该对象上等待的所有线程
wait:使该对象上的线程进入等待的状态
finalize:垃圾回收机制中需要调用的方法
getClass:获取对象运行时的class对象
- 怎么实现两个数组的合并
使用System.arraycopy方法进行数组的复制,方法中第一个参数是要复制到数组,第二个参数是从哪个下标开始复制,第三个参数是目标数组,第四个参数复制到目标数组的开始下标,第五个参数是复制的长度;另外,因为数组的长度是不可变的,所以还需要创建一个数组来作为目标数组
public class array {
public static void main(String[] args) {
//声明数组1
String[] str1 = new String[]{"1","2"};
//声明数组2
String[] str2 = new String[]{"3","4"};
//目标数组
String[] str3 = new String[4];
//将数组1放到目标数组中,参数为:
// 1.将要复制的数组 2.从将要复制的数组的第几个元素开始 3.目标数组 4.将要放到目标数组的那个位置 5.复制多少个元素
System.arraycopy(str1,0,str3,0,str1.length);
//复制数组2到目标数组中
System.arraycopy(str2,0,str3,2,str2.length);
//循环输出看
for (int i = 0;i<str3.length;i++){
System.out.println(str3[i]);
}
}
}
- 怎么实现两个数组的排序
使用arrays类中的sort方法进行排序
- 列表中的sort方法使用的是什么排序法
双轴快速排序
- 元素为对象的数组怎么进行排序
引入比较器。实现Comparable接口,重写comparealeTo方法
- 怎么实现数组的线程安全
给操作数组的地方加锁,或者转为Vector来使用
- 在java应用程序中是怎么实现事务的
在Spring中,首先在application中配置事务管理器,然后在方法上使用@Transactional的注解
application.xml
<!-- 配置事务管理器,全注解声明式事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
web.xml
<!--开启了对注解的解析-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
代码中
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=RuntimeException.class)
- 程序中多线程加锁的方式有哪些
synchronized关键字
lock接口
- lock加锁怎么使用
lock是一个接口,不能自己实例化对象,使用子类来实例化出真正可以使用的锁,如可重入锁ReentrantLock来实例化对象,然后调用其lock方法加锁,在finally中使用unlock方法来释放锁
lock lock = new ReentrantLock();
try{
lock.lock();
...//以下代码只有一个线程可以运行
}finally{
lock.unlock();
}
- synchronized加锁在变量上方法上代码块中有什么区别
synchronized加锁在静态变量上,锁住的是类
加锁在方法上锁住的是实例对象
加锁在代码块上,锁住的是括号中写的对象
- synchronized用在普通变量上和用在this上各自锁住的是什么
this锁住的是实例对象
- 谈谈你了解的java7以后的并发包
通常所说的并发包是java.util.concurrent及其子包。具体主要包括以下4个方面:比synchronized更高级的同步结构;线程安全的容器;并发队列实现;强大的Executor框架
- linux中怎么知道是不是可执行程序?怎么加可执行权限?
linux中的文件目录有三种权限,RWX,分别对应着可读可写可执行,可以使用ll指令查看
使用chmod +x 文件名
指令添加可执行权限
- 怎么判断两个服务器可以通信
在命令符窗口中ping一下对方ip地址
- 除此之外你还做过什么项目
- 微信小程序是怎么开发的
- 你还有什么要问我的