Java开发常见面试题

什么是数据库?
数据库(Database):简称DB,数据库是按照一定的结构来组织、存储和管理数据的仓库。
什么是数据库管理系统?
数据库管理系统(Database Management System):简称DBMS,数据库管理系统是一种操纵和管理数据库的大型软件,用于创建、使用和维护数据库。
什么是关系型数据库?
关系型数据库(Relational Database Management System):简称RDBMS。是建立在关系模型的基础上,由若干个相互关联的二维表组成的数据库。
关系型数据库特点:
1、使用表来存储数据,格式统一,便于维护。
2、使用SQL语句操作数据库,标准统一,使用方便。
3、数据存储在磁盘中,相对安全。
结构化查询语言可分为哪5类?
分类 名称 用途 代表关键字
DDL (Data Definition Language) 数据定义语言 用来定义数据库、表及其它对象的结构 CREATE、DROP、ALTER
DML (Data Manipulation Language) 数据操作语言 用来增加、修改、删除表中的数据 INSERT、DELETE、UPDATE
DQL (Data Query Language) 数据查询语言 用来查询表中的数据 SELECT、FROM、WHERE、ORDER BY 、GROUP BY、HAVING
DCL (Data Control Language) 数据控制语言 用来授予和收回权限 GRANT、REVOKE
TCL (Transaction Control Language) 事务处理语言 用来对数据进行提交和回滚 COMMIT、ROLLBACK

谈谈SQL关键字的概念和规则?
关键字:是SQL语言保留的字符串,有着的特殊的功能。
为了增加程序的可读性,在写SQL的时候,通常需要遵守如下规范:
1、一条SQL语句可以单行书写,也可以书写多行,以分号结尾。建议多行书写,增强代码可读性,通常每条子句占一行。
2、适当增加缩进或空格,提高程序的可读性。
3、SQL语句不区分大小写,也就是说SELECT,select,Select,执行时效果是一样的,关键字最好使用大写,其它语法元素(如列名、表名等)小写。
4、不能使用关键字,关键字不可以缩写、分开以及跨行书写,如SELECT不可以写成SEL或SELE CT等形式。
什么是空值?
空值用NULL表示,表示一种无效的、未知的值,空值不是零,也不是空格。
消除重复行的关键字是什么?
关键字 DISTINCT
日期型数值作为被比较的值时需要注意什么?
字符型和日期型数据做为查询条件时,条件表达式右边的值,必须加单引号。
字符型数据作为被比较的值时需要注意什么?
字符型和日期型数据做为查询条件时,条件表达式右边的值,必须加单引号。
谈谈and和or两个关键字的区别?
AND 逻辑与,用来连接两个条件表达式。如果每个条件表达式的结果都为TRUE,整个表达式的结果才为TRUE。
OR 逻辑或,用来连接两个条件表达式。只要有1个条件表达式的结果为TRUE,整个表达式的结果就为TRUE。

列出sql中运算符的优先级
优先级 运算分类 运算符举例
1 算术运算符 *, , +, -
2 比较运算符 =, <>, <, >, <=, >=
3 特殊比较运算符 BETWEEN…AND… ,IN,LIKE,IS NULL
4 逻辑非 NOT
5 逻辑与 AND
6 逻辑或 OR

ORDER BY子句排序规则(以升序为例)?
1、ORDER BY子句前面的内容,已经讲过,不再赘述。
2、可以按照3种方式进行排序:分别是按列名排序、按列别名排序、按列序号排序。
3、ASC表示按升序排序(默认值), DESC表示按降序排序。
4、可以同时按照多个列名进行排序
5、ORDER BY 子句必须写在SELECT语句的最后
6、数字升序排列小值在前,大值在后。即按照数字大小顺序由小到大排列。
7、日期升序排列相对较早的日期在前,较晚的日期在后。
8、字符升序排列按照字母由小到大的顺序排列,即由A-Z排列。
9、空值在升序排列中排在最前面,在降序排列中排在最后。
限制记录的行数用什么关键字?
Limit
说明:
1.limit接受一个或两个整数参数。start表示从第几行记录开始输出(不写默认是0),length表示输出的记录行数。
2.起始索引从0开始,起始索引=(查询页码-1)* 每页显示的记录数
3. 分页查询是数据库方言,不同的数据库有不同的实现,MySQL中是使用LIMIT实现
4. 如果查询的是第一页数据(10条数据),起始索引可以省略,直接简写为 limit 10

分页查询如果每页显示n条数据,那每页的数据起始行数计算公式是啥?
limit分页公式:curPage是当前第几页;pageSize是一页多少条记录 limit (curPage-1)*pageSize,pageSize 1
什么是多表连接?
连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据。
在 WHERE子句中书写连接条件。
如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀。
N个表相连时,至少需要N-1个连接条件
N个表相连时,至少需要多少个连接条件?
N个表相连时,至少需要N-1个连接条件
什么是笛卡尔积?
笛卡尔积,在数据库中表示将A表中每条记录与B表中的每条记录进行连接,连接后的查询结果就是笛卡尔积,也叫交叉连接。
笛卡尔积产生的原因是什么?
连接条件被省略
连接条件是无效的
描述一下多表连接的写法
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
在 WHERE子句中书写连接条件。
如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀。
N个表相连时,至少需要N-1个连接条件

什么是自连接?
自身连接,也叫自连接,是一个表通过某种条件和本身进行连接的一种方式,就如同多个表连接一样。

左外连接的特点?
在多表连接时,可以使用外部连接来查看没有匹配连接条件的数据行。
左外连接以LEFT OUTER JOIN关键字左边的表为基表,该表所有行数据按照连接条件无论是否与右边表能匹配上,都会被显示出来。
右外连接以RIGHT OUTER JOIN子句中的右边表为基表,该表所有行数据按照连接条件无论是否与左边表能匹配上,都会被显示出来。
什么是交叉连接?
笛卡尔积,在数据库中表示将A表中每条记录与B表中的每条记录进行连接,连接后的查询结果就是笛卡尔积,也叫交叉连接。

