Java高频面试题三

Java高频面试题三

一、内连接和外连接的区别?join和union的区别?

内连接:

两张表都符合连接,都进行保留数据。

外连接:

左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。

右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。

join

通过两张表的条件 相同的数据合成一个记录集。

union

是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 。

二、【SQL语句】分页怎么查?每页十条,第41条数据怎么查(可灵活变换问法)?

select * from 表名 limit (查第几条数据 - 1,每页显示几条数据);

分页sql格式是:select * from table limit (start - 1)*limit,limit; 其中start是页码,limit是每页显示的条数。
eg:

查询第1条到第10条的数据的sql是:select * from table limit 0,10; 
	->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,20;
	->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,30; 
	->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

三、【SQL语句】去重的SQL语句怎么写?

distinct 只能在SELECT 语句中使用,对后面所有的字段的值统一进行去重。
	单例
	select distinct 重复值 from A    //对A表的重复值去重然后显示
	多列
	select distinct 重复值1,重复值2 from A   //对A表的重复值1和重复值2去重然后显示

group by
select 字段 from 表名 group by 字段

row_number() over()
select row_number() over(函数 字段) from 表名

四、【数据库优化】数据库的优化方案?一个SQL语句如何让他搜索变快?你们遇到的数据量最大的表是什么样,有多少条数据。

  1. 字段优化
  2. 索引优化

索引优化可以使搜索变快

遇到最大的表是 Sass框架 他是saber一个线上的框架 里面有数据内容 里面对每一个框架都做了分类,对重复的字段做了字典 方便重复使用等等

五、【数据库优化】数据库的索引?如何避免索引失效?mysql索引有哪些,都各自有什么作用?什么是联合索引?什么样的字段适合创建索引?怎么创建一个索引?

数据库通过索引快速进行查找特定的数据信息

索引在创建表的时候就相当于给字段进行了排序不存在索引失效就是单纯的没有进行使用


> 主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键。
> 唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。 
> 普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值。
> 全文索引:是目前搜索引擎使用的一种关键技术。

一个表上有两个或更多索引被称作联合索引

两表联查外键必须有索引
使用最多的要加索引
小字段可以加索引,文本等内容多不加索引

create index 索引名 on 表名(字段名)
索引名一般是 表名_字段名

六、【数据库优化】慢日志怎么使用?MYSQL怎么发现动作速度慢的SQL语句?

配置文件中添加 slow_query_log = 1

show variables like '%query%'

七、【数据库优化】分库分表是怎么做的?数据库分表分库后怎么保证其一致性?

当数据量大的时候将重复的值取出,创建一个新的数据结构

分布式事务主要目的是解决数据一致性问题,XA强一致,但是吞吐量太低,不利于高并发场景。
柔性事务不保证强一致性,但是通过补偿实现最终一致性,常见的补偿有重试补偿、调度补偿、人工补偿等。

八、【事务】数据库事务是什么?讲一讲脏读和幻读?

数据库事务就是处理量大的数据的方式,比如一个用户他有很多事务,比如文章 邮件 基本资料等等

脏读 读取未提交数据
幻读 前后多次读取,数据总量不一致

九、【事务】innoDb事务隔离级别有哪些?MySQL表为何产生死锁?如何避免死锁?


