OOP七大原则初理解
1.Final关键字
- 修饰类时,类不可以被继承
- 修饰方法是,类不能被重写,但是能重载
- 修饰变量时,变量不能修改
- 修饰引用类型变量时,就不能再指向另一个对象,但是能修改对象里的值,修饰的是基本数据类型变量时,修饰之后值就不能改变。
- 在匿名内部类里,当使用的是局部变量时,需要给局部变量加个final,来保证数据的一致性
2.String,StringBuffer,StringBuilder
- 首先时String,String是由final修饰,所以创建了就不能对其值进行操作,所以每创建一个值就会new 一个对象。
- StringBuffer和StringBuilder是单一的对象,任何对其字符串变量的操作都不会产生一个新的变量。
- StringBuffer是多线程的,且有加synchronized修饰符,所以是线程安全的。
- StringBuilder是单线程操作字符串,是线程不安全的,但是性能高于StringBuffer
- 优先使用StringBuilder,如果遇到并发问题可以改用为StringBuilder。
3. 重载和重写的区别
- 重写是子类去重写父类的方法,方法名相同。返回值的类型要小于或等于父类,当父类方法用private时,则不能重写该方法。
- 重载是在同一个类,方法名相同,参数个数不同,参数类型不同,参数顺序不同。但是返回的类型,修饰符可以不同。
4. 抽象类和接口的区别
- 抽象类可以定义普通成员函数,而接口只能定义public abstract。
- 抽象类可以的定义多种数据类型,而接口的默认类型是public abstract final
- 一个类只能继承一个抽象类,而以一个类能实现多个接口。
- 抽象类是对子类的一些共性的行为进行的抽象,是代码的复用,所以工程量会比较大,可以把抽象类当成是一个模板,。而接口是对类的行为的一种约束,其子类是具体的实现。
- 当描述行为的本质,是什么的问题,就比如说学生是人,而关注的时操作时,能做什么的问题,则可以用接口。
- 接口和抽象类都不能被实例化。但是可以通过匿名内部类的方式达到new 对象的效果。
- 抽象类用abstract修饰,子类用extend,而接口则是用interface修饰,子类用implement实现。
5.List和Set的区别
- List是有序的可重复的,允许多个null对象。
- 当要去取出对象时,则会用iterator取出所有元素并进行遍历,也可以用下标的方式取出想要的值。
- Set是无序的不可重复的,只允许一个null对象。
- 当要去元素时。只能用iterator取出所有的元素,并逐一遍历每个元素。
6.创建线程的方式
- 继承Thread类
- 实现Runnable接口
- 实现callable接口
7.如何实现线程安全
- Lock锁。利用Reentrant类,需要手动加锁和解锁
- synchronized关键字或者是synchronized块
- 线程之间的通信可以通过信号灯法,和管程法。
8. LinkedList和ArrayLsit的区别
- LinkedList实现的只有list接口,ArrayList实现的是list接口和Deque接口
所以LinkList还可以当作队列来使用。 - LinkedList底层实现基于链表,ArrayLsit底层实现基于数组
- ArrayList更适用于查询速度,LinkedList更适用于添加和删除操作(LinkedList类里查找最后一个和第一元素的速度快。 )
9.HashMap的put的方法
- 不管是JDK1.7还是1.8,都是通过哈希算法算出hashcode,再进行取模操作。
- 1.7是数组加链表,1.8是数组加链表加红黑树(红黑树是加快查询的速度)。如果当前数组的下标位置为空时,1.7将数据封装为Entry对象,1.8将数据封装为Node对象。
- 当下表不为空时:
- 在JDK1.7中,会先判断是否需要扩容,如果不需要扩展,则生成Entry对象,并使用头插法。
- 1.8会判断当前当前位置上的Node是红黑树的Node还是链表的Node
- 如何是当前是一个红黑树的Node,则添加一个红黑树的节点到红黑树中去,但是在添加的一个过程中会去遍历红黑树的Node,如果存在重复的Key,则更新相应的Value的值。
- 如果是一个链表的Node,则会遍历一遍链表,如果存在相同的key则更新Value,不存在时则进行尾插法。在遍历完成时会获得Node的个数,如果结点个数大于8,则会转换为红黑树。
- 1.8是先插入再判断是否需要扩容。
10.ThreadLocal
- ThreadLocal是线程本地存储机制。可以利用改机制存入对象,变量或者信息等,可以在任意时间,任意方法中取出对应的值
- ThreadLocal底层实现是ThreadLocalMap,每个线程有一个ThreadLocal,map的key是ThreadLocal对象,map的value是需要缓存的值。
- ThreadLocal有内存泄露的问题。因为在线程用完后,ThreadLocalMap的key,value也就是Entry对象会一直存在。如果不对ThreadLocal进行Remove,则会一直存在并侵入JVM内存。
11.线程之间如何进行通讯
- 通过共享内存进行通讯。需要考虑什么时候阻塞wait(),notify()
- 通过网络经行通信,需要考虑并发问题,处理方式就是加锁。
12.Mysql
- 索引有几种?
- 普通索引
- 全文索引
- 唯一索引
- 主键索引
- innodb 和myisam的区别
- innodb支持事务,而myisam不支持事务
- innodb适合修改和安全性高的应用,而myisam适合查询和插入操作
- innodb需要用count来计算它的总行数,而myisam可以直接获取行数(有变量保持行数)。
- innodb支持外键,myisam不支持外键。
- innodb必须要有一个主键索引,如果没有则会主动创建一个隐藏的索引
- innodb不支持全文索引,但是在1.2.x版本之后支持
- innodb是聚集索引(索引和数据绑定在一起),而myisam是非聚集索引(索引保存的是数据的地址)。
- innodb支持行锁和表锁 ,myisam只支持表锁。
- 理解leftJoin,rightJoin,innerJoin
- left join,但on后的条件成立时,则两个表都显示,否则只显示左边的表
- inner join,但on后的条件成立时,则两个表都显示,否则两个表都不显示。
13.Spring
- AOP的理解
Aop是面向切面编程,是oop的延伸,通过预处理(预先执行代码。但系统并不会真正的执行)和动态代理来对业务进行插入,降低了业务与业务之间的耦合性,提供代码的效率。 - 事务的理解
- IOC的理解
- bean的生命周期
- bean的创造
- bean的属性赋值
- bean的初始化
- bean的销毁
14.关于静态,继承
- 静态内部类里的非静态方法如何调用
静态内部类里的非静态方法就跟普通成员函数一样。需要new一个对象来进行调用。
静态内部类有和外部类一样的特征。并不是在类定义的时候就初始化。 - 一个类可以有多个父类吗
不能,但是一个父类能被多个子类继承
14.Java和C,C++的区别。
- Java是面向对象的,C是面向过程的。C++是c的增强,是面向对象的
- Java是容易跨平台的,C跨平台难度大
- Java是按模块来运行,而C是按一行行的代码来执行
- Java没有指针,C有多指针
- Java只能继承一个父类,而C可以继承多个父类
- Java的线程是封装好的灵活性没有C好
- C可以直接调用内存
- Java框架比C多,开源库比C多
15.map里能嵌套map吗
可以
16.Redis
- redism可以存储的五个类型
- String ,有序集合,集合,列表,散序列表
17.Http状态码
- 2XX
- 3XX
- 4XX
- 5XX
18.说一说JWT
19.JAVA的小技巧
class <? extends A> 泛形 <>对class类的限定,限定的是A或者A的子类