凉面经-维恩贝特面试覆盘

今天下午进行了维恩贝特的面试,之前看这个公司的面经,都是常规题,我还蛮有信心的,今天面试,完了之后,我的内心有点拔凉。

因为紧张,有些问题不太记得了,记录一下我还记得的问题,并且把答案整整清楚。

!!!答案都是我百度之后的自己的理解,会存在很多不正确的地方,请指出来,让我学习学习,谢谢啦!!!

  1. 自我介绍
  2. 简单描述一下实习期间做的项目
  3. oracle分页方式,mysql分页方式

oracle使用rownum关键字得到数据的行数,再加where条件对rownum进行行数的限制
mysql使用limit关键字

  1. 数据库事务是什么?数据库隔离级别有什么用

数据库的事务就是一些操作的序列,这些序列要么都执行要么都不执行
隔离级别有四种,可以防止数据库并发导致的一些问题,如脏读、不可重复读、幻读

  1. 脏读是怎么发生的,幻读是怎么发生的

脏读是一个线程读到了其他线程还没有提交的数据,可能是另外这个线程数据还没有提交,之后需要回滚了
幻读是一个线程两次读取数据的行数不一样多,第二次比第一次多,可能是因为另外一线程插入了数据到数据库中

  1. 若有多个用户同时操作数据库中的数据,怎么保证数据的正确性?

加锁处理

  1. 数据库中的事务是怎么实现的

事务日志,写入数据与进行的操作

MVCC:在表后有两个隐藏的列,创建时间和过期时间,里面存储的是相应的版本号

  1. 说说数据库中的索引

索引是给数据表的一列或者多列进行排序,从而提高查找信息的速度

  1. 为什么加了索引查找速度会变快

索引的底层是用B+树实现的,而非索引是进行全表扫描的形式进行查询的

  1. 说说B+树比B树好在哪里

B+树内存中存有更多的元素,减少IO次数,性能高

B+树查找元素都在叶子结点中,查找性能稳定

B+树的叶子节点有序地组成链表结构,范围查找更方便

  1. 说说mybatis映射的实现原理

mybatis中映射的实现其实是使用动态代理进行的。我们编写Mapper接口,mybatis使用JDK的动态代理MapperProxyFactory为我们生成实现类

  1. mybatis怎么实现分页的

方法一:可以使用PageHelper来实现,需要自定义一个Page类接收返回值
方法二:可以使用mysql数据库的limit或者oracle的rownum来实现,使用#传入参数值进行数据行数的限定

  1. 常用的Object的方法有哪些

hashcode:获取对象的散列值,默认返回对象的堆内存地址
equals:比较两个对象的值是否相等
clone:实现对象的复制
toString:返回一个String对象,默认是:对象的class名称+@+hashcode的十六进制字符串
notify:唤醒该对象上等待的某个线程
notifyAll:唤醒该对象上等待的所有线程
wait:使该对象上的线程进入等待的状态
finalize:垃圾回收机制中需要调用的方法
getClass:获取对象运行时的class对象

  1. 怎么实现两个数组的合并

使用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]);
        }
    }
}
  1. 怎么实现两个数组的排序

使用arrays类中的sort方法进行排序

  1. 列表中的sort方法使用的是什么排序法

双轴快速排序

  1. 元素为对象的数组怎么进行排序

引入比较器。实现Comparable接口,重写comparealeTo方法

  1. 怎么实现数组的线程安全

给操作数组的地方加锁,或者转为Vector来使用

  1. 在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)

  1. 程序中多线程加锁的方式有哪些

synchronized关键字
lock接口

  1. lock加锁怎么使用

lock是一个接口,不能自己实例化对象,使用子类来实例化出真正可以使用的锁,如可重入锁ReentrantLock来实例化对象,然后调用其lock方法加锁,在finally中使用unlock方法来释放锁

lock lock = new ReentrantLock();
try{
lock.lock();
...//以下代码只有一个线程可以运行
}finally{
lock.unlock();
}
  1. synchronized加锁在变量上方法上代码块中有什么区别

synchronized加锁在静态变量上,锁住的是类

加锁在方法上锁住的是实例对象

加锁在代码块上,锁住的是括号中写的对象

  1. synchronized用在普通变量上和用在this上各自锁住的是什么

this锁住的是实例对象

  1. 谈谈你了解的java7以后的并发包

通常所说的并发包是java.util.concurrent及其子包。具体主要包括以下4个方面:比synchronized更高级的同步结构;线程安全的容器;并发队列实现;强大的Executor框架

  1. linux中怎么知道是不是可执行程序?怎么加可执行权限?

linux中的文件目录有三种权限,RWX,分别对应着可读可写可执行,可以使用ll指令查看
使用chmod +x 文件名 指令添加可执行权限

  1. 怎么判断两个服务器可以通信

在命令符窗口中ping一下对方ip地址

  1. 除此之外你还做过什么项目
  2. 微信小程序是怎么开发的
  3. 你还有什么要问我的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章