== 操作符比较两个对象的引用是否指向同一个内存地址。如果两个引用变量指向的内存地址相同,那么它们就相等,否则它们不相等。
equals() 方法用于比较两个对象的内容是否相等。在默认情况下,Object 类中的 equals() 方法与 == 操作符相同,它只是比较两个对象的引用是否相等。但是,你可以在自定义的类中重写 equals() 方法,以便它比较对象的内容而不是引用
数据类型:int 是基本数据类型,而 Integer 是一个类,它是 int 的包装类。
值的范围:int 是 32 位的有符号整数,取值范围为 -2^31 到 2^31-1,而 Integer 可以表示相同的范围,但它还可以表示 null 值。
内存占用:int 变量需要占用 4 个字节的内存空间,而 Integer 对象需要占用更多的内存空间,因为它还包含了对象的头信息和其他属性。
比较方式:当使用 == 运算符比较两个 int 变量时,比较的是它们的值。而当比较两个 Integer 对象时,== 比较的是它们在内存中的引用地址是否相同,而不是它们的值。要比较两个 Integer 对象的值是否相等,应该使用 equals() 方法。
可变性:int 是一个基本类型,它是不可变的,一旦创建就不能修改。而 Integer 是一个类,它是可变的,因为它可以被继承和扩展。
Integer a = 123;
直接赋值
final关键字代表最终、不可改变的。
List:有序的元素集合,可以允许重复元素,常用实现类有ArrayList和LinkedList。
Set:不允许重复元素的无序集合,常用实现类有HashSet和TreeSet。
Map:由键值对组成的集合,每个键最多只能映射一个值,常用实现类有HashMap和TreeMap。
Queue:队列集合,通常用于实现先进先出(FIFO)的数据结构,常用实现类有LinkedList。
Deque:双端队列集合,可以在队列的两端插入或删除元素,常用实现类有ArrayDeque。
在项目中,LinkedList通常被用在以下场景下:
需要频繁进行元素的插入和删除操作,而不关心随机访问的效率。由于LinkedList在插入和删除操作时只需要修改指针,因此其时间复杂度为O(1),比ArrayList等基于数组的集合类更为高效。
需要实现LIFO(Last In First Out,后进先出)或FIFO(First In First Out,先进先出)的数据结构,比如栈或队列。由于LinkedList支持在链表的头部和尾部插入或删除元素,因此非常适合实现这些数据结构。
需要对列表进行高效的迭代操作。由于LinkedList内部采用双向链表的方式来存储数据,因此其可以支持高效的双向迭代,即可以从前往后或从后往前遍历链表中的元素。
需要注意的是,由于LinkedList底层采用链表结构来存储数据,因此在随机访问元素时效率较低,不如基于数组的集合类,比如ArrayList。因此,在需要频繁进行随机访问的场景下,建议使用ArrayList来代替LinkedList。
在Java中,HashMap是一种非常常用的数据结构,它是基于哈希表实现的,可以快速地进行元素的查找、插入和删除操作。在Java 8及之后的版本中,当哈希桶中的链表长度超过一定阈值时,HashMap会将链表转化为红黑树,以提高元素的查找效率。
红黑树是一种自平衡二叉搜索树,它具有以下几个特点:
在HashMap中,将链表转化为红黑树的目的是为了提高元素的查找效率。 当链表长度较长时,采用遍历链表的方式查找元素的效率会比较低,而红黑树能够支持快速的元素查找,从而提高HashMap的性能。
需要注意的是,虽然红黑树能够提高元素的查找效率,但它的空间复杂度相对较高,因为每个节点都需要存储颜色信息。因此,在实际应用中,需要权衡时间复杂度和空间复杂度的关系,选择合适的数据结构来实现需要的功能。
在 Java 中,HashMap 中的每个桶(bucket)是一个链表或红黑树结构。当桶中的元素数量小于等于 8 时,使用链表存储元素;当桶中的元素数量大于 8 时,将链表转换为红黑树,以提高查找效率。
这是因为在链表中查找元素的时间复杂度为 O(n),而在红黑树中查找元素的时间复杂度为 O(log n),当链表中的元素数量很多时,查找效率会大大降低。因此,将链表转换为红黑树可以提高查找效率。
另外,当删除元素时,如果链表中的元素数量很少,删除操作的时间复杂度为 O(n),而将链表转换为红黑树后,删除操作的时间复杂度为 O(log n),因此,将链表转换为红黑树也可以提高删除操作的效率。
需要注意的是,将链表转换为红黑树也会带来额外的开销,例如树的旋转等操作会增加时间和空间开销。因此,需要在链表长度和红黑树高度之间进行平衡,选择合适的转换阈值,以在时间效率和空间效率之间做出合理的权衡。在 Java 8 中,桶中元素个数超过 8 个时,就会进行链表转红黑树操作,而当元素个数小于 6 个时,又会将红黑树转换为链表。
同上
在 Java 8 中,当一个桶中的元素个数小于等于 6 个时,HashMap 会将该桶从红黑树转换为链表。这是因为,当元素个数很少时,链表比红黑树更加高效,因为红黑树的建立和维护需要消耗额外的时间和空间开销。
当一个桶中的元素个数为 6 时,链表转化为红黑树是合理的,因为在这个大小的范围内,红黑树的查找时间复杂度和链表的查找时间复杂度差不多,而红黑树的插入、删除和查找操作的平均时间复杂度为 O(log n),比链表的 O(n) 更低。
但当元素个数很少时,链表的查找时间复杂度为 O(n),而红黑树的建立和维护也需要额外的开销,因此,将桶中元素个数小于等于 6 个的红黑树转化为链表可以提高效率,同时减少空间开销。
ConcurrentHashMap、Hashtable、ConcurrentSkipListMap、Collections.synchronizedMap(主要前两种答出来即可)
JDK 8 之前的 ConcurrentHashMap 底层是由一组 Segment 组成,每个 Segment 都相当于一个小的 Hash 表,它们共同维护了整个 ConcurrentHashMap。每个 Segment 内部都是基于 HashEntry 数组和单向链表实现的,当一个线程占用某个 Segment 进行修改时,其他线程可以继续对其他 Segment 进行操作,这样就减小了锁的粒度,从而提高了并发度。
JDK 8 中的 ConcurrentHashMap 底层结构有所改变,使用了一种新的实现方式,采用了 CAS 操作和红黑树,将数据分为多个桶,每个桶内部采用单向链表或者红黑树实现,当链表长度达到一定阈值时,会将链表转化为红黑树,以提高查询和修改效率。同时,JDK 8 中的 ConcurrentHashMap 不再使用 Segment,而是采用了一种新的实现方式,将整个 Map 分为多个 Region,每个 Region 内部采用了与单个 Segment 类似的实现方式,从而进一步提高了并发度和性能。
MySQL索引是一种数据结构,用于加快MySQL数据库中数据的查询速度。索引可以理解为将数据列中的值排序,以便更快地找到需要查询的行。MySQL索引可以基于一个或多个列创建,并且可以使用不同的算法进行排序和查找。
MySQL支持多种类型的索引,包括B-Tree索引、哈希索引、全文索引和空间索引等。其中,B-Tree索引是最常用的一种,因为它可以用于任何类型的查询,而且效率很高。
创建索引可以大大提高查询效率,但是也会增加写入操作的开销。因此,在决定是否创建索引时需要考虑到数据库中读取和写入操作的比例。同时,还要根据具体的查询需求和数据分布情况来选择合适的索引类型和索引列。
1、聚集索引(聚簇索引): 聚集索引就是以主键创建的索引,在叶子节点存储的是表中的数据。
2、非聚集索引(非聚簇索引):非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。
一个表可以在没有主键索引的情况下被创建成功。主键索引是一种特殊的索引,用于确保表中的每一行都有一个唯一标识符。在许多情况下,主键索引对于表的性能和数据完整性都是非常重要的,但并不是强制要求的。
如果创建表时没有指定主键索引,那么该表中的每一行将不会有一个唯一标识符。这可能会使得某些查询或更新操作变得更加复杂或者不可能。另外,如果在没有主键索引的情况下插入重复的行,则会导致数据不完整或者无法进行查询。
总的来说,虽然在某些情况下可以创建没有主键索引的表,但在大多数情况下,为了确保数据的完整性和高效的查询操作,应该在表中设置主键索引。
可以使用 EXPLAIN 关键字来分析一个查询语句是否使用了索引。EXPLAIN 关键字可以在执行查询前模拟该查询的执行计划,并返回关于该计划的信息,包括使用的索引和扫描行数等。以下是检查一个查询语句是否使用了索引的步骤:
Copy code
EXPLAIN SELECT * FROM table_name WHERE condition;
其中,table_name 是要查询的表名,condition 是查询的条件。
需要注意的是,索引并不总是对查询性能有利,有时候甚至会降低查询性能。因此,在确定查询是否使用了索引时,需要进行综合评估,考虑查询的复杂性、数据分布和索引选择等因素。
最左前缀匹配原则
同28
实现事务的原理通常涉及两个主要的机制:
二叉树是一种基本的树形数据结构,它由节点组成,每个节点最多有两个子节点,被称为左子节点和右子节点。二叉树最顶部的节点称为根节点,没有子节点的节点称为叶子节点。每个节点都可以有一个值或数据。
前、中、后序遍历。
二分查找法(Binary Search)也称为折半查找,是一种在有序数组中查找某个元素的算法。它的基本原理是:将数组分成两部分,通过比较要查找的元素与中间元素的大小,确定要查找的元素在哪一部分中,然后继续在该部分中进行二分查找,直到找到要查找的元素,或者确定该元素不存在于数组中。
DNS(Domain Name System,域名系统)是一个分布式的系统,用于将域名转换为 IP 地址。DNS解析过程是将一个域名解析成其对应的 IP 地址的过程。这个过程可以分为以下几个步骤:
需要注意的是,DNS 查询请求的过程中可能存在多次转发请求的情况,DNS 缓存和域名服务器的缓存也会对 DNS 解析过程产生影响,因此查询时间可能会有所不同。
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的安全性高。由于数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息。
get 是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。 很多文章都说GET方式提交的数据最多只能是1024字节,而实际上,URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。
菜鸟教程、牛客网、CSDN、github
vue、分布式、微服务