读未提交(READ UNCOMMITTED)
读提交(READ COMMITTED)
可重复读(REPEATABLE READ)
串行化(SERIALIZABLE

当两个资源都在进行释放锁的时候 有可能出现循环不一致出现死锁

不满足死锁发生条件,就不会出现死锁,出现后通过挂起不必要的进程和方法来解决死锁让其从死锁状态解除

十、【事务】事务的七种传播方式?事务的四大特性?

(rui kuai er de)
REQUIRED(必需的)		   有事务就加入 没有就创建

(si pa si)
SUPPOPTS(支持的)		   有事务就加入 没有事务就不创建

(man de te rui)
MANDATORY(强制的)		   有事务就加入 没有事务抛出异常

(rui kuai er s) New
REQUIRES_NEW(要求 NEW) 	   创建事务 有事务挂起

Not	 (si po dei)
NOT_SUPPORTED(不 支持的)  如果有事务就把事务挂起 以非事务的方式运行

(nai wer)
NEVER(从不的)		       没有事务 有事务抛出异常

(nai si de)
NESTED(嵌套的)		       有事务就嵌套事务 没有就创建

  1. 原子性:要么全部完成,要么全部不完成,要是失败就会回滚到没有执行的状态
  2. 一致性:从事物开始到结束数据没有造成破坏。
  3. 隔离性:一个时间段内有两个相同的事物进行相同的功能就会造成事务的混淆所以使用串行化和序列化可以解决在一个时间段只执行一个事务
  4. 持久性:事务完成后数据不会丢失 也不会被回滚 会永远的进行保留。

十一、oracle与mysql的区别?mysql分页和oracle分页的区别?

oracle与mysql的区别


1、Oracle 是大型数据库,而MySQL是中小型数据库。但是MySQL是开源的,Oracle是收费的
2、Oracle 的内存占有量非常大,而mysql非常小
3、MySQL 支持主键自增长,插入时会自动增长。Oracle主键一般使用序列。
4、MySQL分页用limit关键字,而Oracle使用rownum字段表明位置
5、MySQL中01判断真假,Oracle中true false
6、MySQL中命令默认commit,但是Oracle需要手动提交
7、MySQL在windows环境下大小写不敏感,在linux环境下区分大小写,Oracle不区分

详情跳转:http://t.csdn.cn/jQCzG

mysql分页和oracle分页的区别

mysql 分页使用 limit,oracle 分页得借助 rownum 关键字

十二、表、视图的区别;存储过程、函数的区别

表和视图的区别

  1. 数据都是存储在表里面的,而不是视图
  2. 表是创建好的,真实存在的,而视图只是一段已经编译好的sql语句
  3. 视图只是窗口,而表则是里面的数据
  4. 表占有真实的物理空间,而视图只是一个逻辑概念,就像钱是表,爱情是视图
  5. 表可以增删改查,视图只能查
  6. 视图的创建和删除不影响表

存储过程、函数的区别

  1. 标识符不同
    存储过程procedure;函数function
  2. 函数中有返回值,且必须返回
    过程没有返回值
  3. 存储过程通过call来调用 函数会使用select来调用
  4. 通过in out参数 存储过程比函数更加的灵活 可以返回多个结果

十三、解释 Oracle 数据库、数据文件、表空间

Oracle数据库:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。

数据文件:每一个 Oracle 数据库有一个或多个物理的数据文件(data file)。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。

表空间:表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表,所以称作表空间。

十四、MySQL 引擎有哪些?有什么区别


(my shamu)			    (mai mo rui) (啊 kai v)
MyISAM存储引擎、innoDB存储引擎、MEMORY存储引擎、ARCHIVE存储引擎

(mai sha mu)
MyISAM:插入数据快,空间和内存使用比较低。
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。
(mai mo rui)
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
(a kai si)
Archive:非常适合存储归档数据,如记录日志信息可以使用Archive

十五、如何方式SQL注入?原生JDBC如何防止SQL注入?


1.避免使用动态SQL
2.不要将敏感数据保留在纯文本中
3.限制数据库权限和特权
4.避免直接向用户显示数据库错误

(pei pai sai lai men ta)
通过 PreparedStatement 来防止SQL注入

十六、你写过的最复杂的SQL语句是什么?关联了几张表?

关于用户的比如用户表、单位表、资料表等等
关联了5张表

十七、数据库设计你参与的情况怎么样?介绍一下设计的过程

我个人人为好的数据库结构可以给系统和公司带来更高效的运行环境,方便同事之间更好的沟通数据的情况, 方便了解数据的缺少 对于用户来说可以使用户更快捷找到自己所需要的内容,满足用户的需求。

设计过程:

  1. 分析需求
  2. 设计数据库模型
  3. 创建数据库
  4. 定义表和表之间的连接
  5. 维护数据库

十八、创建线程的几种方式?

  1. 继承Thread类创建线程

  2. 实现Runnable接口创建线程

  3. 使用CallableFuture创建线程

  4. 使用线程池例如用Executor框架

十九、线程生命周期

  1. 初始化状态(NEW)
  2. 可运行/运行状态(RUNNABLE)
  3. 阻塞状态(BLOCKED)
  4. 无时限等待状态(WAITING)
  5. 有时限等待状态(TIMED_WAITING)
  6. 终止状态(TERMINATED)

二十、多线程的使用场景

当堆积很多事物的时候,一个线程往往需要实现的也就越多,这个时候就需要使用多线程来解决问题。

二十一、Sleep()和wait()区别?Start()和run()区别?wait,sleep,notify的区别?

  • sleep 是多线程 可以进行睡眠指定时间 时间到了线程会再次运行 不释放锁
  • wait 是object的方法 线程之间的交互和通信 必须通过notify或notifyAll来进行唤醒 释放锁
  • Start 是启动一个线程,并没有运行,需要通过多线程的类进行调用方法run才可以结束
  • run 一个普通的方法,启动一个线程,按顺序完成 在执行下面的代码
  • sleep():是Thread类中的方法,可以设置具体的休眠时间,时间到了自动唤醒,线程不会释放对象锁。
  • wait():是Object类中的方法,调用后线程会进入等待池,线程会释放对象锁
  • notify():使用notify()方法之后,线程被唤醒,线程会进入对象锁定池准备。

二十二、【线程安全】线程锁有几种方式?使用的关键字?

                (wo le tou)
lock synchronized volatile

二十三、【线程安全】什么是乐观锁和悲观锁?

悲观锁:
因为它觉得如果不锁住这个资源,别的线程就会来争抢,造成数据结果错误,所以悲观锁为了确保结果的正确性,会在每次获取并修改数据时,都把数据锁住,让其他线程无法访问该数据,这样就可以确保数据内容万无一失

乐观锁:
比较乐观。相比于悲观锁,它是不锁住资源的,因为它觉得自己在操作资源时并不会有其他线程干扰。
因此,为了保障数据的正确性。它在操作之前,会先判断在自己操作期间,其他线程是否有操作。如果没有,直接操作;如果有,则根据业务选择报错或者重试

二十四、【线程安全】synchronized和lock的区别。synchronized关键字修饰方法和修饰代码块的区别?

  1. synchronized是在jvm存在的而Lock是一个类
  2. synchronized同步结束和异常会释放锁Lock必须通过finally来释放
  3. synchronized阻塞会一直等待 Lock分情况 看调用方法
  4. synchronized不可查看其信息 Lock可以查看信息

主要是锁不同:

  • 修饰方法时,对于静态方法,是把 class 作为锁;对于非静态方法,是把 this 对象当做锁;
  • 修饰代码块时,是把任何对象作为锁,如果锁对象为空,会抛出 NullPointerException,但是修饰方法不会;

二十五、【线程安全】如何保证单例模式在多线程中的线程安全性

  1. 使用static代码块实现单例模式
  2. 序列化与反序列化的单例模式
  3. 使用静态内置类实现单例模式
  4. 使用DCL双检查锁机制
  5. 延迟加载中使用同步代码块,对类加锁
  6. 延迟加载中使用synchronized修饰方法
  7. 延迟加载(懒汉模式)
  8. 立即加载(饿汉模式)

二十六、讲讲你对线程池的理解?如何使用线程池?

将重复的代码进行重复利用提高性能

(X q tu service)
ExecutorService

二十七、【高并发】项目中有没有用到高并发?你是怎么理解的?

有用到高并发

在代码量使用较低的情况下使用单线程是最好的;在代码量数据较大的情况下使用多线程可以快速的解决问题

二十八、【高并发】和消息队列怎么结合应用的?

结合异步处理、应用解耦、流量削锋、消息通讯这个四个来判断是否需要添加消息队列

二十九、【高并发】同时有一万请求发往服务器怎么处理?

  1. 最快的方法就是增加服务器 增加网络带宽 等
  2. 通过消息队列和中间件减少服务器压力

三十、Git是如何使用的?源代码管理是怎么做的?git命令有哪些?

在Window是通过下载.exe文件安装使用
在Liunx和mac上使用命令下载安装使用

添加git仓库比如gitee或github来进行管理

git clone 拉去代码
git init初始化
git commit 注解
git push 提交

三十一、Linux如何查看日志?如何排查线上项目的问题?

最常用查看日志方法:

  • 实时日志:tail -f XXX.log
  • 搜索关键字附近日志:cat -n filename | grep “关键字”

查看日志是否出现错误等情况

三十二、Maven包是如何管理的?Maven的打包命令是什么?

Maven 是通过中央仓库或者阿里仓库将工具包和注解等信息下载到本地

  1. mvn clean
    打包前清理掉之前有过打包的文件夹target
  2. mvn compile
    项目编译
  3. mvn pakage 打包
    动态web工程打war包,Java工程打jar 包。
  4. mvn install
    将项目生成jar包放在仓库中,然后打包。
  1. mvn clean install :清理原有编译文件,新打jar包
  2. mvn clean pakage :清理原有编译文件,web工程动态打war包,Java工程动态打jar 包;
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值