
面试题
开背!
String[ ] args
学生
展开
-
谈一下对注解的理解?注解起到了什么作用?
3.实现代码生成和处理:注解可以用于实现代码生成和处理,例如通过注解生成代码、进行静态分析、实现自定义的编译时检查等。1.提供额外的配置信息:注解可以用于为代码提供额外的配置信息,例如配置数据库连接、事务管理等。2.提供说明和文档:注解可以用于为代码提供说明和文档,帮助其他开发人员理解代码的用途和行为。谈一下对注解的理解?注解起到了什么作用?原创 2023-09-18 10:22:40 · 373 阅读 · 0 评论 -
二级索引为何存主键不存数据的内存地址
3.支持覆盖索引查询:由于二级索引存储的是主键值,而不是数据的内存地址,所以在某些情况下,可以通过二级索引直接获取到查询所需的数据,而不需要再去访问主键索引或数据页,从而提高查询效率。2.索引更新更高效:当数据行发生更新时,只需要更新对应的二级索引中的主键值,而不需要更新存储数据的内存地址,从而提高了索引的更新效率。1.索引大小更小:存储主键值而不是数据的内存地址可以减小索引的大小,节省存储空间。原创 2023-09-04 19:13:54 · 338 阅读 · 0 评论 -
不用 ThreadLocal 你会想用什么方式存用户信息
每个线程可以通过自己的标识(如线程 ID)来访问和修改自己的用户信息。使用自定义的上下文对象:可以创建一个自定义的上下文对象,将用户信息存储在该对象中。每个线程可以通过获取自己的上下文对象来获取和修改自己的用户信息。使用全局变量:将用户信息存储在全局变量中,通过访问全局变量来获取用户信息。需要注意的是,全局变量需要进行适当的同步控制,以确保线程安全。使用参数传递:将用户信息作为参数传递给需要使用的方法或函数。这样可以确保每个方法或函数都有自己的用户信息副本,避免了线程安全问题。原创 2023-08-29 09:53:52 · 154 阅读 · 0 评论 -
hashmap的扩容算法
在进行扩容操作时,HashMap会重新计算每个键值对的哈希值,并根据新的容量重新确定它们在新数组中的位置。因此,在设计HashMap时,需要合理选择初始容量和负载因子,以减少扩容操作的频率,提高HashMap的性能。HashMap的扩容算法是为了在HashMap中存储的键值对数量达到一定阈值时,自动扩容HashMap的容量,以保持较低的负载因子,提高HashMap的性能。遍历原数组中的每个桶(bucket),将每个桶中的键值对重新计算哈希值,并放入新数组的对应位置。原创 2023-08-28 19:18:55 · 343 阅读 · 0 评论 -
java网络编程
正常情况下是客户端和服务端直接进行交互的 但是在这个时候有一个中间人在客户端和服务端之间盗取和篡改双方通讯的内容Https使用CA证书和加密来解决中间人攻击。原创 2023-08-25 08:58:29 · 146 阅读 · 0 评论 -
1000亿数据,无限制的内存, 插入到hashmap中, 怎么快速、安全的插入
5.考虑多线程下hashmap的线程安全问题,使用加锁或者使用ConcurrentHashMap。3.考虑hashmap的初始容量和负载因子,设置一个合理的值。1.分批插入 可以将数据分成不同的批次 不要一次插入。4.选择合适的hash函数,减少哈希碰撞的次数。2.使用多个线程并行插入,充分利用资源。原创 2023-08-18 16:07:02 · 518 阅读 · 0 评论 -
HashMap和TreeMap的区别
1.hashmap底层是通过数组加链表和红黑树实现的而treemap就是纯红黑树实现。2.treemap中的键值对是有序的而hashmap是无序的。3.treemap的crud性能要比hashmap高。4.treemap占用的空间资源要比hashmap多。原创 2023-08-18 15:51:34 · 102 阅读 · 0 评论 -
mysql的char和varchar的区别
存储方式:char是固定长度的字符类型,它会根据定义的长度存储固定数量的字符,不足的部分会使用空格进行填充。而varchar是可变长度的字符类型,它会根据实际存储的字符数量来动态分配存储空间,不会浪费额外的空间。存储空间:由于char是固定长度的,所以它的存储空间是固定的,不受实际存储的字符数量影响。而varchar的存储空间是根据实际存储的字符数量来动态分配的,所以它的存储空间通常会比char更节省。索引使用:char和varchar都可以被索引,但是由于char是固定长度的,所以在使用索引时效果更好。原创 2023-08-18 09:05:35 · 401 阅读 · 0 评论 -
即然利用反射机制可以破坏单例模式,有什么方法避免呢?
私有构造方法中添加防止多次实例化的逻辑:在单例类的私有构造方法中,可以添加逻辑来检查是否已经存在实例,如果存在则抛出异常或返回已有的实例。这样即使通过反射创建了新的实例,也能在构造方法中进行拦截。使用静态内部类实现单例:静态内部类在类加载时被初始化,且只会被加载一次,因此可以保证单例的唯一性。通过静态内部类实现的单例模式不会受到反射攻击的影响。使用枚举实现单例:枚举类型的实例是唯一的,且在反射攻击下是安全的。可以使用枚举来实现单例模式,这样就不会受到反射攻击的影响。原创 2023-08-10 20:21:07 · 1406 阅读 · 0 评论 -
扩容为什么每次都是扩大2倍,或者说为什么容量是2的幂次
内存利用率高:容量选择为2的幂次时,可以通过位运算来计算哈希桶的索引,而不需要使用取模运算。此外,容量选择为2的幂次时,哈希桶的数量是固定的,不会出现浪费内存的情况。均匀分布:哈希表的性能与哈希桶的负载因子(即每个桶中元素的平均数量)有关。当容量选择为2的幂次时,哈希函数的取模运算可以简化为位运算(与操作),这样可以保证哈希桶的索引在扩容前后的分布是均匀的,减少了哈希冲突的概率。效率高:将容量扩大为原来的两倍,可以通过简单的位运算(左移1位)来计算新的哈希桶的索引,而不需要进行复杂的计算。原创 2023-08-10 19:10:16 · 314 阅读 · 0 评论 -
在哪些场景下索引会变得越来越慢
2.锁竞争,当多个并发操作同时对同一个索引进行读取或更新时,可能会发生锁竞争,导致索引操作的等待时间增加,从而降低了索引的性能。3. 查询复杂度增加,当查询的复杂度增加时,如涉及多个表的连接、子查询或复杂的条件筛选,索引的使用效率可能会下降,导致查询变慢。4. 索引失效,如果索引的选择不当或者数据分布不均匀,可能会导致索引失效,即数据库无法有效地使用索引来加速查询,从而导致查询变慢。1.索引过多,如果数据库中存在过多的索引,每次更新数据时都需要更新多个索引,这会增加索引维护的开销,导致索引操作变慢。原创 2023-08-10 16:45:33 · 467 阅读 · 0 评论 -
为什么选择HashMap
这样可以保持HashMap的平均负载因子较低,减少哈希冲突的概率,提高性能。4.线程不安全:HashMap是非线程安全的,这意味着在多线程环境下使用HashMap时,需要额外的同步措施来保证线程安全。但正因为它是非线程安全的,HashMap的性能相对较高,适用于单线程或者多线程读操作远远多于写操作的场景。2.使用灵活,HashMap可以存储键值对,其中键和值可以是任意类型的对象。1.速度快,hashmap插入、查找和删除操作的时间复杂度都是常数级别的(O(1)),在大多数情况下具有非常高的执行效率。原创 2023-08-09 15:00:13 · 182 阅读 · 0 评论 -
undo log、redo log和bin log
1.undo log是一种用于撤销回退的日志,MYSQL会记录更新前的数据到undo log日志文件里面,当事务回滚或者数据库崩溃时,可以用undo log进行回退2.undo log在事务开始前产生,事务提交时并不会直接删除,而是会将对应的undo log放入删除列表中,后台有专门的线程purge thread进行回收处理。原创 2023-08-05 14:49:19 · 190 阅读 · 0 评论 -
什么是 WAL 技术?它有什么特点?
WAL技术的核心思想是在对数据库进行任何修改之前,先将相应的日志记录写入到持久化的日志文件中。先写日志,再写数据:在WAL技术中,对数据库的修改操作首先被写入到日志文件中,然后再将修改后的数据写入到磁盘。通过读取日志文件中的日志记录,可以将这些操作应用到数据库中,从而恢复到崩溃前的一致性状态。顺序写入的特性使得WAL技术在性能上具有优势,因为磁盘的顺序写入速度通常比随机写入速度更快。需要注意的是,WAL技术是一种通用的数据库事务日志技术,在不同的数据库管理系统中可能会有一些细微的差异。原创 2023-08-05 10:37:07 · 1121 阅读 · 0 评论 -
Synchronized锁升级过程
自旋锁会假设在不久将来,当前的线程可以获得锁,因此虚拟机会让当前想要获取锁的线程做几个空循环(这也是称为自旋的原因),一般不会太久,可能是50个循环或100循环,在经过若干次循环后,如果得到锁,就顺利进入临界区。轻量级锁状态(轻量级锁):当多个线程竞争同一个锁时,偏向锁会升级为轻量级锁。在轻量级锁状态下,线程会尝试使用CAS(Compare and Swap)操作来获取锁,如果成功获取锁,则进入临界区执行代码。如果获取锁失败,表示有其他线程竞争锁,那么线程会膨胀为重量级锁。原创 2023-08-04 20:38:31 · 186 阅读 · 0 评论 -
索引下推的理解与举例
MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。先找到姓张的人然后进行回表查询看他是不是10,是则返回,而有了索引下推之后 他会同时判断是否姓张和年龄是否为10 同时满足才会进行回表查询。如果没有索引下推 当我们 使用。原创 2023-08-04 20:28:30 · 195 阅读 · 0 评论 -
覆盖索引的理解与举例
此时根据name会找到 主键id 此时只能返回id和name而不能返回password,这时就会回表查询找到对应的行消耗了性能,如果我们建立一个联合索引name,password 那么在找到name的同时也会找到passwode同时非聚簇索引叶子结点会存储主键id值这是就能直接返回这三个字段而不用进行回表查询,这样就提高了效率 ,但是如果我们再加入一个字段grade就会又需要回表查询了。覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。原创 2023-08-04 20:26:58 · 307 阅读 · 0 评论 -
数据库索引失效的情况
5,如果mysql评估使用索引比全表更慢,则不使用索引,但是我们一般忽略这个问题因为一个是不稳定,二是不同版本下的优化器执行也不一样。6.类型转换:如果索引列存在类型转换,那么也不会走索引,比如某列为字符串类型,而查询的时候设置了 int 类型的值就会导致索引失效;4.如果使用or分割符,如果or前面的条件中的列有索引,后面的列没有索引,那么涉及到的索引都不会被用到。3.如果最索引字段使用模糊查询,如果是头部模糊索引将失效,如果是尾部模糊索引则正常。1.对添加了索引的字段进行函数运算。原创 2023-08-04 20:24:17 · 368 阅读 · 0 评论 -
InnoDB有哪些特性
事务支持:InnoDB支持ACID(原子性、一致性、隔离性和持久性)事务,可以保证数据的完整性和一致性。它使用多版本并发控制(MVCC)来实现事务的隔离性,支持读已提交和可重复读两种隔离级别。它支持多个事务同时读取同一表的不同行,同时也支持并发事务对同一表的不同行进行修改。自动崩溃恢复:InnoDB具有自动崩溃恢复的能力,可以在数据库异常关闭后自动进行恢复操作,保证数据的一致性。热备份:InnoDB支持在线热备份,可以在数据库运行的同时进行备份操作,减少对数据库的影响。原创 2023-08-04 14:11:32 · 660 阅读 · 0 评论 -
lock和synchronized有啥区别吗
锁的可中断性:synchronized在获取锁时,如果锁已被其他线程持有,当前线程会进入阻塞状态,直到获取到锁为止,无法被中断。而lock提供了可中断锁的特性,即在获取锁时,如果锁已被其他线程持有,当前线程可以选择中断等待,而不是一直等待下去。锁的公平性:synchronized是非公平锁,即多个线程竞争锁时,无法保证获取锁的顺序。获取锁的方式:synchronized是Java语言内置的关键字,可以直接在方法或代码块中使用,而lock是一个接口,需要通过实例化具体的锁对象来获取锁。原创 2023-08-04 09:45:07 · 100 阅读 · 0 评论 -
了解Java的锁么?可以详细说说么?你一般怎么用
与synchronized相比,ReentrantLock提供了更灵活的锁控制,可以实现更复杂的锁定行为。ReentrantLock还提供了公平锁和非公平锁的选择,以及可中断锁的特性。当一个线程进入synchronized代码块时,会尝试获取锁,如果锁已被其他线程持有,则该线程会被阻塞,直到获取到锁为止。synchronized关键字具有自动释放锁的特性,当线程执行完synchronized代码块或方法后,会自动释放锁。在实际使用中,我根据具体的需求和场景选择合适的锁机制。是的我了解Java的锁机制。原创 2023-08-04 09:43:37 · 104 阅读 · 0 评论 -
怎么设计线程池,怎么判断一个线程是否空闲,谁来判断?
线程池会根据任务队列的容量和线程池的大小来决定是否创建新的线程来执行任务,或者将任务放入队列等待执行。线程池会根据任务队列的状态来判断是否有空闲线程可用,如果有,则将任务分配给空闲线程执行。4.执行任务,线程池会自动从任务队列中取出任务,并将其分配给空闲的线程执行。线程池会根据任务的优先级和调度策略来决定任务的执行顺序。线程池的大小决定线程池中可以同时执行的线程的数量,任务队列的容量决定可以等待执行的线程数量。1.确定线程池,线程池的大小应该根据系统的处理能力和任务的类型来确定,避免线程过多或过少。原创 2023-08-02 12:30:02 · 793 阅读 · 0 评论 -
java中的反射
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意属性和方法; 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。通俗的理解:(掌握)利用反射创建的对象可以无视修饰符调用类里面的内容可以跟配置文件结合起来使用,把要创建的对象信息和方法写在配置文件中。读取到什么类,就创建什么类的对象读取到什么方法,就调用什么方法此时当需求变更的时候不需要修改代码,只要修改配置文件即可。原创 2023-07-21 10:01:06 · 117 阅读 · 0 评论 -
Java序列化和反序列化
java是面向对象的开发方式,一切都是java对象,想要在网络中传输java对象,可以使用序列化和反序列化去实现,发送发需要将java对象转换为字节序列,然后在网络上传送,接收方收到字符序列后,会通过反序列化将字节序列恢复成java对象。Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。第二步:Test不变,进行序列化和反序列化。原创 2023-07-20 10:20:26 · 280 阅读 · 1 评论 -
3.java基础(三)
Throwable是异常的顶层父类,代表所有的非正常情况。它有两个直接子类,分别是Error、Exception。Error是错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用catch块来捕获Error对象。在定义方法时,也无须在其throws子句中声明该方法可能抛出Error及其任何子类。原创 2023-07-03 18:59:13 · 152 阅读 · 0 评论 -
2.java基础(二)
当Java程序直接使用 “hello” 的字符串直接量时,JVM将会使用常量池来管理这个字符串,如果多个字符串字面量的内容相同,它们将在内存中共享同一个String对象,从而节省了内存空间。面向对象是一种程序设计的方法论,他把程序中的一切元素(如数据、功能)抽象成对象,通过对象之间的交互实现系统的实现和设计的目的,这样做使代码具有良好的复用性、可维护性、可拓展性。这意味着字符串对象在整个程序的生命周期内保持不变,可以减少程序中出现的意外副作用和错误,提高了代码的可靠性和可预测性。原创 2023-07-03 16:44:06 · 166 阅读 · 0 评论 -
1. Java基础(一)
分为基本数据类型与引用数据类型基本数据类型 整数类型(byte,short,int,Long) 浮点类型 (float,double)字符类型(char) 布尔类型(boolean)引用数据类型 接口,数组,类首先他们创建的位置不同 成员变量创建在类中而局部变量创建在方法中然后是成员变量会有默认值而局部变量不会有然后局部变量会存在栈内存中,它作用的范围结束会自动释放而全局变量则要分情况如果是加了static修饰他叫类变量,会存在方法区中变量生命周期和类相同。原创 2023-06-15 00:30:26 · 347 阅读 · 0 评论