什么是自然连接?
自然连接:是一种特殊的等值连接,它要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。
什么是分组函数?
分组函数是对表中一组记录进行操作,每组只返回一个结果,即首先要对表记录进行分组,然后再进行操作汇总,每组返回一个结果,分组时可能是整个表分为一组,也可能根据条件分成多组。
举例常用到的分组函数并说明其含义
常用的分组函数
分组函数常用到以下五个函数:
MIN 最小值
MAX 最大值
SUM 总和
AVG 平均值
COUNT 返回满足条件的每组记录条数。
除了哪个分组函数之外,其它所有分组函数都会忽略列中的空值,然后再进行计算?
除了COUNT(*)之外,其它所有分组函数都会忽略列中的空值,然后再进行计算
简单表述IFNULL 函数的作用
IFNULL 函数可以使分组函数强制包含含有空值的记录
写出 求各部门平均工资 的sql语句
SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno;
简述GROUP BY 子句的使用规则
在SELECT列表中除了分组函数那些项,所有列都必须包含在GROUP BY 子句中。
GROUP BY 所指定的列并不是必须出现在SELECT 列表中。
HAVING 子句的作用是什么?
不能在 WHERE子句中限制组
可以通过 HAVING 子句限制组
使用 HAVING 子句限制组
记录已经分组.
使用过组函数.
与 HAVING 子句匹配的结果才输出
简述SELECT语句执行过程
SELECT语句执行过程:
1.通过FROM子句中找到需要查询的表;
2.通过WHERE子句进行非分组函数筛选判断;
3.通过GROUP BY子句完成分组操作;
4.通过HAVING子句完成组函数筛选判断;
5.通过SELECT子句选择显示的列或表达式及组函数;
6.通过ORDER BY子句进行排序操作。
子查询类型

简述多行子查询中ANY的使用
ANY:表示和子查询的任意一行结果进行比较,有一个满足条件即可。
o< ANY:表示小于子查询结果集中的任意一个,即小于最大值就可以。
o> ANY:表示大于子查询结果集中的任意一个,即大于最小值就可以。
o= ANY:表示等于子查询结果中的任意一个,即等于谁都可以,相当于IN。
简述多行子查询中ALL的使用
ALL:表示和子查询的所有行结果进行比较,每一行必须都满足条件。
o< ALL:表示小于子查询结果集中的所有行,即小于最小值。
o>ALL:表示大于子查询结果集中的所有行,即大于最大值。
o= ALL :表示等于子查询结果集中的所有行,即等于所有值,通常无意义。
用两种方式写出    查询不是经理的员工姓名   的sql语句
SELECT ename
FROM emp
WHERE empno NOT IN
(SELECT mgr
FROM emp);
SELECT ename
FROM emp
WHERE empno != ANY
(SELECT mgr
FROM emp);

什么是唯一约束?
唯一约束可以保证记录的唯一性,即就是同一个表中,相同字段的值不会出现重复。
唯一约束的字段可以为空值(NULL)。
每一张数据表可以存在多个唯一约束字段。
什么是主键约束?
数据库表要求表中的每一行记录都必须是唯一的,即在同一张表中不允许出现完全相同的两条记录。在设计数据库时,为了保证记录的“唯一性”,最为普遍、最为推荐的做法是为表定义一个主键(primary key)。数据库表中主键有以下两个特征:
表的主键可以由一个字段构成,也可以由多个字段构成(这种情况称为复合主键)。
数据库表中主键的值具有唯一性且不能取空值(NULL),当数据库表中的主键由多个字段构成时,每个字段的值不能取NULL值。
外键约束?
如果表A中的一个字段a对应于表B的主键b,则字段a称为表A的外键。此时存储在表A中字段a的值,同时这个字段值也是表B主键b的值。
什么是事务?
事务(Transaction):也称工作单元,是由一个或多个SQL语句所组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。
事务的特征?
事务特征可用四个字母的缩写表示:即ACID
原子性(Atomicity)
事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
一致性(Consistency)
一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。
隔离性(Isolation)
一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户从取钱,通过事务的隔离性确保账户余额的正确性。
持久性(Durability)
也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。
TRUNCATE和DELETE区别?
TRUNCATE是DDL,只能删除表中所有记录,释放存储空间,使用ROLLBACK不可以回滚。
DELETE是DML,可以删除指定记录,不释放存储空间,使用ROLLBACK可以回滚。
什么是非空约束?
强制列不能为 NULL 值,约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
什么是数据库视图
视图是逻辑上来自一个或多个表的数据集合。或者说:视图是经过定制的方式显示来自一张或多张表中的数据。
视图也可以看做是“虚拟表”,或者“存储的查询”。
为什么要使用视图
为什么要使用视图:
视图可以限制其它用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分;
视图容易实现复杂的查询;
对于相同的数据可以产生不同的视图;
视图的特点
创建视图所依据的表叫做“基表”。
基表可以是一个,也可以是多个。
在视图上也可以修改数据。(基表有多个时不能修改)
如果修改违反了约束,也不能修改。
视图的优点:安全性、隐藏复杂性、简化sql命令。
创建视图的语法
create view 视图名 as 查询语句;
什么是索引
在关系数据库中,索引是一种对数据库表中一列或多列的值进行排序的一种存储结构,用于快速找出在某个列中有一特定值的行。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
常用的索引类型有哪些
1.普通索引(索引名:index)
普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。普通索引允许在定义索引的列中插入重复值和空值。
2.唯一索引(索引名:unique)
顾名思义,唯一索引就是专门为具有唯一约束字段创建的索引。当一个字段被设置唯一约束时,MySql会自动为此字段创建唯一索引。唯一索引列的值必须唯一,但允许有空值。
3.主键索引(索引名:primary key)
顾名思义,主键索引就是专门为主键字段创建的索引。当一个字段被设置为主键时,MySql会自动为此字段创建主键索引。主键索引是一种特殊的唯一索引,不允许值重复或者值为空。
4.全文索引(索引名:fulltext)
全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。
5.空间索引(索引名:spatial)
空间索引是对地理空间数据类型 GEOMETRY的字段建立的索引。创建空间索引的列必须将其声明为 NOT NULL,空间索引只能在存储引擎为 MyISAM 的表中创建。对于初学者来说,这类索引很少会用到。

简述索引使用原则
并不是每个字段都设置索引就好,也不是索引越多越好,而是需要合理的使用。
1.对经常更新的表就避免对其进行过多的索引。
2.对经常用于查询的字段应该创建索引。
3.数据量小的表最好不要使用索引。
4.相同值较多的字段上不要建立索引(比如"性别"字段)。相反的,在不同值较多的字段上可以建立索引。
创建索引语法
create 索引类型 索引名 on 表名(列名);
什么是存储过程
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。MySQL 5.0 版本开始支持存储过程。
它是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
存储过程的优缺点
优点:
存储过程在服务器端运行,执行速度快。
存储过程执行一次后,经过第一次编译后就不需要再次编译,提高了系统性能。
确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限

缺点:
存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
存储过程的性能调校与撰写,受限于各种数据库系统。

创建存储过程语法
create procedure 存储过程名(参数列表)
begin
– 过程体
end;
调用存储过程语法
call getsalbydeptno(10,@salsum);
select @salsum;
使用call关键词调用存储过程。
传出参数使用 @salsum 的形式声明。

