当前位置: 首页 > 工具软件 > 水滴网 > 使用案例 >

水滴 Java开发(一面)42min

孙和安
2023-12-01

1、 自我介绍(TGO基于SpringBoot的商城系统)

2、 项目中这些模块都是自己一个人完成得吗?

3、 讲一下用户模块,有哪些功能,哪些是你认为技术含量比较高?

4、 创建订单得时候包含哪些关键字段?

5、 一个订单中包含好多商品,如何只删除一件商品?

6、 确定订单时候,需要扣除库存吗?

7、 如何实现订单对库存得预扣减?

8、 当商品只有一个库存时候,两人同时下单 ,如何处理?

9、 A方法加了事务注解,B方法也加了事务注解,在A方法中调用了事务B,当B中发生了异常,哪个事务处理?

10、缓存中,技术上怎么实现库存查得时候又而真正扣减得时候没有了(锁?)

Java基础知识:

12、Java中equals与== 有什么区别?

== 操作符比较两个对象的引用是否指向同一个内存地址。如果两个引用变量指向的内存地址相同,那么它们就相等,否则它们不相等。
equals() 方法用于比较两个对象的内容是否相等。在默认情况下,Object 类中的 equals() 方法与 == 操作符相同,它只是比较两个对象的引用是否相等。但是,你可以在自定义的类中重写 equals() 方法,以便它比较对象的内容而不是引用

13、int 和 Integer 有什么区别?

  1. 数据类型:int 是基本数据类型,而 Integer 是一个类,它是 int 的包装类。

  2. 值的范围:int 是 32 位的有符号整数,取值范围为 -2^31 到 2^31-1,而 Integer 可以表示相同的范围,但它还可以表示 null 值。

  3. 内存占用:int 变量需要占用 4 个字节的内存空间,而 Integer 对象需要占用更多的内存空间,因为它还包含了对象的头信息和其他属性。

  4. 比较方式:当使用 == 运算符比较两个 int 变量时,比较的是它们的值。而当比较两个 Integer 对象时,== 比较的是它们在内存中的引用地址是否相同,而不是它们的值。要比较两个 Integer 对象的值是否相等,应该使用 equals() 方法。

  5. 可变性:int 是一个基本类型,它是不可变的,一旦创建就不能修改。而 Integer 是一个类,它是可变的,因为它可以被继承和扩展。

14、怎么创建得Integer才会具有缓存机制(了解源码)?

Integer a = 123;
直接赋值

15、final关键字得用法?项目中哪里用到这个关键字?

final关键字代表最终、不可改变的。

  1. 可以用来修饰一个类:
    含义:当前这个类不能有任何的子类。(太监类)
  2. 可以用来修饰一个方法:
    这个方法就是最终方法,也就是不能被覆盖重写。
  3. 还可以用来修饰一个局部变量:
    一旦使用final修饰局部变量,那么这个变量就不能进行修改,“一次赋值,终身不变”
  4. 还可以用来修饰一个成员变量:
    成员变量具有具有默认值,所以final之后必须手动赋值,不会再给默认值了

16、常用得集合类有哪些?

List:有序的元素集合,可以允许重复元素,常用实现类有ArrayList和LinkedList。
Set:不允许重复元素的无序集合,常用实现类有HashSet和TreeSet。
Map:由键值对组成的集合,每个键最多只能映射一个值,常用实现类有HashMap和TreeMap。
Queue:队列集合,通常用于实现先进先出(FIFO)的数据结构,常用实现类有LinkedList。
Deque:双端队列集合,可以在队列的两端插入或删除元素,常用实现类有ArrayDeque。

17、项目中哪里使用用到过LinkedList?

在项目中,LinkedList通常被用在以下场景下:

  1. 需要频繁进行元素的插入和删除操作,而不关心随机访问的效率。由于LinkedList在插入和删除操作时只需要修改指针,因此其时间复杂度为O(1),比ArrayList等基于数组的集合类更为高效。

  2. 需要实现LIFO(Last In First Out,后进先出)或FIFO(First In First Out,先进先出)的数据结构,比如栈或队列。由于LinkedList支持在链表的头部和尾部插入或删除元素,因此非常适合实现这些数据结构。

  3. 需要对列表进行高效的迭代操作。由于LinkedList内部采用双向链表的方式来存储数据,因此其可以支持高效的双向迭代,即可以从前往后或从后往前遍历链表中的元素。

