java面试准备

1.自我介绍:

2.基础 : 

        1.集合 : java容器中分为collection 和map两大类

        collection 分为list集合(有序且重复的),set集合(无序,不可重复)

                list集合分为arrayList集合 : 查询快,增删慢,它是基于数组结构的,对数据的增删是在数组的尾部进行添加或删除的,其效率相对于LinkedList来说还是比较慢的,因为LinkedList是基于链表结构的查询慢增删快,它的增删只需要去改变指针的指向即可.并且arrayList做增删时还存在扩容问题,他的扩容是需要生成新的集合并且在原数组的基础上扩容1.5倍,他的 默认容量为10

        set集合分为HashSet(无序且不可重复的,可以存储null值),TreeSet集合(他的底层是通过HashMap去实现的,对key去存储set元素,在里面会对元素进行排序,所以他不能存储null值)

map集合 : 

        HashMap集合: 他是基于key,value形式,基于数组和链表结构的,在对数据操作时继承了数组的线性查找和链表的寻址修改,并且HashMap集合是线程不安全的

                原因 : 

                        1.在jdk1.7中会造成环形链和数据丢失的情况

                        2.在jdk1.8中hashMap的put过程会造成数据覆盖的情况,其put过程为 :        1.对key求哈希值 2.判断是否发送哈希碰撞(求出的值相同),发生了碰撞就放入桶中,没有发生碰撞就以链表的形式链接到后面  3.链表的长度大于8会转为红黑树,链表的长度小于6会 从红黑素转为链表(这也是HashMap的存储机制)

线程安全的集合 : 

        1.copyOnWriteArraylist      2.copyOnWriteArraySet     3.HashMap   

        4.HashTable (执行的效率差,他是对整个HashTable进行加锁,同一时间只能有一个线程访问 )

        5.ConcurrentHashMap 是一个无论在读或写操作上都支持很高性能的集合,在执行读操作的时候他几乎不需要加锁,在执行写操作时默认支持16个线程执行并发写操作(因为他里面的segment默认就是16个并发级别,支持扩张)

ConcurrentHashMap的存储机制 : 

        在jdk1.7中采用锁分段技术,将一个HashMap分为多个段,每段都加一把锁,这样就可以支持多线程的访问,以及不会影响系统对其他段的访问

        在jdk1.8中采用CAS+Synchronized+Node+红黑树去实现的,更大程度上降低了锁的粒度

String和StringBuffer和StringBuilder的区别 :

        string是一个不可变的类,在对字符串操作是会生成一个新的string对象,这样做的效率会很差并且还会消耗内存

        StringBuffer是一个可变的线程安全的类,在对字符串操作时不会生成新的string对象,并且它里面有一个缓存区容量,当字符串的大小没有超过这个容量时,不会分配新的容量的

        Stringbuilder也是一个可变的类,但是他是线程不安全的

        1.如果我们对少量字符串操作时可以使用string类

        2.如果在多线程下对大量字符串操作时,需要使用StringBuffer类,反之使用StringBuilder类

MySql : 

        在5.7版本以后默认值从的存储引擎是InnoDb,给,MySql的表提供了事物的处理,回滚以及崩溃修复的功能和多版本并发控制的事物安全,他支持外键,也就是当父表中的数据更新时字表中的数据也必须要有相应的改变,他总是支持自动增长且唯一不为空,在MySql中自动增长的列为主键,他的缺点是读写效率差执行速度慢

        事物四大特性 : 

                原子性 : 一个或多个事物要么全部执行成功要么全部执行失败

                一致性 : 一个事物可以从一种一致性的状态切换到另一种一致性的状态

                隔离性 : 一个事物对数据的操作对其他事物是不可见的,多个事物之间是存在隔离的

                持久性 : 一个事物对数据的修改在数据库中的改变是永久的,并且不支持回滚

        事物的隔离级别 :  

                读未提交 : 会引发脏读,幻读,不可重复读

                读已提交 : 会引发幻读,不可重复的

                重复的 : 会引发不可重复读

                串行化 :  从隔离级别来说,他是最高的隔离级别,从并发性上来说是最低的

                        脏读 : 一个事物读取到另一个事物未提交的数据,导致前后两次读取到的数据不一致

                        幻读 : 一个事物读取到另一个事物已提交的数据,导致前后两次读取到的数据不一致

                        不可重复读 : 一个事物前后两次读取到的数据不一致,由于其他事物插入数据导致事物并发的情况