什么是触发器
触发器是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
触发器经常用于加强数据的完整性约束和业务规则等。
触发器类型有:insert触发器、delete触发器、update触发器。
创建触发器语法
create trigger 触发器名 触发时机 触发事件 on 表 for each row
begin
– 触发器业务代码
end;
简述以下你所了解的数据库优化
1.1.数据库设计优化

1.适度的违反范式
2.在开发应用程序时,数据库设计要最大程度的遵守三范式。当 然,三范式最大的问题在于查询时通常需要join很多表,导致查询效率很低。所以有时候基于性能考虑,我们需要有意的违反三范式。也就是适度的做冗余,以达到提高查询效率的目的。注意这里的反范式是适度的。
3.适当建立索引
4.索引可以有效的提高查询速度,但这个提高是以插入、更新、删除的速度为代价的。由于索引的存储结构不同于表的存储,一个表的索引所占空间比可能数据所占空间还大。这意味着我们在写数据库的时候做了很多额外的工作,而这个工作只是为了提高读的效率。因此,我们建立一个索引,必须保证这个索引不会“亏本”。一般需要遵守这样的规则:
对经常更新的表就避免对其进行过多的索引。
对经常用于查询的字段应该创建索引。
数据量小的表最好不要使用索引。
相同值较多的字段上不要建立索引(比如"性别"字段)。相反的,在不同值较多的字段上可以建立索引。
5.对表进行水平划分
6.如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了。如果我拆成100个表,那么每个表只有10万条记录。当然这 需要数据在逻辑上可以划分。一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势。
7.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了。
8.对表进行垂直划分
9.有些表记录数并不多,但是字段却很多,导致表占用空间很大,检索表时需要执行大量I/O,严重降低了性能。解决方案是:可以把一部分字段拆分到另一个表,并且该表与原表是一对一的关系。
10.选择合适的引擎
11.在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎。比如:
InnoDB存储引擎支持外键、支持事务、支持全文检索;
MyISAM存储引擎可以被压缩、不支持事务、不支持外键;如果需要执行大量的select语句,MyISAM存储引擎是更好的选择。
MEMORY存储引擎主要用于那些内容稳定的表,或者作为统计操作的中间表。

1.2.SQL语句优化

1.尽量使用批量操作
2.尽量使用MySql中的批量操作语句,这样可以避免频繁读写操作。比如:批量插入、批量更新、批量删除。
3.选择适当的数据类型
4.选择字段的数据类型的一般原则是尽量使用占用字节小的数据类型。
5.比如主键, 强烈建议用自增类型,既节省空间,又能满足大多数需求。
6.文件、图片等大文件用文件系统存储,不要使用数据库
7.数据库只存储文件路径。这是一个基本原则!
8.使用连接(JOIN)来代替子查询(Sub-Queries)
9.MySQL从4.1开始支持SQL的子查询。但是,子查询可以被更有效率的连接替代。连接之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成需要多个步骤才能完成的子查询。
10.对查询语句进行优化
11.绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。下面是应该注意的几个方面。
首先,最好是在相同类型的字段间进行比较的操作,可以避免转型的步骤。
其次,在建有索引的字段上尽量不要使用函数进行操作。使用函数后索引将失效。
在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。
应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。
1.3.数据库参数配置优化
MySql安装之后,默认参数并不能满足所有生产场合下的需求。所以,还需要根据需求,修改Mysql服务器的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能。比如:
wait_timeout:MySQL客户端的数据库连接闲置最大时间值。
max_connections:MySQL的最大连接数。
max_user_connections:每个数据库用户的最大连接。
thread_concurrency:线程最大并发数。
default-storage-engine:设置MySQL默认存储引擎
1.4.硬件和系统的优化

1.合理采用操作系统
2.如果服务器内存超过4G,那么毋庸置疑应当采用64位操作系统和64位mysql
3.读写分离
4.如果数据库压力很大,一台机器支撑不了,那么可以用mysql复制实现多台机器同步,将数据库的压力分散。
5.比如:主库用来写入,从库都用来做select,那么每个数据库分担的压力小了很多。当然,要实现这种方式,需要程序特别设计,给程序开发带来了额外负担。不过现在已经有中间件来实现这些功能。

三大范式
第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)
第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
第三范式(3NF):满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)
DML 语句和 DDL 语句区别
DML 是数据库操作语言(Data Manipulation Language)的缩写,是指对数据库中表记录的操作,主要包括表记录的插入、更新、删除和查询,是开发人员日常使用最频繁的操作。
DDL (Data Definition Language)是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。它和 DML 语言的最大区别是 DML 只是对表内部数据的操作,而不涉及到表的定义、结构的修改,更不会涉及到其他对象。DDL 语句更多的被数据库管理员(DBA)所使用,一般的开发人员很少使用。

主键和外键的区别
主键:用于唯一标识一行数据,不能有重复,不允许为空,且一个表只能有一个主键;
外键:用来和其他表建立联系,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键;
drop、delete、truncate 区别

基础架构
MyISAM 和 InnoDB 有什么区别?
MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默认存储引擎,MySQL 5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。
(1)是否支持行级锁
MyISAM 只有表级锁,而 InnoDB 支持行级锁和表级锁,默认为行级锁。
(2)是否支持事务
MyISAM 不提供事务支持,InnoDB 提供事务支持,实现了 SQL 标准定义的四个隔离级别,具有提交和回滚事务的能力。
InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)。
(3)是否支持外键
MyISAM 不支持,而 InnoDB 支持。
(4)是否支持数据库异常崩溃后的安全恢复
MyISAM 不支持,而 InnoDB 支持。使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log 。
(5)是否支持 MVCC
MyISAM 不支持,而 InnoDB 支持。
(6)索引实现
虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
InnoDB 引擎中,其数据文件本身就是索引文件。其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶子节点 data 域保存了完整的数据记录。
MyISAM 索引文件和数据文件是分离的,索引保存的是数据文件的指针。
(7)性能差别
InnoDB 的性能比 MyISAM 更强大,不管是在读写混合模式下还是只读模式下,随着 CPU 核数的增加,InnoDB 的读写能力呈线性增长。MyISAM 因为读写不能并发,它的处理能力跟核数没关系。

InnoDB 和 MyISAM 性能对比

推荐自增id作为主键问题
普通索引的 B+ 树上存放的是主键索引的值,如果该值较大,会「导致普通索引的存储空间较大」
使用自增 id 做主键索引新插入数据只要放在该页的最尾端就可以,直接「按照顺序插入」,不用刻意维护
页分裂容易维护,当插入数据的当前页快满时,会发生页分裂的现象,如果主键索引不为自增 id,那么数据就可能从页的中间插入,页的数据会频繁的变动,「导致页分裂维护成本较高」

