刷一下JAVA基础题

1.Final关键字

  1. 修饰类时,类不可以被继承
  2. 修饰方法是,类不能被重写,但是能重载
  3. 修饰变量时,变量不能修改
  4. 修饰引用类型变量时,就不能再指向另一个对象,但是能修改对象里的值,修饰的是基本数据类型变量时,修饰之后值就不能改变。
  5. 在匿名内部类里,当使用的是局部变量时,需要给局部变量加个final,来保证数据的一致性

2.String,StringBuffer,StringBuilder

  1. 首先时String,String是由final修饰,所以创建了就不能对其值进行操作,所以每创建一个值就会new 一个对象。
  2. StringBuffer和StringBuilder是单一的对象,任何对其字符串变量的操作都不会产生一个新的变量。
  3. StringBuffer是多线程的,且有加synchronized修饰符,所以是线程安全的。
  4. StringBuilder是单线程操作字符串,是线程不安全的,但是性能高于StringBuffer
  5. 优先使用StringBuilder,如果遇到并发问题可以改用为StringBuilder。

3. 重载和重写的区别

  1. 重写是子类去重写父类的方法,方法名相同。返回值的类型要小于或等于父类,当父类方法用private时,则不能重写该方法。
  2. 重载是在同一个类,方法名相同,参数个数不同,参数类型不同,参数顺序不同。但是返回的类型,修饰符可以不同。

4. 抽象类和接口的区别

  1. 抽象类可以定义普通成员函数,而接口只能定义public abstract。
  2. 抽象类可以的定义多种数据类型,而接口的默认类型是public abstract final
  3. 一个类只能继承一个抽象类,而以一个类能实现多个接口。
  4. 抽象类是对子类的一些共性的行为进行的抽象,是代码的复用,所以工程量会比较大,可以把抽象类当成是一个模板,。而接口是对类的行为的一种约束,其子类是具体的实现。
  5. 当描述行为的本质,是什么的问题,就比如说学生是人,而关注的时操作时,能做什么的问题,则可以用接口。
  6. 接口和抽象类都不能被实例化。但是可以通过匿名内部类的方式达到new 对象的效果。
  7. 抽象类用abstract修饰,子类用extend,而接口则是用interface修饰,子类用implement实现。

5.List和Set的区别

  1. List是有序的可重复的,允许多个null对象。
  2. 当要去取出对象时,则会用iterator取出所有元素并进行遍历,也可以用下标的方式取出想要的值。
  3. Set是无序的不可重复的,只允许一个null对象。
  4. 当要去元素时。只能用iterator取出所有的元素,并逐一遍历每个元素。

6.创建线程的方式

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现callable接口

7.如何实现线程安全

  1. Lock锁。利用Reentrant类,需要手动加锁和解锁
  2. synchronized关键字或者是synchronized块
  3. 线程之间的通信可以通过信号灯法,和管程法。

8. LinkedList和ArrayLsit的区别

  1. LinkedList实现的只有list接口,ArrayList实现的是list接口和Deque接口
    所以LinkList还可以当作队列来使用。
  2. LinkedList底层实现基于链表,ArrayLsit底层实现基于数组
  3. ArrayList更适用于查询速度,LinkedList更适用于添加和删除操作(LinkedList类里查找最后一个和第一元素的速度快。 )

9.HashMap的put的方法

  1. 不管是JDK1.7还是1.8,都是通过哈希算法算出hashcode,再进行取模操作。
  2. 1.7是数组加链表,1.8是数组加链表加红黑树(红黑树是加快查询的速度)。如果当前数组的下标位置为空时,1.7将数据封装为Entry对象,1.8将数据封装为Node对象。
  3. 当下表不为空时:
  • 在JDK1.7中,会先判断是否需要扩容,如果不需要扩展,则生成Entry对象,并使用头插法。
  • 1.8会判断当前当前位置上的Node是红黑树的Node还是链表的Node
  • 如何是当前是一个红黑树的Node,则添加一个红黑树的节点到红黑树中去,但是在添加的一个过程中会去遍历红黑树的Node,如果存在重复的Key,则更新相应的Value的值。
  • 如果是一个链表的Node,则会遍历一遍链表,如果存在相同的key则更新Value,不存在时则进行尾插法。在遍历完成时会获得Node的个数,如果结点个数大于8,则会转换为红黑树。
  • 1.8是先插入再判断是否需要扩容。

10.ThreadLocal

  1. ThreadLocal是线程本地存储机制。可以利用改机制存入对象,变量或者信息等,可以在任意时间,任意方法中取出对应的值
  2. ThreadLocal底层实现是ThreadLocalMap,每个线程有一个ThreadLocal,map的key是ThreadLocal对象,map的value是需要缓存的值。
  3. ThreadLocal有内存泄露的问题。因为在线程用完后,ThreadLocalMap的key,value也就是Entry对象会一直存在。如果不对ThreadLocal进行Remove,则会一直存在并侵入JVM内存。

11.线程之间如何进行通讯

  1. 通过共享内存进行通讯。需要考虑什么时候阻塞wait(),notify()
  2. 通过网络经行通信,需要考虑并发问题,处理方式就是加锁。

12.Mysql

  1. 索引有几种?
  • 普通索引
  • 全文索引
  • 唯一索引
  • 主键索引
  1. innodb 和myisam的区别
  • innodb支持事务,而myisam不支持事务
  • innodb适合修改和安全性高的应用,而myisam适合查询和插入操作
  • innodb需要用count来计算它的总行数,而myisam可以直接获取行数(有变量保持行数)。
  • innodb支持外键,myisam不支持外键。
  • innodb必须要有一个主键索引,如果没有则会主动创建一个隐藏的索引
  • innodb不支持全文索引,但是在1.2.x版本之后支持
  • innodb是聚集索引(索引和数据绑定在一起),而myisam是非聚集索引(索引保存的是数据的地址)。
  • innodb支持行锁和表锁 ,myisam只支持表锁。
  1. 理解leftJoin,rightJoin,innerJoin
  • left join,但on后的条件成立时,则两个表都显示,否则只显示左边的表
  • inner join,但on后的条件成立时,则两个表都显示,否则两个表都不显示。

13.Spring

  1. AOP的理解
    Aop是面向切面编程,是oop的延伸,通过预处理(预先执行代码。但系统并不会真正的执行)和动态代理来对业务进行插入,降低了业务与业务之间的耦合性,提供代码的效率。
  2. 事务的理解
  3. IOC的理解
  4. 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

  1. redism可以存储的五个类型
  • String ,有序集合,集合,列表,散序列表

17.Http状态码

  • 2XX
  • 3XX
  • 4XX
  • 5XX

18.说一说JWT

19.JAVA的小技巧

class <? extends A> 泛形 <>对class类的限定,限定的是A或者A的子类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值