需要注意的是,由于LinkedList底层采用链表结构来存储数据,因此在随机访问元素时效率较低,不如基于数组的集合类,比如ArrayList。因此,在需要频繁进行随机访问的场景下,建议使用ArrayList来代替LinkedList。

18、ArrayList和LinkedList有什么区别?

  1. ArrayList底层使用时数组。LinkedList使用的是链表。
  2. 数组查询具有所有查询特定元素比较快。而插入和删除和修改比较慢(数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)。
  3. 链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。所以查询效率低。插入时不需要移动内存,只需改变引用指向即可。所以插入或者删除的效率高。
  4. ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList使用在查询比较少而插入和删除比较多的情况。

19、HashMap底层得红黑树有什么特点?

在Java中,HashMap是一种非常常用的数据结构,它是基于哈希表实现的,可以快速地进行元素的查找、插入和删除操作。在Java 8及之后的版本中,当哈希桶中的链表长度超过一定阈值时,HashMap会将链表转化为红黑树,以提高元素的查找效率。

红黑树是一种自平衡二叉搜索树,它具有以下几个特点:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色的。
  3. 每个叶子节点(NIL节点)都是黑色的。
  4. 如果一个节点是红色的,则它的子节点必须是黑色的。
  5. 从任意一个节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。
  6. 在插入或删除节点时,需要对树进行自平衡操作,以保持树的平衡性。

在HashMap中,将链表转化为红黑树的目的是为了提高元素的查找效率。 当链表长度较长时,采用遍历链表的方式查找元素的效率会比较低,而红黑树能够支持快速的元素查找,从而提高HashMap的性能。

需要注意的是,虽然红黑树能够提高元素的查找效率,但它的空间复杂度相对较高,因为每个节点都需要存储颜色信息。因此,在实际应用中,需要权衡时间复杂度和空间复杂度的关系,选择合适的数据结构来实现需要的功能。

20、HashMap 什么时候使用红黑树什么时候使用链表?

在 Java 中,HashMap 中的每个桶(bucket)是一个链表或红黑树结构。当桶中的元素数量小于等于 8 时,使用链表存储元素;当桶中的元素数量大于 8 时,将链表转换为红黑树,以提高查找效率。

这是因为在链表中查找元素的时间复杂度为 O(n),而在红黑树中查找元素的时间复杂度为 O(log n),当链表中的元素数量很多时,查找效率会大大降低。因此,将链表转换为红黑树可以提高查找效率。

另外,当删除元素时,如果链表中的元素数量很少,删除操作的时间复杂度为 O(n),而将链表转换为红黑树后,删除操作的时间复杂度为 O(log n),因此,将链表转换为红黑树也可以提高删除操作的效率。

需要注意的是,将链表转换为红黑树也会带来额外的开销,例如树的旋转等操作会增加时间和空间开销。因此,需要在链表长度和红黑树高度之间进行平衡,选择合适的转换阈值,以在时间效率和空间效率之间做出合理的权衡。在 Java 8 中,桶中元素个数超过 8 个时,就会进行链表转红黑树操作,而当元素个数小于 6 个时,又会将红黑树转换为链表。

21、红黑树还会退化成链表?什么时候?

同上

22、为什么是小于6得时候退化?

在 Java 8 中,当一个桶中的元素个数小于等于 6 个时,HashMap 会将该桶从红黑树转换为链表。这是因为,当元素个数很少时,链表比红黑树更加高效,因为红黑树的建立和维护需要消耗额外的时间和空间开销。

当一个桶中的元素个数为 6 时,链表转化为红黑树是合理的,因为在这个大小的范围内,红黑树的查找时间复杂度和链表的查找时间复杂度差不多,而红黑树的插入、删除和查找操作的平均时间复杂度为 O(log n),比链表的 O(n) 更低。

但当元素个数很少时,链表的查找时间复杂度为 O(n),而红黑树的建立和维护也需要额外的开销,因此,将桶中元素个数小于等于 6 个的红黑树转化为链表可以提高效率,同时减少空间开销。

23、线程安全得Map有哪些?

ConcurrentHashMap、Hashtable、ConcurrentSkipListMap、Collections.synchronizedMap(主要前两种答出来即可)