为什么 MySQL 的自增主键不连续
在MySQL 5.7及之前的版本,自增值保存在内存里,并没有持久化;
唯一键冲突:插入数据时先将自增主键+1,然后插入数据时唯一键冲突,插入数据失败,但是未将自增主键改回;
事务回滚:和唯一键冲突类似,回滚操作时自增值也不回退,事实上,这么做的主要原因是为了提高性能。
redo log 是做什么的?
redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。
比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。
更新表数据的时候,如果发现 Buffer Pool 里存在要更新的数据,就直接在 Buffer Pool 里更新。然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到 redo log 文件里。

redo log 是怎么记录日志的
硬盘上存储的 redo log 日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo日志文件大小都是一样的。
比如可以配置为一组4个文件,每个文件的大小是 1GB,整个 redo log 日志文件组可以记录4G的内容。
它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。

所以,如果数据写满了但是还没有来得及将数据真正的刷入磁盘当中,那么就会发生「内存抖动」现象,从肉眼的角度来观察会发现 mysql 会宕机一会儿,此时就是正在刷盘了。

什么是 binlog
binlog 是归档日志,属于 Server 层的日志,是一个二进制格式的文件,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”。
不管用什么存储引擎,只要发生了表数据更新,都会产生 binlog 日志。它的主要作用就是数据备份、主从复制。
binlog会记录所有涉及更新数据的逻辑操作,属于逻辑日志,并且是顺序写。

binlog 记录格式
binlog 日志有三种格式,可以通过binlog_format参数指定。
statement :记录的内容是SQL语句原文,存在数据一致性问题;
row:记录包含操作的具体数据,能保证同步数据的一致性;
mixed:记录的内容是前两者的混合,MySQL会判断这条SQL语句是否可能引起数据不一致:如果是,就用row格式,否则就用statement格式。

binlog 写入机制
事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。
因为一个事务的binlog不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为binlog cache。
我们可以通过binlog_cache_size参数控制单个线程 binlog cache 大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap)。
binlog 也提供了 sync_binlog 参数来控制写入 page cache 和磁盘的时机:
0:每次提交事务都只写入到文件系统的 page cache,由系统自行判断什么时候执行fsync,机器宕机,page cache里面的 binlog 会丢失。
1:每次提交事务都会执行fsync,就如同 redo log 日志刷盘流程 一样。
N(N>1):每次提交事务都写入到文件系统的 page cache,但累积N个事务后才fsync。如果机器宕机,会丢失最近N个事务的binlog日志。

redolog 和 binlog 的区别是什么
redolog 是 Innodb 独有的日志,而 binlog 是 server 层的,所有的存储引擎都有使用到;
redolog 记录了具体的数值,对某个页做了什么修改,binlog 记录的操作内容;
binlog 大小达到上限或者 flush log 会生成一个新的文件,而 redolog 有固定大小只能循环利用;
binlog 日志没有 crash-safe 的能力,只能用于归档,而 redo log 有 crash-safe 能力;
redo log 在事务执行过程中可以不断写入(刷盘设置为1,后台线程1s执行一次或者 redo log buffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候),而 binlog 只有在提交事务时才写入文件缓存系统;

两阶段提交
假设执行 sql 过程中写完 redo log 日志后,binlog 日志写期间发生了异常,会出现什么情况呢?
由于 binlog 没写完就异常,这时候 binlog 里面没有对应的修改记录。因此,之后用 binlog 日志恢复数据时,就会少这一次更新,最终数据不一致。
为了解决两份日志之间的逻辑一致问题,InnoDB 存储引擎使用两阶段提交方案。
将 redo log 的写入拆成了两个步骤 prepare 和 commit,这就是两阶段提交。使用两阶段提交后,写入 binlog 时发生异常也不会有影响,因为 MySQL 根据 redo log日志恢复数据时,发现 redo log 还处于 prepare 阶段,并且没有对应 binlog 日志,就会回滚该事务。
再看一个场景,redo log 设置 commit 阶段发生异常,那会不会回滚事务呢?
并不会回滚事务,虽然 redo log 是处于 prepare 阶段,但是能通过事务id找到对应的 binlog 日志,所以 MySQL 认为是完整的,就会提交事务恢复数据。

什么是 undo log.
我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作(INSERT、DELETE、UPDATE)进行回滚,在 MySQL 中,恢复机制是通过回滚日志(undo log) 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。
每次对记录进行改动都会记录一条 undo log,每条 undo log 也都有一个DB_ROLL_PTR属性,可以将这些 undo log 都连起来,串成一个链表,形成版本链。
版本链的头节点就是当前记录最新的值。

什么是 relaylog
relaylog 是中继日志,在主从同步的时候使用到,它是一个中介临时的日志文件,用于存储从 master 节点同步过来的 binlog 日志内容。

master 主节点的 binlog 传到 slave 从节点后,被写入 relay log 里,从节点的 slave sql 线程从 relaylog 里读取日志然后应用到 slave 从节点本地。
从服务器 I/O 线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后 SQL 线程会读取 relay-log 日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。

索引
索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。
索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。

Hash 索引
哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据(接近 O(1))。
但是!哈希算法有个 Hash 冲突问题,也就是说多个不同的 key 最后得到的 index 相同。通常情况下,我们常用的解决办法是 链地址法。
链地址法就是将哈希冲突数据存放在链表中。就比如 JDK1.8 之前 HashMap 就是通过链地址法来解决哈希冲突的。不过,JDK1.8 以后 HashMap 为了减少链表过长的时候搜索时间过长引入了红黑树。
为了减少 Hash 冲突的发生,一个好的哈希函数应该“均匀地”将数据分布在整个可能的哈希值集合中。
既然哈希表这么快,为什么 MySQL 没有使用其作为索引的数据结构呢? 主要是因为 Hash 索引不支持顺序和范围查询。假如我们要对表中的数据进行排序或者进行范围查询,那 Hash 索引可就不行了,并且每次 IO 只能取一个。

B树和B+ 树
B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。
B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。

主键索引
数据表的主键列使用的就是主键索引,一种特殊的唯一索引。
在 MySQL 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是否有唯一索引且不允许存在 null 值的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。
二级索引
二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。
唯一索引,普通索引,前缀索引等索引属于二级索引。
唯一索引(Unique Key) :唯一索引也是一种约束。索引列的值必须唯一,但允许有空值;如果是组合索引,则列值的组合必须唯一。一张表允许创建多个唯一索引。建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合(后文介绍);
全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。
MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。

聚簇索引与非聚簇索引
聚簇索引即索引结构和数据一起存放的索引,并不是一种单独的索引类型。InnoDB 的主键索引的叶子节点中存放的就是数据行,所以它属于聚簇索引。
在 MySQL 中,InnoDB 引擎的表的 .ibd 文件就包含了该表的索引和数据,对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。
非聚簇索引即索引结构和数据分开存放的索引,并不是一种单独的索引类型。二级索引(辅助索引)就属于非聚簇索引。MySQL 的 MyISAM 引擎,不管主键还是非主键,使用的都是非聚簇索引。
辅助索引是我们人为创建的索引,它的叶子节点中存放的是主键,当我们通过辅助索引查找到主键之后,再通过查找的主键去回表查找主键索引。

