[关闭]
@adamhand 2019-03-14T13:01:27.000000Z 字数 15616 阅读 1145

Java复习资料


Java基础

1. 八种基本数据类型的大小,以及他们的封装类

  1. double ---Double 64 0.0d
  2. long ---Long 64 0L
  3. float ---Float 32 0.0f
  4. int ---Integer 32 0
  5. short ---Short 16 (short)0
  6. char ---Character 16 null\u0000
  7. byte ---byte 8 (byte)0
  8. boolean ---Boolean -- false

boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。

JVM规范里说,

  1. boolean a=true;//这个a在JVM中占4个字节即:32位。
  1. boolean[] b = new boolean[10];//数组时,每一个boolean在JVM中占一个字节

参考Primitive Data TypesThe Java® Virtual Machine Specification


2. Switch能否用string做参数

以前只能支持byte、short、char、int,可以强转;Jdk7.0以后可以,整型、枚举类型、boolean、字符串都可以


3. equals与==的区别

java中的数据类型,可分为两类:


4. 自动装箱,常量池

5. Object有哪些公用方法

clone(),hashCode(),equals(),notify(),notifyAll(),wait(),getClass(),toString,finalize()

6. Java的四种引用,强弱软虚,用到的场景

7. Hashcode的作用

Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值,降低equals的调用,实现存放的值不会重复

8. HashMap的hashcode的作用

HashMap中需要保证插入的元素的key值唯一,所以每插入一个key值,都要判断key值是不是重复,但是如果直接调用key的euqals()方法的话,效率会比较低,所以会先通过hash(key)来调用一下key的hashCode()方法获得hash值,然后使用hash值对数组长度进行取模,就可以找到需要插入的位置。如果该位置没有元素,就可以直接插入了,如果已经有了一个链表,就需要遍历链表,调用key的equals()方法判断key值是否重复网了。

9. ConcurrentHashMap能完全替代HashTable吗?

Hash table虽然性能上不如ConcurrentHashMap,但并不能完全被取代,两者的迭代器的一致性不同的,ConcurrentHashMap由于分段锁,弱一致性主要是为了提升效率。
强一致性就如hashtable一样,锁整个map。

10. Java的四个基本特性(抽象、封装、继承,多态),对多态的理解(多态的实现方式)以及在项目中那些地方用到多态

Java的四个基本特性

多态的理解(多态的实现方式)

要实现多态需要做两件事:1) 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2) 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

项目中对多态的应用

举一个简单的例子,在物流信息管理系统中,有两种用户:订购客户和卖房客户,两个客户都可以登录系统,他们有相同的方法Login,但登陆之后他们会进入到不同的页面,也就是在登录的时候会有不同的操作,两种客户都继承父类的Login方法,但对于不同的对象,拥有不同的操作。

面向对象和面向过程的区别?用面向过程可以实现面向对象吗?那是不是不能面向对象?

面向对象和面向过程的区别

简单的举个例子:汽车发动、汽车到站

重载和重写,如何确定调用哪个函数

面向对象开发的六个基本原则(单一职责、开放封闭、里氏替换、依赖倒置、合成聚合复用、接口隔离),迪米特法则。在项目中用过哪些原则

迪米特法则
迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。
项目中用到的原则
单一职责、开放封闭、合成聚合复用(最简单的例子就是String类)、接口隔离


static和final的区别和用途


Hash Map和Hash Table的区别,Hash Map中的key可以是任何对象或数据类型吗?HashTable是线程安全的么?

Hash Map和Hash Table的区别

Hash Map中的key可以是任何对象或数据类型吗

HashTable是线程安全的么
HashTable是线程安全的,其实现是在对应的方法上添加了synchronized关键字进行修饰,由于在执行此方法的时候需要获得对象锁,则执行起来比较慢。所以现在如果为了保证线程安全的话,使用CurrentHashMap。

HashMap和Concurrent HashMap区别, Concurrent HashMap 线程安全吗, Concurrent HashMap如何保证线程安全?

HashMap和Concurrent HashMap区别?

Concurrent HashMap 线程安全吗, Concurrent HashMap如何保证 线程安全?

String、StringBuffer、StringBuilder以及对String不变性的理解

String、StringBuffer、StringBuilder

String不变性的理解

String有重写Object的hashcode和toString吗?如果重写equals不重写hashcode会出现什么问题?

String有重写Object的hashcode和toString吗?

String重写了Object类的hashcode和toString方法。

当equals方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相对等的两个对象必须有相同的hashCode

重写equals不重写hashcode会出现什么问题
在存储散列集合时(如Set类),如果原对象.equals(新对象),但没有对hashCode重写,即两个对象拥有不同的hashCode,则在集合中将会存储两个值相同的对象,从而导致混淆。因此在重写equals方法时,必须重写hashCode方法
可以参考这里

如果你定义一个类,包括学号,姓名,分数,如何把这个对象作为key?要重写equals和hashcode吗

需要重写equals方法和hashcode,必须保证对象的属性改变时,其hashcode不能改变。

所了解的设计模式,单例模式的注意事项,jdk源码哪些用到了你说的设计模式

所了解的设计模式

单例模式的注意事项

jdk源码中用到的设计模式

Java序列化

Java并发

什么情况下会死锁?

产生死锁的四个必要条件,如果发生死锁,以下四个条件必然成立。只要有一个不满足就不会发生死锁。

死锁预防

死锁避免

进程间通信有哪几种方式?

数据库

在什么情况下适合建立索引

数据表设计:一对一、一对多、多对多

数据库实体间有三种对应关系:一对一一对多多对多

不同的对应关系有不同的处理方式:

参考:
数据库表设计(一对多,多对多)
数据库设计(一对一、一对多、多对多)


JVM

用什么工具可以查出内存泄漏

JVM线程死锁,你该如何判断是因为什么?如果用VisualVM,dump线程信息出来,会有哪些信息

常常需要在隔两分钟后再次收集一次thread dump,如果得到的输出相同,仍然是大量thread都在等待给同一个地址上锁,那么肯定是死锁了。

用什么工具调试程序?JConsole,用过吗?

JConsole 能够监视 JVM 内存的使用情况、线程堆栈跟踪、已装入的类和 VM 信息以及 CE MBean。

了解过JVM调优没,基本思路是什么

调优总结

对于第一点,具体如下:

中间件

redis

redis 是什么?都有哪些使用场景?

redis是一种key-value型的no-sql数据库,支持string、list、set、zset和hash类型数据。

redis使用场景大概如下:

参考:Redis的7个应用场景


redis 有哪些功能?

参考:
Redis是什么?什么作用?优点和缺点
Redis的各项功能解决了哪些问题?


redis 和 memecache 有什么区别?

两者都是非关系型内存键值数据库,主要有以下不同:


redis 为什么是单线程的?

先说一下什么时候用多线程。多线程一般用在某个任务需要花费很长时间的时候,比如,现在有两件事情要做:烧水和洗衣服。烧水一般要花费十几分钟,在烧水的时候不可能一直等待,肯定是会让水烧着,然后去洗衣服,这种情况肯定用多线程比较好。

而redis是内存数据库,操作内存是很快的,不会产生如上面所说的类似于“烧水”这样需要很久才能做完的任务,所以根本没有必要用多线程。用多线程可能更慢,因为线程之间的切换也要花费时间。所以,redis的瓶颈不再内存。

redis使用I/O复用的方式处理网络层的多个socket连接,避免了锁的使用,提高了并发速度,但是,网络带宽和网络传输速率的瓶颈还是避免不了的,所以redis的瓶颈在于网络。

参考:
redis为什么要设计成单线程
为什么单线程的Redis这么快?
为什么说Redis是单线程的以及Redis为什么这么快!


什么是缓存的二八定律

"二八定律":80%的业务访问集中在20%的数据上。这时为了减轻数据的压力和提高网站的数据访问速度,则可以使用缓存机制来优化网站。


什么是冷数据,什么是热数据

冷数据和热数据是根据访问频次来判定的。


什么是缓存穿透?怎么解决?

缓存穿透
指的是对某个一定不存在的数据进行请求,该请求将会穿透缓存到达数据库。

解决方案:

什么是缓存雪崩,怎么解决?

指的是由于数据没有被加载到缓存中,或者缓存数据在同一时间大面积失效(过期),又或者缓存服务器宕机,导致大量的请求都到达数据库。

在有缓存的系统中,系统非常依赖于缓存,缓存分担了很大一部分的数据请求。当发生缓存雪崩时,数据库无法处理这么大的请求,导致数据库崩溃。

解决方案:

什么是缓存击穿,怎么解决?

是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:


redis支持的java客户端都有哪些?jedis 和 redisson 有哪些区别?

Redis的Java客户端很多,官方推荐的有三种:Jedis、Redisson和lettuce。

在这里对Jedis和Redisson进行对比介绍

Jedis:

Redisson:

对于Jedis和Redisson的选择,同样应遵循前述的原理,尽管Jedis比起Redisson有各种各样的不足,但也应该在需要使用Redisson的高级特性时再选用Redisson,避免造成不必要的程序复杂度提升。

参考:
Redis Java客户端的选择


怎么保证缓存和数据库数据的一致性?

http://blog.sina.com.cn/s/blog_bd5db8370102xbj6.html
https://www.oschina.net/question/259473_167708
https://www.jianshu.com/p/a532962cb9e9
https://blog.csdn.net/qq_28740207/article/details/80877079

redis 持久化有几种方式?

redis 怎么实现分布式锁?

redis 分布式锁有什么缺陷?

redis 如何做内存优化?

redis 淘汰策略有哪些?

redis 常见的性能问题有哪些?该如何解决?

Spring

什么时候用get什么时候用post

get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式。在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注