栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

笔试 Day1

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

笔试 Day1

  1. 什么是面向对象?面向对象有什么特性?
面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为,面向对象是相对于面向过程来讲的,指的是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
面向对象具有三个特性:封装、继承和多态。
  1. 什么是接口?什么是抽象类?接口和抽象类有什么异同?分别用于什么场景?
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。

相同点:
1、不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

不同点:
1、默认的方法实现抽象类可以有默认的方法实现;接口,Java8规定可以为接口提供默认实现的方法并且不用强。
2、实现制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;
接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。 
3、构造器抽象类可以有构造器,接口不能有构造器。
4、多继承抽象类可以继承一个类和实现多个接口;接口只可以继承一个或多个接口。
5、速度抽象类比接口速度快;接口是稍微有点慢,因为它需要花时间去寻找在类中的实现方法。

应用场景:
面对对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用。
1、抽象类适合用来定义某个领域的固有属性,也就是本质,接口适合用来定义某个领域的扩展功能。
2、当需要为一些类提供公共的实现代码时,应优先考虑抽象类。因为抽象类中的非抽象方法可以被子类继承下来,使实现功能的代码更简单。
3、当注重代码的扩展性跟可维护性时,应当优先采用接口。①接口与实现它的类之间可以不存在任何层次关系,接口可以实现毫不相关类的相同行为,比抽象类的使用更加方便灵活;②接口只关心对象之间的交互的方法,而不关心对象所对应的具体类。接口是程序之间的一个协议,比抽象类的使用更安全、清晰。一般使用接口的情况更多。
4、抽象类需要被继承,接口是需要被实现。
  1. 什么是线程?简单描述一下线程的生命周期。什么是线程安全?一般如何实现线程安全?
线程就是进程中的一个独立的控制单元
新建、就绪、运行、阻塞和死亡五种状态。当线程启动以后,它不能一直“霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。

线程安全问题:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完。另一个线程参与进来执行,导致共享数据的错误。

解决方案:
1.同步代码块
syschronized(对象)
{
需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行。
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。
2.synchronized关键字,就是用来控制线程同步的,保证我们的线程在多线程环境下,不被多个线程同时执行,确保我们数据的完整性,使用方法一般是加在方法上。

3、Lock
Lock是在Java1.6被引入进来的,Lock的引入让锁有了可操作性,什么意思?就是我们在需要的时候去手动的获取锁和释放锁,甚至我们还可以中断获取以及超时获取的同步特性,但是从使用上说Lock明显没有synchronized使用起来方便快捷。
  1. 什么是死锁?死锁产生的原因是什么?如何避免死锁?
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

死锁产生的原因

1.竞争不可抢占性资源
2.竞争可消耗资源引起死锁
3.进程推进顺序不当

如何避免死锁

破坏死锁产生的四个必要条件之一即可

资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
  1. 什么是值传递?什么是引用传递?面向对象语言中,== 与equals 有什么区别?
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

引用传递:方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。


简单来说 : ==比较两个人是否究竟是真正同一个人,equals一般用来比较两个人在逻辑上是否相等
  1. 什么是数据库事务?数据库事务有什么特性?数据库事务在代码中如何开发使用,请提供代码示例?什么是非关系型数据库?非关系型数据库一般用于什么场景?
 一个事务是一个完整的业务逻辑单元,不可再分。
 
 事务包括四大特性:ACID
 A:原子性:事务是最小的工作单元,不可再分。
 C:一致性:事务必须保证多条DML同时成功或者同时失败。
 I:隔离性:事务A与事物B之间具有隔离
 D:持久性:持久性说的是最终数据必须持久化到硬盘文件中。

代码案例:https://gitee.com/chef_git/interview/blob/master/src/main/java/com/liudachu/interview/SQL/transactionTest.java

非关系型数据库:顾名思义各个数据之间不存在关联是非关系型数据库。

应用场景:用户的个人信息,社交网络,地理位置。用户自己产生的数据,用户日志等等爆发式增长!使用NoSQL数据库可以很好的处理以上的情况!

  1. 数据库索引有哪些类型?请结合一种数据库进行详细说明。Sql调优一般有什么原则?
 单一索引:给单个字段添加索引
 复合索引:给多个字段联合起来添加1个索引
 主键索引:主键上会自动添加索引
 唯一索引:有unique约束的字段上会自动添加索引。

以mysql为例演示创建索引调优
mysql> explain select ename,sal from emp where ename='smith';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

mysql> create index emp_sal_index on emp(sal);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>  explain select ename,sal from emp where sal='800';
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra                 |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-----------------------+
|  1 | SIMPLE      | emp   | NULL       | ref  | emp_sal_index | emp_sal_index | 5       | const |    1 |   100.00 | Using index condition |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-----------------------+
1 row in set, 1 warning (0.01 sec)


sql调优相关原则
1.EXPLAIN,做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。
2、SQL语句中IN包含的值不应过多
3、SELECT语句务必指明字段名称
4、当只需要一条数据的时候,使用limit 1
5、如果排序字段没有用到索引,就尽量少排序
6、如果限制条件中其他字段没有索引,尽量少用or
7、尽量用union all代替union
8、不使用ORDER BY RAND()
9、区分in和exists、not in和not exists
10、使用合理的分页方式以提高分页的效率
11、分段查询
12、避免在where子句中对字段进行null值判断
13、不建议使用%前缀模糊查询
14、避免在where子句中对字段进行表达式操作
15、避免隐式类型转换
16、对于联合索引来说,要遵守最左前缀法则
17、必要时可以使用force index来强制查询走某个索引
18、注意范围查询语句
19、关于JOIN优化
  1. 有一个业务场景,集团公司下存在多个子公司,每个子公司有多个银行账号,不同的业务类型使用不同的银行账号转账和收款,且银行账号可切换,请问表结构需要怎么设计?结合您的表设计,请写sql查询出业务类型A在在公司C下当前正在使用的银行账号。
CREATE TABLE `t_card` (
  `card_id` int(11) NOT NULL COMMENT '银行卡id',
  `corp_id` int(11) NOT NULL COMMENT '子公司id',
  `buss_id` int(11) NOT NULL COMMENT '业务类型id',
  `status` char(10) NOT NULL COMMENT '账户状态(0:当前正在使用 1:停用等)',
  PRIMARY KEY (`card_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


SQL语句:(业务类型A的id、和子公司id 分别在对应的业务表和公司表中)
select card_id from t_card where buss_id=业务类型A的id and corp_id=公司C的id and status=0
  1. 什么是垃圾回收?Java GC如何确定对象可以进行回收?什么是OOM? 一般情况下,什么原因会导致OOM?
垃圾回收-GC主要用于Java堆的管理。Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。

引用计数法:每个对象有一个引用计数属性,新增一个引用时计数器+1,引用释放时计算器 -1,计数为0时可以回收。
可达性分析:从GC Roots开始向下收索,搜索走过的路径成为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。

OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error

原因:
1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
2)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
  1. 什么是链表?什么是树?什么是图? 请编程实现二叉树的遍历。
1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。
2.树结构是一种非线性存储结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
3.图是由顶点和连接顶点的边构成的离散结构。

二叉树的遍历:
https://gitee.com/chef_git/interview/blob/master/src/main/java/com/liudachu/interview/Tree/TreeUtils.java
  1. 请编码实现至少3种排序算法,并提供对比,说明其时间复杂度与空间复杂度。

https://gitee.com/chef_git/interview/blob/master/src/main/java/com/liudachu/interview/Sort/SortUtils.java

 * 冒泡排序
 * 时间复杂度:O(n*n)
 * 空间复杂度:O(1)
 * 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
 * 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

 * 选择排序
 * 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
 * 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
 * 时间复杂度:O(n*n)
 * 空间复杂度:O(1)

 * 插入排序
 * 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
 * 时间复杂度:O(n*n)
 * 空间复杂度:O(1)
  1. 什么是递归?请使用递归实现斐波那契数列。请问递归实现的斐波那契数列存在什么问题?如果改进,需要如何修改?
递归,就是在运行的过程中调用自己。

//1,1,2,3,5,8,13……  斐波那契数列
public int fibonacci(int n) {
    if (n == 1 || n == 2)
        return 1;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

递归方式调用计算了很多次,这种代码效率太低。

改为非递归方式,减少计算次数

int fbnq(int n)
{
	int a = 1;
	int b = 1;
	int c = a;
	while (n > 2)
	{
		c = a + b;//从第三个数开始,斐波那契数等于前两个数的和;
		a = b;//将前一个数给到a,开始下一次求值
		b = c;//将斐波那契数给b,开始下一次求值
		n--;//每求一次,n都要减一
	}
	return c;
}
  1. 什么是对称加密?什么是非对称加密?什么是签名?请编码分别实现一种对称加密和非对称加密的例子。
对称加密是最快速、最简单的一种加密方式,加密与解密用的是同样的密钥。
非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
用数字签名的作用,主要是用来确保消息的正确性,确实是双方都是可靠的,对安全性比较的高的交互,都需要签名,

对称加密和非对称加密的例子:
https://gitee.com/chef_git/interview/tree/master/src/main/java/com/liudachu/interview/security 
  1. 设计模式有所了解吗?请列举出您所知道的设计模式,并编码提供至少三种设计模式。
单例模式 工厂模式 代理模式 建造者模式 模板方法模式 原型模式 策略模式 观察者模式

编码(单例模式 工厂模式 代理模式):
https://gitee.com/chef_git/interview/tree/7956597c5a3a4cfb22dbfa7af6dde7a87e7b1b89/src/main/java/com/liudachu/interview/Single
  1. 请简单介绍一下ISO网络模型,然后解释一下什么是tcp?什么是http?什么是超文本协议?
ISO网络模型:开放系统互连参考模型为实现开放系统互连所建立的通信功能分层模型,简称OSI参考模型。具体分为 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。


TCP属于ISO网络模型中的传输层协议,全称传输控制协议, 顾名思义, 就是要对数据的传输进行一定的控制.

HTTP属于应用层协议,是一种超文本传输协议,专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

超文本协议:
在互联网早期的时候,我们输入的信息只能保存在本地,无法和其他电脑进行交互。我们保存的信息通常都以文本即简单字符的形式存在,文本是一种能够被计算机解析的有意义的二进制数据包。而随着互联网的高速发展,两台电脑之间能够进行数据的传输后,人们不满足只能在两台电脑之间传输文字,还想要传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,那么文本的语义就被扩大了,这种语义扩大后的文本就被称为超文本。
  1. Spring Boot有什么特性?Spring Cloud是什么?请基于您的了解和认知简单介绍一下,越详细越好。
Springboot特性:
起动依赖:告诉Spring boot需要什么功能,只要引入一个相应的starter-denpendency,
Spring Boot就会根据我们的需要,帮助我们配置相应的依赖,而不用我们一个一个地去引入多个依赖,避免pom文件变得冗长,还容易出现依赖冲突的问题
比如说我们要实现web功能,直接引入spring-boot-starter-web,其中包含了json、tomcat、web、webmvc以及hibernate的验证依赖。如果没有特别的业务需求,那么我们使用这一套依赖就完全足够了

自动装配:
`springboot`是通过`main`方法下的`SpringApplication.run`方法启动的,
启动的时候他会调用`refshContext`方法,先刷新容器,然后根据解析注解或者解析配置文件的形式注册`bean`,
而它是通过启动类的`SpringBootApplication注解`进行开始解析的,他会根据`EnableAutoConfiguration`开启自动化配置,里面有个核心方法`importSelect`选择性的导入,根据`loadFanctoryNames`
根据`classpash`路径以`MATA-INF/spring.factorces`下面以什么什么`EnableAutoConfiguration`开头的`key`去加载里面所有对应的自动化配置,
他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的`jar包`,再判断容器是否有`bean`再进行注入到`bean容器`



Spring Cloud是一个完善的微服务框架
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,拥有自己独立的数据库;
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务,整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、为代理、事件总栈、全局锁、决策竞选、分布式会话等等集成服务;
  1. 假设一个加油站可以最大服务半径为3公里,或者可服务一万人群,那么,如果上海想合理化规划加油站的位置,需要如何考虑?
  2. 您认为您有什么优点?什么缺点?如果进行自我评价,您会如何评价自己?
优点:踏实肯干,虚心学习,对编程有极大的兴趣。
缺点:项目经验不足,团队开发经验较少

个人评价:
熟悉 Java语言,具备良好的编程习惯;了解Spring+ SpringMVC+ Mybatis框架,Redis缓存及MySQL; 有Java开发实习经历,主要负责河南省建筑监管平台的后端开发; 擅长自学,每天 1-2 小时代码学习;能够高效地进行团队沟通、协作。熟悉Vue、Flowable、Minio等主流框架,并两次在省级计算机大赛中获奖,对数据比较敏感。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/282732.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号