回表
回表就是先通过数据库索引扫描出该索引树中数据所在的行,取到主键 id,再通过主键 id 取出主键索引数中的数据,即基于非主键索引的查询需要多扫描一棵索引树。
覆盖索引和联合索引
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”。指的是通过索引就能查询到我们所需要的数据,而不需要根据索引再去查询数据表中的数据( 回表),这样就减少了数据库的 io 操作,提高查询效率。
使用表中的多个字段创建索引,就是联合索引,也叫组合索引或复合索引。

最左前缀匹配原则
最左前缀匹配原则指的是在使用联合索引时,MySQL 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询,如 >、<、between 和 以%开头的like查询 等条件,才会停止匹配。
所以,我们在使用联合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。

索引下推
索引下推(Index Condition Pushdown) 是 MySQL 5.6 版本中提供的一项索引优化功能,可以在非聚簇索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表次数。
隐式转换
当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL 会根据需要自动将字符串转换为数字,反之亦然。以下规则描述了比较操作的转换方式:
两个参数至少有一个是NULL时,比较的结果也是NULL,特殊的情况是使用<=>对两个NULL做比较时会返回1,这两种情况都不需要做类型转换;
两个参数都是字符串,会按照字符串来比较,不做类型转换;
两个参数都是整数,按照整数来比较,不做类型转换;
十六进制的值和非数字做比较时,会被当做二进制串;
有一个参数是TIMESTAMP或DATETIME,并且另外一个参数是常量,常量会被转换为timestamp;
有一个参数是decimal类型,如果另外一个参数是decimal或者整数,会将整数转换为decimal后进行比较,如果另外一个参数是浮点数,则会把decimal转换为浮点数进行比较;
所有其他情况下,两个参数都会被转换为浮点数再进行比较;

普通索引和唯一索引该怎么选择?
查询
当普通索引为条件时查询到数据会一直扫描,直到扫完整张表;
当唯一索引为查询条件时,查到该数据会直接返回,不会继续扫表;
更新
普通索引会直接将操作更新到 change buffer 中,然后结束
唯一索引需要判断数据是否冲突
所以唯一索引更加适合查询的场景,普通索引更适合插入的场景。

Java语言的版本?
JavaSE:标准版(Standard )。JavaSE包含构成Java语言核心的类,适合开发桌面应用程序和底层应用程序。同时它也是JavaEE的基础平台。
JavaEE :企业版(Enterprise)。JavaEE是在JavaSE平台的基础上构建的,它包含用于开发企业级应用的类,如EJB、servlet、JSP、事务控制等,为企业级应用提供了标准平台,简化复杂的企业级编程。
JavaME :微型版(Micro)。包含JavaSE平台中一部分类,用于嵌入式系统开发,专门针对一些小型的消费电子产品,如:手机、PDA、机顶盒。
简述Java的特点?
跨平台,半编译半解释,简单,面向对象,分布式,健壮,安全,支持多线程
java注释的分类?
单行 //; /* 多行*/; /** 文档 */。
简述Java程序运行的原理
编写Java程序需要分3个步骤,编辑、编译、运行。实际上,Java程序是运行在Java虚拟机上的,Java虚拟机英文缩写为JVM:Java Virtual Machine ,虚拟机是一个虚构出来的计算机,有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码文件(字节码文件),就可以在多种平台上不加修改地运行。
标识符的命名规则?
1.标识符必须以字母、下划线(_)、数字或美元( )组成; 2. 标识符必须由字母、下划线 ( ) 或美元( )组成; 2. 标识符必须由字母、下划线(_)或美元( )组成;2.标识符必须由字母、下划线或美元()开头,不能由数字开头;
3.标识符不能是关键字或者保留字;
4.标识符中不能有空格;
5.标识符没有长度限制。
什么是变量及变量的作用?
变量(variable)是用来存储数据的一块存储区域,在程序运行中它的值可以发生变化。变量可以存放一种数据类型的值,Java程序在运行加载时会根据变量的不同数据类型来分配不同的内存空间,变量的数据类型在声明时指定。
变量是指在程序的运行过程中随时可以发生变化的量,作用是:
1.变量是程序中数据的临时存放场所
2.保存程序运行时用户输入的数据
3.特定的运算结果等
常量的特点?
在Java中,常量用关键字final来表示,它也是有数据类型的,语法如下:
final 数据类型 常量名 = 初始值;
特点:
1.常量在声明的时候必须初始化;
2.常量在初始化后值不能再更改,否则会引起错误。
基本数据类型有哪些?分别占几个字节?
byte 字节型 1个字节(8位二进制) -128 到 127
short 短整型 2个字节(16位二进制) -2^15 到 2^15-1
int 整型 4个字节(32位二进制) -2^31到 2^31-1
char 字符型 2个字节
boolean 布尔型 1个字节(c/java)
float 单精度浮点型 4个字节,精度约7位 -3.403E38 ~ 3.403E38
double 双精度浮点型 8个字节,精度约为17位 -1.798E308 ~ 1.798E308

什么是自动类型转换?
自动类型转换(隐式类型转换)满足两个条件:
①两种类型彼此兼容
②目标类型的取值范围要大于源类型

什么是强制类型转换?
强制类型转换(显式类型转换)当两种类型彼此不兼容,
或目标类型取值范围小于源类型

if语句(单一条件)语法格式?
if (表达式) {
执行语句块;
}
if语句(二选一) 语法格式?
if(条件表达式){
功能代码块1
}else{
功能代码块2
}
if语句(多选一) 语法格式?
if(条件表达式1){
功能代码块1;
}else if(条件表达式2){
功能代码块2;
}else if(条件表达式3){
功能代码块3;
… …
}else{
功能代码块n;
}

switch语句 语法格式?
switch(表达式){
case 取值1:
语句块1;
[break;]
case 取值2:
语句块2;
[break;]

case 取值n:
语句块n;
[break;]
default:
语句块n+1;
}
switch后的表达式可以是什么类型?
1.表达式的类型只能为byte、short、char、int,在JDK7中增加了对String类型的支持;
2.case语句是标号语句,只确定程序的入口;
3.值1、值2…值n只能为常数或常量,不能为变量,而且值不能重复;
4.功能代码部分可以写任意多句;
5.break关键字结束switch语句,为可选项;
6.default语句功能类似于if-else语句中的else。
while循环的语法格式?
while(循环条件){
循环体;
}
for循环的语法格式?
for(表达式1;表达式2;表达式3){
循环体;
}
描述下for循环的执行顺序
初始化:在循环开始之前,首先执行循环变量(如 i、j 等)的初始化操作。
条件判断:判断循环条件是否满足。循环条件通常是一个布尔表达式,如变量大于等于 0 且小于 100。如果条件为真(满足),则执行循环体;如果条件为假(不满足),则结束循环。
循环体执行:当循环条件为真时,执行循环体中的代码。循环体可以是单个语句,也可以是复合语句,如一个复合语句,包括多个语句,用大括号括起来。
迭代:在循环体执行完毕后,回到条件判断阶段。此时,循环变量会自增(或自减,具体取决于循环语句中的操作)。然后再次进行条件判断。
循环结束:当循环条件为假时,循环结束。此时,程序将继续执行后续的代码。
写出两种死循环
(1)for(int x=1;;x++){
System.out.println(“x=”+x);
}
(2)while(true){
System.out.println(“x=”+x);
}

break的作用是什么?
break语句用于终止某个语句块的执行。用在循环语句体中,可以强行退出循环。
continue的作用是什么?
只跳出一次循环,整个语句还继续执行
双层for循环中内外循环分别控制什么?
外层循环(外层 for 循环):
外层循环主要负责控制整体循环的次数,每次外层循环执行一次,内层循环就会完整地执行一遍。外层循环的执行次数决定了整个双层循环结构的执行次数。
内层循环(内层 for 循环):
内层循环主要负责具体的任务执行。它通常用于处理与外层循环相关的子任务。内层循环的执行次数通常会受到外层循环变量的影响,即每次外层循环执行时,内层循环的执行次数可能会发生变化。
什么是数组?
数组是多个相同类型的数据按照顺序组合后的一种数据类型,用来实现对这些数据的统一管理。
数组的特点?

数组声明的语法:
a.用静态初始化方式声明一个int类型数组
这种方式在数组声明的同时就直接创建数组
语法:数组类型[] 数组名 = {数组元素1,数组元素2,…数组元素n}
如:
int[ ] m = {3,75,234,41,16};
b.用动态初始化方式声明一个int类型数组
这种创建方式的语法是:
数组类型[] 数组名 = new 数组类型[数组长度];
如:
int[ ] cs = new int[128];
c.用动静结合的方式声明一个int类型数组
int[] arr = new int[]{1, 2, 3, 4, 5};

简述数组默认值?
数组元素有默认值,对于数字类型,默认值为0,对于字符型,默认值为‘\u0000’,对于布尔类型,默认值为false, 对于字符串类型(引用类型),默认值为null。
数组长度如何获取?
数组是引用类型,具有属性。数组的length【长度】属性比较常用,数组的长度指的是数组中的包括未初始化元素在内的元素的总数。在使用时需注意:
1.数组创建后其长度就不能更改
2.数组的长度(length)必须>=0
3.length为只读,无法改变,所有对length属性的赋值操作都是非法的
数组下标最大值与数组长度的关系?
数组下标最大值+1=数组长度
数组产生ArrayIndexOutOfBoundsException异常的原因是什么?
访问数组时的下标超出数组的最大下标时
什么是多维数组?
多维数组(Multidimensional array)是一种扩展了单维数组概念的数据结构,它具有多个维度。多维数组可以用来表示更复杂的数据关系,如矩阵、图像等。
定义一个3行4列的多维数组arr
int[][] arr=new int[3][4];

什么是方法?
方法是程序设计语言中重要的组成部分,可以说程序的功能都是通过方法和方法间的调用来实现的。方法的作用是用来描述功能和行为动作。

方法定义的语法?
[访问控制符] [修饰符] 返回值类型 方法名( 参数类型 形式参数,参数类型 形式参数,…)
// [访问控制符] [修饰符] 涉及到后面章节知识,暂时忽略,不必考虑
{
方法体
}

什么是方法重载?
在同一个类中,允许同时存在多个方法名相同但参数列表不同的方法,这种现象叫方法的重载。

方法引用传递和值传递的区别?
值传递:就是在方法调用的时候,实参是将自己的一份拷贝赋给形参,在方法内,对该参数值的修改不影响原来的实参。
引用传递: 当数据作为自定义对象的引用在进行传递时,整个对象不会进行拷贝,直接由形参所接受,如果有方法修改了这个对象,对象就会发生变化。
与值传递相比,引用传递的最大特征是:在引用数据类型作为方法参数的时候,形参的任何改变会影响实参的结果

什么是类?
具有共同特征(组成部分和功能)的事物的集合 ----- 抽象
什么是对象?
类的具体化 ----------- 具体
什么是面向对象?
面向对象(Object-Oriented,简称 OO)是一种编程范式,它强调将现实世界中的事物抽象成具有属性和方法的对象。面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程方法,它遵循面向对象的原则,通过组合、继承和多态等机制来实现程序的模块化、易于维护和复用。

简述构造方法的特点?

  1. 方法名与类相同
  2. 不含返回值类型声明,void也不允许存在,否则退化为一般方法
  3. 不能在方法中用return语句返回一个值
  4. 默认情况下,将所有的属性的值初始化为0
  5. 如果程序员在开发过程中未提供任何构造器,那么系统将提供一个默认的无参构造器。
  6. 一般访问权限为public
    this关键字有什么作用?
    his关键字: this关键字代表对象自身的引用,它是一个引用,指向调用该方法的当前对象,通常在类的方法定义中使用
    this():代表调用其他构造方法,但是不能形成调用的闭环,而且需要写在方法体中的第一行

匿名对象的作用?
使用匿名对象的情况,如果对一个对象只需要进行一次方法调用,Java的垃圾回收机制是自动的,它保证程序健壮的主要手段,同时也避免了回收内存带来的代码繁琐。

static关键字的作用?
用static修饰的成员变量会提升为类层级,在内存中只有一份(静态成员变量);
用static修饰的方法,提升为类层级;
static修饰的方法不能包含非static修饰的变量;
static修饰的方法不能包含非static修饰的方法。

什么是封装性?
使用访问权限修饰符对类的成员进行控制。

单例模式是什么?
单例模式(singleton)是保证一个类仅有一个实例,并提供一个访问它的全局访问点.
必会代码 统计生成对象个数
class Student{
int id;
String name;
static int count=0;

public Student(String name,int id) {
	this.name = name;
	this.id = id;
	count++;
}

}