24、ConcurrentHashMap底层原理是什么?

JDK 8 之前的 ConcurrentHashMap 底层是由一组 Segment 组成,每个 Segment 都相当于一个小的 Hash 表,它们共同维护了整个 ConcurrentHashMap。每个 Segment 内部都是基于 HashEntry 数组和单向链表实现的,当一个线程占用某个 Segment 进行修改时,其他线程可以继续对其他 Segment 进行操作,这样就减小了锁的粒度,从而提高了并发度。

JDK 8 中的 ConcurrentHashMap 底层结构有所改变,使用了一种新的实现方式,采用了 CAS 操作和红黑树,将数据分为多个桶,每个桶内部采用单向链表或者红黑树实现,当链表长度达到一定阈值时,会将链表转化为红黑树,以提高查询和修改效率。同时,JDK 8 中的 ConcurrentHashMap 不再使用 Segment,而是采用了一种新的实现方式,将整个 Map 分为多个 Region,每个 Region 内部采用了与单个 Segment 类似的实现方式,从而进一步提高了并发度和性能。

25、介绍一下MySQL的索引。

MySQL索引是一种数据结构,用于加快MySQL数据库中数据的查询速度。索引可以理解为将数据列中的值排序,以便更快地找到需要查询的行。MySQL索引可以基于一个或多个列创建,并且可以使用不同的算法进行排序和查找。

MySQL支持多种类型的索引,包括B-Tree索引、哈希索引、全文索引和空间索引等。其中,B-Tree索引是最常用的一种,因为它可以用于任何类型的查询,而且效率很高。

创建索引可以大大提高查询效率,但是也会增加写入操作的开销。因此,在决定是否创建索引时需要考虑到数据库中读取和写入操作的比例。同时,还要根据具体的查询需求和数据分布情况来选择合适的索引类型和索引列。

26、聚集索引和非聚集索引的区别?

1、聚集索引(聚簇索引): 聚集索引就是以主键创建的索引,在叶子节点存储的是表中的数据。
2、非聚集索引(非聚簇索引):非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。

27、一个表没有设置主键索引可以创建成功吗?为什么?

一个表可以在没有主键索引的情况下被创建成功。主键索引是一种特殊的索引,用于确保表中的每一行都有一个唯一标识符。在许多情况下,主键索引对于表的性能和数据完整性都是非常重要的,但并不是强制要求的。

如果创建表时没有指定主键索引,那么该表中的每一行将不会有一个唯一标识符。这可能会使得某些查询或更新操作变得更加复杂或者不可能。另外,如果在没有主键索引的情况下插入重复的行,则会导致数据不完整或者无法进行查询。

总的来说,虽然在某些情况下可以创建没有主键索引的表,但在大多数情况下,为了确保数据的完整性和高效的查询操作,应该在表中设置主键索引。

28、给一个查询语句怎么确定她有没有使用索引?

可以使用 EXPLAIN 关键字来分析一个查询语句是否使用了索引。EXPLAIN 关键字可以在执行查询前模拟该查询的执行计划,并返回关于该计划的信息,包括使用的索引和扫描行数等。以下是检查一个查询语句是否使用了索引的步骤:

  1. 执行以下查询sql:
Copy code
EXPLAIN SELECT * FROM table_name WHERE condition;
其中,table_name 是要查询的表名,condition 是查询的条件。
  1. 检查 Extra 列。如果 Extra 列包含 “Using index” 或者 “Using index condition”,则表示查询使用了索引。
    “Using index” 表示查询覆盖了所需的列,并且没有读取表中的其他列。
    “Using index condition” 表示查询使用了索引来评估查询条件,并且还需要读取表中的其他列。
  2. 检查 key 列。如果 key 列包含表中的一个索引的名称,则表示查询使用了该索引。
    如果 Extra 列中没有 “Using index” 或者 “Using index condition”,并且 key 列也没有包含任何索引的名称,则表示查询没有使用索引。

需要注意的是,索引并不总是对查询性能有利,有时候甚至会降低查询性能。因此,在确定查询是否使用了索引时,需要进行综合评估,考虑查询的复杂性、数据分布和索引选择等因素。

29、联合索引遵循的规则?

最左前缀匹配原则

30、explain关键字使用过吗?

同28

