IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 面试总结! -> 正文阅读

[Java知识库]面试总结!

一、java部分


1.描述对java中继承,多态,重载,重写四个概念的理解?


? ? ? 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

? ? ?继承的作用:通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来


注意:

子类不能选择性继承父类;
Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
构造方法不会被子类继承,但可以从子类中调用父类的构造方法。


继承的优点
继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
可以在子类中声明一个在父类中没有的新字段和方法;
可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使用关键字super来实现。


1.子类可以继承父类的属性和方法,但是不能继承构造方法
2.一个类只能有一个父类,java中继承是单继承的
3.一个类可以有多个子类
4.子类可以扩展父类的属性和方法
5.子类可以修改父类的属性和方法

2.描述java中反射的用途与实现?
用途:
1、反编译:.class-->.java
2、通过反射机制访问java对象的属性,方法,构造方法等

实现
1、通过Class.forName()方法加载字符串,就可以得到该字符串做代表的Class对象。
例如:Class<?> clazz = Class.forName("java.lang.String")就可以得到String类的Class对象。值得注意的是,字符串必须是类的全名,即包名+类名。
?2、通过类名调用class属性得到该类的Class对象。

例如:Class<?> clazz = String.class也可以得到String类的Class对象。

? ? ? ?3、调用实例的getClass()方法。

例如:Date date = new Date();
? ? ? ? ? Class<?> clazz = date.getClass();

通过上边的两句代码就可以得到date实例的Class对象。

? ? ? ? 4、如果是基本类型的包装类,则可以通过调用包装类的Type属性来获得该包装类的Class对象。
? ??

例如:Class<?> clazz = Integer.TYPE;


3.HashMap、HashTable、HashSet、TreeSet四种集合的概念及其它们之间的区别?


HashMap java中以键值对的形式存储数据,可以通过key找到对应的value 采用数组+链表/红黑树的形式存储数据,jdk1.8以后HashMap采用数组+链表/红黑树的方式来存储数据

实现原理
第一步:通过key.hashCode()获取key的hashcode;
第二步:通过(h = key.hashCode()) ^ (h >>> 16)进行高16位的位运算;
第三步:通过(n - 1) & hash对计算的hash值取模运算,得到节点插入的数组所在位置。

HashMap可以接受null键值和值,而HashTable则不能,HashMap是非synchronized的;存储的是键值对。
HashMap几乎可以等价于Hashtable,除了HashMap是非线程安全的并且可以接受null键和null值。

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 允许有 null 值。
HashSet 是无序的,即不会记录插入的顺序。
HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。
HashSet 实现了 Set 接口。


一.HashSet
特点:

1.HashSet中不能有相同的元素,可以有一个Null元素,存入的元素是无序的。
2.HashSet如何保证唯一性?
? ? ?1).HashSet底层数据结构是哈希表,哈希表就是存储唯一系列的表,而哈希值是由对象的hashCode()方法生成。
? ? ?2).确保唯一性的两个方法:hashCode()和equals()方法。
3.添加、删除操作时间复杂度都是O(1)。
4.非线程安全

二.LinkedHashSet
特点:
1.LinkedHashSet中不能有相同元素,可以有一个Null元素,元素严格按照放入的顺序排列。
2.LinkedHashSet如何保证有序和唯一性?
? ? 1).底层数据结构由哈希表和链表组成。
? ? 2).链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性。
3.添加、删除操作时间复杂度都是O(1)。
4.非线程安全

三.TreeSet
特点:

1.TreeSet是中不能有相同元素,不可以有Null元素,根据元素的自然顺序进行排序。
2.TreeSet如何保证元素的排序和唯一性?
底层的数据结构是红黑树(一种自平衡二叉查找树)
3.添加、删除操作时间复杂度都是O(log(n))
4.非线程安全

四.总结:
通过以上特点可以分析出,三者都保证了元素的唯一性,如果无排序要求可以选用HashSet;如果想取出元素的顺序和放入元素的顺序相同,那么可以选用LinkedHashSet。如果想插入、删除立即排序或者按照一定规则排序可以选用TreeSet。


4.线程池的实现原理?


? ? ? 其实java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。

二、数据库部分


1.结合使用场景及设计方式,阐述分库与分表设计的概念及优点?

未答

2.SQL的优化方式?

见笔记


3.如何选择合适的分布式主键方案?
数据库自增长序列或字段。

UUID。

Redis生成ID

Twitter的snowflake算法

利用zookeeper生成唯一ID

MongoDB的ObjectId


UUID
优点:
本地生成ID,不需要进行远程调用,时延低,性能高。
缺点:
UUID过长,16字节128位,通常以36长度的字符串表示,很多场景不适用,比如用UUID做数据库索引字段。
没有排序,无法保证趋势递增

Flicker 主要思路采用了MySQL自增长ID的机制(auto_increment + replace into)
优点:
充分借助数据库的自增ID机制,可靠性高,生成有序的ID。
缺点:
ID生成性能依赖单台数据库读写性能。
依赖数据库,当数据库异常时整个系统不可用。


?类snowflake方案
这种方案生成一个64bit的数字,64bit被划分成多个段,分别表示时间戳、机器编码、序号。
ID为64bit 的long 数字,由三部分组成:

41位的时间序列(精确到毫秒,41位的长度可以使用69年)。
10位的机器标识(10位的长度最多支持部署1024个节点)。
12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)。


优点:
? ? ? 时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序。
性能高,每秒可生成几百万ID。可以根据自身业务需求灵活调整bit位划分,满足不同需求。

?
缺点:
? ? ? ?依赖机器时钟,如果机器时钟回拨,会导致重复ID生成。
在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,有时候会出现不是全局递增的情况。

TDDL序列生成方式
TDDL是阿里的分库分表中间件,它里面包含了全局数据库ID的生成方式,主要思路:

使用数据库同步ID信息。
每次批量取一定数量的可用ID在内存中,使用完后,再请求数据库重新获取下一批可用ID,每次获取的可用ID数量由步长控制,实际业务中可根据使用速度进行配置。
每个业务可以给自己的序列起个唯一的名字,隔离各个业务系统的ID。
- 相比flicker方案,大大降低数据库写压力,数据库不再是性能瓶颈。
- 相比flicker方案,生成ID性能大幅度提高,因为获取一个可用号段后在内存中直接分配,相对于每次读取数据库性能提高了几个量级。
- 不同业务不同的ID需求可以用seqName字段区分,每个seqName的ID获取相互隔离,互不影响。

缺点:
强依赖数据库,当数据库异常时整个系统不可用。

4.数据库索引的原理?
非二叉平衡树


5.Redis如何实现持久化?


? ? ? ? ?Redis支持RDB和AOF两种持久化机制。持久化功能有效地避免因进程退出造成的数据丢失问题,下次重启时利用之前持久化的文件即可实现数据恢复。

RDB:RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。
RDB(快照)持久化:保存某个时间点的全量数据快照
AOF(Append -Only - File)持久化:保存写状态 ?默认是关闭的
RDB-AOF 混合持久化方式


三、分布式架构部分


1.阐述spring中IOC和AOP的概念?
2. springMVC运行的通用基本流程?


3.如何实现前后端分离?
前端的工作:实现整一个前端页面以及交互逻辑,以及利用ajax与nodejs服务器(中间层)交互
后端的工作:提供API接口,利用redis来管理session,与数据库交互
spring boot + vue.js


4.阐述微服务中数据一致性原理?
cap原理是由加州大学伯克利分校Eric Brewer教授提出来的。

指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时满足

一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。
可用性(A): 每个操作都必须以可预期的响应结束
分区容忍性(P): 即使出现单个组件无法可用,操作依然可以完成
实现
传统事务
分布式事务
2pc两段式提交事务
3pc三段式提交事务
?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-07 10:40:45  更:2021-09-07 10:43:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:07:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码