public class Work2 {

public static void main(String[] args) {
	Student stu = new Student("lisi",1);
	Student stu1 = new Student("zhangsani",2);
	Student stu2 = new Student("wangwu",4);
	Student stu3  = new Student("zhaoliu",3);
	
	System.out.println(Student.count);
}

}
单例模式
//单例:无论实例化多少次,只得到一个实例化对象
class A {
String name;
private static A a = new A();

private A() {
	System.out.println("实例化了");
}

public static A getA() {

// System.out.println(“得到”);
return a;
}
}
public class Work1 {

public static void main(String[] args) {
	A a1 = A.getA();
	A a2 = A.getA();
	A a3 = A.getA();
	
	System.out.println(a1==a2);
	System.out.println(a1==a3);
	System.out.println(a3==a2);

}

}
继承的作用?
代码重用:继承允许子类继承父类的属性和方法,从而实现代码的重用。这有助于提高开发效率,减少重复劳动。
层次结构:继承允许创建分等级层次的类,清晰地展现相关类之间的层次结构关系。这有助于更好地组织和管理代码,提高代码的可读性。
扩展性:继承为子类提供了扩展父类功能的可能性。子类可以根据需要继承父类的属性和方法,同时还可以添加自己独特的属性和方法,实现对父类的扩展。
聚合关系:继承有助于实现类与类之间的聚合关系。例如,在一个动物类中,兔子类和羊类可以继承食草动物类,狮子类和豹类可以继承食肉动物类。这有助于更好地描述现实世界中的对象关系。
提高代码的可维护性:通过继承,可以将公共功能提取到父类中,使得子类只需关注自己的独特功能。这有助于提高代码的可维护性,减少因修改子类导致的意外变动。

子类实例化过程?
子类实例化时先实例化其父类,然后实例化子类。要先调用父类的构造方法,父类构造方法运行完毕,才调用子类的构造方法。

super和this的区别?
super:关键字super的作用是指向父类的引用。
this:关键字this的作用是指向本类的引用。

什么是方法的覆盖?
子类将从父类中继承下来的方法重新实现,叫做覆盖(Overriding)或重写(rewrite)。

父子类中有同名变量,对同名变量的访问顺序是什么?
当父子类中出现同名变量时,子类会覆盖父类的同名变量,但是父类的同名变量并没有被删除,只是被隐藏了。在子类中访问同名变量时,如果使用了this关键字,则访问的是子类的同名变量;如果使用了super关键字,则访问的是父类的同名变量。如果没有使用关键字,则默认访问的是子类的同名变量
在访问同名变量时,Java 会优先遵循类继承结构和访问权限来确定正确的访问顺序。

接口跟抽象类的区别?
1、实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
2、构造函数:抽象类可以有构造函数;接口不能有。
3、实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
4、访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
5、变量:接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
6、级别:抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高

final关键字的作用?
1.final修饰类:使用final修饰的类不能被继承。
2.final修饰变量:使用final修饰的变量(属性和局部变量)不能被重新赋值,在声明时赋值,或在构造方法中赋值,系统不会对final属性默认的赋初始值。
3.final修饰方法:使用final修饰的方法不能在子类中被覆盖,即不能修改。

什么是多态?
多态是Java的重要特征之一,方法的覆盖、重载与动态绑定构成了多态性。
多态是具有表现多种形态的能力的特征,是同一个实现接口,使用不同的实例而执行相同操作,不同的对象对同一行为作出的不同响应。
满足多态的必要条件?
● 要有继承,或实现
● 要有重写
● 父类引用指向子类对象

instanceof 运算符的作用是什么?
instanceof 运算符用来判断一个类是否实现了某个接口和一个实例对象是否属于一个类,返回值类型都是布尔类型,
异常分类是什么?
异常按照处理方式可以分为哪两种类型
a.检查性异常(checked exception)
b.非检查性异常(unchecked exception)
最大的异常类是什么?
Exception

throw和throws的区别?
throw 抛出异常
throws 声明异常

finally子句的作用?
finally语句中的代码块不管异常是否被捕获总是要执行。

常见的异常类有哪些?
RuntimeException java.lang包中多数异常的基类
ArithmeticException 算术错误
illegalArgumentException 方法收到非法参数
ArraylndexOutOfBoundsException 数组下标出界
ClassNotFoundException 无法找到想要创建对象的类文件
IOException I/O异常的根类
FileNotFoundException 不能找到文件
EOFException 文件结束
illegalAccessException 对类的访问被拒绝
NoSuchMethodException 请求的方法不存在
InterruptedException 线程中断
NullPointerException 试图访问null对象引用

必会代码:异常处理try……catch
try{
// 我们把可能会出现异常的语句放在这里。
// 在异常发生时,会由catch块捕获到相应的异常实例。
}catch(XXXException e){
// e就是捕获到的异常实例,它由系统自动创建,里面包含了异常的信息。
// XXXException就是Exception异常的任意子类。
//我们在这里可以对出现异常的情况进行处理,比如输出错误信息。
}finally{
// 最终块,可选,一般用于资源的回收
}