31、事务的特性?

  1. 原子性:一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节,发生错误就回滚。
  2. 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
  3. 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。
  4. 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

32、事务实现的原理是什么?

实现事务的原理通常涉及两个主要的机制:

  1. 日志记录(Logging):在事务执行过程中,所有对数据库进行的操作都要记录到日志文件中,包括对哪些数据进行了什么样的修改。这样,在系统出现故障或错误时,可以使用日志来回滚事务或恢复数据。
  2. 锁定机制(Locking):为了确保事务的隔离性,数据库会对事务中涉及的数据进行锁定,使得其他事务不能对这些数据进行操作。当事务提交或回滚时,锁定也会相应地释放。

33、介绍一下二叉树

二叉树是一种基本的树形数据结构,它由节点组成,每个节点最多有两个子节点,被称为左子节点和右子节点。二叉树最顶部的节点称为根节点,没有子节点的节点称为叶子节点。每个节点都可以有一个值或数据。

34、二叉树的遍历方式

前、中、后序遍历。

35、二分查找法

二分查找法(Binary Search)也称为折半查找,是一种在有序数组中查找某个元素的算法。它的基本原理是:将数组分成两部分,通过比较要查找的元素与中间元素的大小,确定要查找的元素在哪一部分中,然后继续在该部分中进行二分查找,直到找到要查找的元素,或者确定该元素不存在于数组中。

36、说一下DNS的解析过程

DNS(Domain Name System,域名系统)是一个分布式的系统,用于将域名转换为 IP 地址。DNS解析过程是将一个域名解析成其对应的 IP 地址的过程。这个过程可以分为以下几个步骤:

  1. 输入域名:用户在浏览器地址栏输入一个域名(例如www.google.com)。
  2. 查询本地 DNS 缓存:本地 DNS 缓存是一个存储最近查询的域名和对应 IP 地址的数据库,可以减少查询时间。如果本地缓存中存在该域名对应的 IP 地址,DNS 解析过程结束。
  3. 发送 DNS 查询请求:如果本地缓存中不存在该域名对应的 IP 地址,那么本地 DNS 服务器将向根域名服务器发送一个 DNS 查询请求。根域名服务器是一个全球性的 DNS 服务器,它保存了顶级域名服务器的信息。
  4. 查询顶级域名服务器:根域名服务器会返回顶级域名服务器的信息,顶级域名服务器是管理顶级域名(例如.com、.net、.org)的 DNS 服务器。本地 DNS 服务器将向顶级域名服务器发送一个 DNS 查询请求。
  5. 查询权威域名服务器:顶级域名服务器会返回该域名对应的权威域名服务器的信息。权威域名服务器是管理该域名的 DNS 服务器。本地 DNS 服务器将向权威域名服务器发送一个 DNS 查询请求。
  6. 返回 IP 地址:权威域名服务器将返回该域名对应的 IP 地址。本地 DNS 服务器将该 IP 地址存储在本地缓存中,并将其返回给用户的计算机。计算机将使用该 IP 地址向该域名的 Web 服务器发送请求,获取网页内容。

需要注意的是,DNS 查询请求的过程中可能存在多次转发请求的情况,DNS 缓存和域名服务器的缓存也会对 DNS 解析过程产生影响,因此查询时间可能会有所不同。

37、POST请求与GET请求查询?

GET和POST请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的不同操作。
GET,POST,PUT,DELETE就对应着对这个资源的查、改、增、删 4个操作,具体点来讲GET一般用于获取/查询资源信息,而POST一般用于更新资源信息

1、Get请求提交的数据会在地址栏显示出来,而post请求不会再地址栏显示出来.
GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;
POST提交:把提交的数据放置在是HTTP包的包体中,因此,GET提交的数据会在地址栏中显示出来,而POST地址栏不会改变
2、传输数据的大小
http Get请求由于浏览器对地址长度的限制而导致传输的数据有限制。而POST请求不会因为地址长度限制而导致传输数据限制。
3、安全性,POST的安全性要比GET的安全性高。由于数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息。

38、GET请求最大支持多少参数

get 是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。 很多文章都说GET方式提交的数据最多只能是1024字节,而实际上,URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。

39、日常学习中怎么学习基础知识?

菜鸟教程、牛客网、CSDN、github

40、对未来学习知识有什么规划吗?

vue、分布式、微服务

41、反问

 类似资料: