1月26日-备孕春招40天-第16天
①leetcode
86-90
两个没做出来的题:
1,扰乱字符串:
https://leetcode-cn.com/problems/scramble-string/
2,格雷编码:
https://leetcode-cn.com/problems/gray-code/
数组和链表已经基本熟练了,一般就是多指针、逆置等。链表建一个头节点可以省去很多判断,要舍得用引用。回溯和递归的中等题目也都可以写出来了。
dp真的是没有上限,很多题都反应不过来是dp,需要抽空专项训练一下。
②剑指offer:
栈的推入弹出、二叉树层次遍历、之字遍历(用两个栈,进行每一个层次的遍历)、判断是否是先中后序遍历(找根节点,然后递归)
③mybatis:
一级缓存和二级缓存、注解
④八股文:
发现很多问题的回答都看不懂,需要自己总结一下,用自己的思想表达出来观点,这可能不是最正确的答案,但是最高效的记忆方法:
Q:String、StringBuilder、StringBuffer的区别?
String是final,这样stringpool的需要,这样可以线程安全,每次修改都会重新创建一个String,因此多次修改的情况String开销较大,String是基础数据类型,在常量池中,不使用new创建两个String的情况可以用==比较(==比较是不是同一个引用,equals()比较是不是值相等,等价)。StringBuilder是非线程安全的,适合应用在单线程的字符串大量修改的情况。 StringBuffer是线程安全的,适合多线程操作字符串。
Q:final关键字的作用?
基本数据类型不能改变。引用类型不能修改引用其他,但是被引用的内存内容可以改变。修饰方法时,方法不能被重写但是可以重载(参数列表不同)。修饰类不能被继承(太监类)
Q:static关键字
静态变量,跟着类。相对的是实例变量,跟着对象,对象消亡则实例变量消亡。 (private:自己可见。protect:子类可见。public:公开)
Q:存在继承关系下的初始化顺序?
父类的静态变量、静态语句块。子类的静态变量、静态语句块。父类的实例变量、普通语句块、构造函数。子类的实例变量、普通语句块、构造函数。
Q:说一下抽象类和抽象接口?
抽象类和抽象接口使用abstract声明,类中有抽象方法则一定为抽象类。抽象类不能被实例化(new 一个对象)。 接口只能时static或final,接口中的变量必须时public,方法必须时public abstract。 类只能继承一个,接口可以实现多个,抽象类和抽象接口都是描述一些统一的规范和特点,抽象类目的的实现代码的复用,抽象接口是为了实现一些共同的约束。
Q:什么是方法重写?
声明一个和父类相同的方法,需要子类的方法权限更大,子类的返回值需要是父类的返回值或者是父类返回值的子类型,子类的异常类型需要是父类的异常类型或子类型。
Q:创建一个栈的开销?
栈帧、局部变量、常量池、返回值、pc
Q:面向对象的三大特点?
封装、继承、多态。封装指隐藏内部实现的细节,安全性高。继承,不同的对象可能存在着相同的特点,继承可以实现代码的复用性,java中对象可以继承一个父类。多态,一个对象可以有多种状态,父类的引用指向子类实例。
Q:CopyOnWriteArrayList的原理?
写的时候新建一个数组,然后加锁,写完再覆盖回去,如果写的过程中有读,则读旧数据,适合读多写少的情况。
Q:ArrayList与LinkedList区别?
数组和链表的区别,一个是线性存储的,一个是链式存储的。ArrayList每次扩容是之前的1.5倍。
Q:hashmap和hashtable的区别?
hashmap使用hash值(一次16位右位移混合)解决冲突,负载因子0.75,元素达到3/4则扩容。hashtable是数组和链表实现,数组部分是主体,链表是为了防止哈希冲突,hashmap不安全,hashtable安全。treemap基于红黑树实现。map的put()方法,先检查是否需要扩容,检查hash值,不存在就直接添加,存在则替换或者拉链法。
Q:hashmap在7和8下的区别?
1.7中使用数组+链表,1.8中使用数组+链表+红黑树。 1.7头插法,1.8尾插法。 如果需要扩容,1.7先扩容在插入(重新定位进行扩容),1.8先插入在扩容(简单逻辑判断是否扩容)。