自定义异常
public class Example_Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Exception ex = new Exception(); //创建Exception异常对象
try {
throw ex; //抛出异常对象
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

接口定义语法
public interface IBaseGraphics {
public double computeCircumference(); // 计算周长
public double computeSquare(); // 计算面积
public void printData(); // 输出数据
}

抽象类定义语法
public abstract class Animal {
private String name; // 私有属性

public Animal(String name) {  
    this.name = name;  
}

public abstract void sound(); // 抽象方法,子类需要实现

public void eat() {  
    System.out.println(name + " is eating.");  
}  

}

写出Collection接口下的继承关系
(1) 子接口Set:无序的集合,不允许重复。
Set接口的实现类:HashSet 
(2) 子接口List:有序的集合,允许重复。
List接口的实现类:ArrayList、LinkedList

泛型的作用
泛型(Generics)是自JDK5.0开始引入的一种Java语言新特性,其实质是将原本确定不变的数据类型参数化,作为对原有Java类型体系的扩充,使用泛型可以提高Java应用程序的类型安全、可维护性和可靠性。

集合的特点
ArrayList集合的特点
有序有重复,ArrayList 使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者 删除元素时需要设计到位移操作 ,所以比较慢。
LinkedList集合的特点
LinkedList 使用双向链接方式存储数据,每个元素都记录前后元素的指针, 所以插入、删除数据时只是更改前 后元素的指针指向即可,速度非常快,然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元 素或 后几个元素速度比较快

Iterator在删除元素的时候要注意什么异常
ConcurrentModificationException 当采用Iterator遍历集合时,如果此时集合中的元素被改变则Iterator遍历抛出此异常。

反向遍历List集合用什么迭代器
ListIterator

ArrayList四种遍历方式
list集合遍历的方式
public static void main(String[] args) {
// 集合的遍历
ArrayList strList = new ArrayList();
strList.add(“深海中 那点光 昏暗的诱惑”);
strList.add(“她以为 抓得住 名为爱的泡沫”);
strList.add(“人心 扑朔 晦涩 幽蓝如墨”);
strList.add(“怎么 猜透 看透 故事的结果”);

	//普通for循环
	for (int i = 0; i < strList.size(); i++) {
		System.out.println(strList.get(i));
	}
	System.out.println("-------------------");
	//增强for循环
	for(String str : strList) {
		System.out.println(str);
	}
	System.out.println("-------------------");

	//迭代器
	Iterator<String> it = strList.iterator();
	while (it.hasNext()) {
		String string = (String) it.next();
		System.out.println(string);
	}
	System.out.println("-------------------");

	//双向遍历
	ListIterator<String> list = strList.listIterator();
	
	while (list.hasNext()) {
		String string = (String) list.next();
		
	}
	while (list.hasPrevious()) {
		String string = (String) list.previous();
		System.out.println(string);
	}
	
}

所有类的父类是什么?
Object

写出8种基本数据类型对应的包装类
boolean Boolean
byte Byte
char Character
double Double
float Float
int Integer
long Long
short Short

简述Object中的equals方法和String类中的equals方法的作用
Object类中的equals方法作用:比较两个引用所指向的对象是否是同一个对象,即两个引用所指向对象的地址是否相等。
String 类中的 equals() 方法:判断两个字符串对象的内容是否相等。

简述Object中的hashCode方法的作用
Object 类中的 hashCode() 方法的作用是返回一个哈希值,用于在哈希表(如 HashMap、HashSet 等)中存储和查找对象。哈希值是根据对象的特征生成的,相同对象的哈希值相同,不同对象的哈希值一般不同。这样可以提高程序在哈希表中查找对象的效率。

int类型转换为Integer类型用什么方法?
int a = 20;
//方法一
Integer b = Integer.valueOf(a);
//方法二
Integer c = a;
Integer类型的对象转换为int类型用什么方法?
Integer a = 10;
//方法一
int b = a.intValue();
//方法二
int c = a;
parseInt方法有什么作用?
将数字字符串转换为int数值。
将int类型转换为对应的String类型用什么方法?
(1)
int intValue = 123;
String stringValue = Integer.toString(intValue);
(2)
int intValue = 123;
String stringValue = String.valueOf(intValue);

什么是自动装箱操作?
将一个基本数据类型转换为对象。
Integer intObject=new Integer(2);等价于 Integer intObject=2; //自动装箱
什么是自动拆箱操作?
在进行基本数据类型和对应的包装类转换时,系统将自动进行。
//int类型会自动转换为Integer类型
int m = 12;
Integer in = m;

解释什么是String 对象的不可变性?
任何一个String对象在创建之后都不能对它的内容作出任何改变。对于连接、获得子串和改变大小写等操作,如果返回值同原字符串不同,实际上是产生了一个新的String对象,在程序的任何地方,相同的字符串字面常量都是同一个对象。

String类中的compareTo方法作用?
int compareTo(s1:String) 返回一个大于0、等于0或者小于0的整数以表明这个字符串是大于、等于还是小于s1

String类中的toCharArray方法作用?
将字符串转换成一个字符数组

String类中的charAt方法作用?
返回指定索引处的 char 值

String类中的substring(int i)方法作用?
String substring(int begin) 返回一个新字符串,该字符串是从begin开始的字符串的内容
String substring(int begin,int end) 返回一个新字符串,该字符串是从begin开始到end-1结束的字符串的内容

怎样获取字符串的长度?
int length() 返回此字符串的长度

怎样获取数组的长度?
int[] sort = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int high = sort.length ;

/Calender类如何进行实例化?
//获取Calendar类的实例
Calendar c = Calendar.getInstance();

Calendar类型的对象如何转换为Date对象?
Calendar calendar = Calendar.getInstance(); // 获取当前系统的 Calendar 对象
Date date = calendar.getTime(); // 将 Calendar 对象转换为 Date 对象

Date类型的对象如何转换为Calendar对象?
import java.util.Calendar;

// 创建一个 Date 对象
Date date = new Date();

// 将 Date 对象转换为 Calendar 对象
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

如何生成0-1之间的小数?
double n = Math.random();

set集合特点?
Set接口是Collection接口的子接口,表示集合,对实现该接口的对象有个要求,就是集合中的元素不允许重复, 该接口与Collection接口基本一致,方法与Collection完全相同。

<? extends Number> 这种泛型写法?代表什么类型? <? extends Number> 描述了通配符上界, 即具体的泛型参数需要满足条件: 泛型参数必须是 Number 类型或它的子类 <? super String>这种泛型写法?代表什么类型? <? super String> 描述了通配符下界, 即具体的泛型参数需要满足条件: 泛型参数必须是String 类型或它的父类。 比较两个对象顺序大小的实现方式有哪些? a.compareTo方法是Java中的一个接口Comparable定义的方法,它用于比较当前对象与另一个对象的大小关系 。compareTo方法返回一个整数值,表示当前对象与参数对象的大小关系。如果返回值为负数,则表示当前对象小于参 数对象;如果返回值为正数,则表示当前对象大于参数对象;如果返回值为零,则表示当前对象等于参数对象。 b.compare方法是Java中的一个接口Comparator定义的方法,它用于比较两个对象的大小关系。compare方法 接受两个参数,分别是要比较的两个对象,返回一个整数值表示它们的大小关系。与compareTo方法不同的是,compare 方法不依赖于对象自身的实现,而是通过一个独立的比较器对象来进行比较。 c.equals 遍历set集合方式 方式1:得到迭代器对象 Iterator i = set1.iterator(); while(i.hasNext()){ String temp = (String)i.next(); System.out.println(temp); } 方式2:转换成数组 Object o[] = hs.toArray(); for(int i=0;i < o.length;i++){ System.out.println((String)o[i]); } Map集合特点? 有序性:Map 集合中的元素是有序的,这是因为 Map 集合底层依赖的是数组或链表等有序数据结构。 键值对:Map 集合的元素由键(key)和值(value)组成,每个元素都包含一个唯一的键和一个对应的价值。 键值唯一:Map 集合中的键是唯一的,不允许重复;而值可以重复,但一个键最多只能映射到一个值。 数据类型:键和值的数据类型可以相同,也可以不同。键和值可以是任意类型的对象,只要能实现 Map 接口即可。 访问速度:根据不同的实现方式,Map 集合的访问速度有所不同。例如,TreeMap 基于红黑树实现,查找、插入和删除操作的时间复杂度为 O(log n),而 HashMap 基于哈希表实现,平均查找、插入和删除操作的时间复杂度为 O(1)。 遍历方式:Map 集合可以使用 for-each 循环、keySet() 方法、entrySet() 方法等方式进行遍历。 集合操作:Map 集合支持常见的集合操作,如添加、删除、修改、查询等。 遍历Map集合的方式有哪些 在 Java 中,遍历 Map 集合的方式有以下几种: 1. 使用 entrySet() 和 for-each 循环: ```java Map
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值