索引优化 : 

        (高并发的处理方式,避免全表扫描,尽量使用索引)

       导致全表扫描,索引时效的情况 :

                1. 索引列使用函数计算

                2. 模糊查询的左模糊(因为mysql是遵循最左匹配原则,所以使用左模糊时匹配的是一个占位符)        

                3. is not null 不走索引

                4. or的使用不当(大于,小于,不等于等范围查询)

                5.参数类型与字段类型不匹配,会导致类型发送隐式转换,索引失效

        尽量避免全表扫描,最大化的使用索引,可以使用explin后面跟sql语句去查看索引的使用情况,一般可以在group by或者order by,on语句中去建索引,在数据量小或者太长的字段不建议建索引

        mysql的行级锁 : 在做更新的时候会锁定一条数据直到数据更新完成后才会释放

        间隙锁 : 做批量更新的时候就比如根据id为2到5之间的数据更新,id为3的数据不存在,那么他也是被锁定的

表锁 : 指的是对整张表锁定

#{}和${}的区别 :

        #{}可以防止sql注入,在进行编译时会解析为一个 占位符并且自动拼接单引号,不会改变参数的数据类型

        ${}不能防止sql注入,在编译时他是做一个string类型的转换,解析出什么就是什么=和Eq

==和equals的区别 : 

        == 比较的是参数值 

        equals在引用数据类型中没有重写euals时比较的是地址值;重写equals方法后比较的是地址值中的内容

mybatis : 支持定制化,存储过程和高级映射,几乎可以避免所有的jdbc代码和手动设置参数以及获取数据集

mybatisPlus : 是在mybatis上只做增强不做改变,主要是为了简化开发和提高效率

        他的优点是损耗小,启动就会注入基本的crud,性能上基本无损耗,属于直接面向对象的操作,并且支持lambada表达式,内嵌服务器,拦截器分页插件等

        他的缓存级别分为 :

                一级缓存 : 默认开启的,他的增删需要清空一级缓存,是属于sqlSession中的缓存,他的生命周期和sqlSession一致的

                二级缓存 : 他是sqlSessionFactory中的缓存,需要手动开启,如果我们每次查询都需要使用最新的数据时,需要禁用二级缓存的

进程 : 它是一个程序的可执行单元,有自己的一个工作内存

线程 : 它是一个进程的可执行单元,作为资源调度的单位,有自己的工作内存和程序计数器

java是一个单进程多线程的工作模型,一个进程中可以存在多个线程叫做多线程

而在多线程中会存在三个安全性问题 : 

        1. 原子性问题 : 一个或多个操作要么全部执行成功,要么全部执行失败,他不会因为其他因素的干扰而中断,一个或多个操作是一个不可分割的整体

        2. 可见性问题 : 在进入编译器的时候,代码可能会重排,而代码的重排会对其他线程访问的结果产生影响

        3. 一致性问题 : 在jvm的内存模型中,所有的共享变量都是存储在主内存中的,而我们的线程是有自己的一个工作内存的,一个线程进来后他是将主内存中的变量拷贝一份到工作内存,在工作内存中对共享变量的操作不会读写到主内存中去

而synchronized就能够解决他的原子性和一致性问题,volatile能够解决他的可见性问题

synchronized : 它是一个关键字,可以对任意的对象或方法使用,能够保证在同一时间内只有一个线程去访问,其他的线程会进入一个阻塞的状态,当他发生异常时会主动的去释放锁,他也叫做悲观锁

volatile : 它是一个类型修饰符,为了保证变量值在修改时能够让其他的线程知道,并且在多线程的访问先不会进入一个阻塞的状态

lock : 是一个接口,能够绑定条件和设置等待超时,在发生异常时需要我们手动的去释放锁,需要用try...cath包起来在finally里面去unlock释放锁,它是一种互斥锁,乐观锁的机制

CAS机制 : 比较并交换 , 也就是将主内存中变量值和工作内存中变量值进行比较,相同就交换,不同就重新去主内存中获取变量在进行比较和交换

jvm : 当我们的类加载后会被编译成字节码.class文件,通过java命令运行字节码文件会进入到三个存储内存 

        1. 类加载子系统 

        2.运行是数据区 : 又叫内存区

                1.堆 : 但凡是new出来的都是放在堆中的

                2. 栈 : 里面存放的是局部变量,有自己的作用域, 当一个线程进来后栈内存会给他分配一个内存空间,线程去执行某一个方法时也会给他分配一个内存空间,在分配内存空间时就叫做入栈,方法执行完被销毁,内存释放就叫做出栈,栈遵循的是一个先进后出的顺序

                堆和栈的区别 : 

                        栈的更新速度的很快的,因为局部变量的生命周期是很短的

                        栈里面存放的是局部变量,执行完后会释放内存,而堆中存放的是实体,会被垃圾回收机制回收

                3. 本地方法 :

                4. 方法区 :

                5. 程序计数器 :

      3.字节码执行引擎 : 去运行内存区的方法代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值