2023-04-18_面试题复盘笔记(121)

一、北大软件武汉分公司 Java后端一面 30min

1.自我介绍

2. Java基本数据类型有哪些?

Java基本数据类型有以下8种:
1.byte: 8位有符号整数,取值范围为-128到127。
2.short: 16位有符号整数,取值范围为-32768到32767。
3.int: 32位有符号整数,取值范围为-2147483648到2147483647。
4.long: 64位有符号整数,取值范围为-9223372036854775808到9223372036854775807。
5.float: 32位IEEE 754浮点数。
6.double: 64位IEEE 754浮点数。
7.char: 16位Unicode字符,取值范围为’\u0000’(0)到’\uffff’(65535)。
8.boolean: 布尔值,取值为true或false。

3.String有哪些常用方法?

String类有很多常用方法,其中一些包括:
1.length():返回字符串的长度。
2.charAt(int index):返回给定索引处的字符。
3.substring(int beginIndex, int endIndex):返回从起始索引到终止索引的子字符串。
4.equals(Object other):比较字符串是否相等。
5.indexOf(String str):返回给定字符串在该字符串中第一次出现的索引。
6.toLowerCase()和toUpperCase():转换字符串为小写或大写。
7.replace(char oldChar, char newChar):替换字符串中的字符。
8.split(String regex):根据给定的正则表达式将字符串拆分为字符串数组。
9.trim():去除字符串前后的空格。
10.isEmpty():判断字符串是否为空。

4.重载和重写有什么区别?

重载和重写是两个不同的概念。重载(overloading)是指在一个类中同时存在多个同名但参数不同的方法,编译器会根据参数类型和数量的不同来决定使用哪个方法;而重写(override)是指在子类中重新实现父类的方法,子类的方法与父类的方法名和参数类型都相同,但方法体不同。重载是针对相同的类中的方法,而重写是针对父类和子类之间的方法。

5.Java三大特性?

Java三大特性包括面向对象、跨平台性和自动内存管理。

6.你了解Java集合吗?

Java集合类可以分为三种类型:Set,List和Map。其中Set接口不允许包含重复元素,List接口按照插入顺序保存元素,Map接口将键映射到值。常用的集合类包括:
1.Set接口:HashSet、TreeSet、LinkedHashSet等。
2.List接口:ArrayList、LinkedList、Vector等。
3.Map接口:HashMap、TreeMap、LinkedHashMap等。
此外,还有Queue接口和Deque接口等集合类。

7.请说一下Map中各个实现类的区别?

HashMap、TreeMap和LinkedHashMap是Java中常用的三种Map实现类,它们的主要区别如下:
HashMap
HashMap使用哈希表来实现,它能够快速的根据key来查找value。HashMap不保证其中元素的顺序,因为它不会保证插入顺序和迭代顺序一致。由于HashMap是非线程安全的,所以在多线程的情况下需要进行加锁或者使用ConcurrentHashMap。
TreeMap
TreeMap基于红黑树实现,它能够保证其中元素的顺序。当需要按照元素的键值进行遍历时,使用TreeMap可以非常高效的实现这个过程。TreeMap是有序的,因为它具有按照key值排序的特性。
LinkedHashMap
LinkedHashMap继承了HashMap的特征,并且使用一个双向链表来保证插入顺序和迭代顺序一致,因此LinkedHashMap既保证了元素的顺序,又有着HashMap的快速查找特性。
总的来说,HashMap适用于快速查找键对应的值,而TreeMap适用于对元素进行排序的场景,LinkedHashMap则可以在需要有序性的场景中使用,并且在需要对元素进行遍历时还能够保证效率。

8. 你看过HashMap的源码吗?

HashMap是Java中常用的数据结构,用于存储键值对,并支持O(1)时间复杂度的插入、查询、删除等操作。
HashMap的源码解析如下:
1.HashMap是一个实现了Map接口的类,内部使用数组和链表实现。
2.HashMap中的键值对是以Entry对象的形式存储的,每个Entry对象包含一个键、一个值和指向下一个Entry对象的引用。
3.HashMap内部维护了一个默认容量为16的数组table,负载因子为0.75,默认扩容因子为2。当HashMap中的元素数量超过容量与负载因子的乘积时,即会触发扩容操作。
4.HashMap使用哈希函数将键映射到对应的数组下标上,实现快速查询。
5.如果哈希函数产生了哈希冲突,即多个键映射到同一个数组下标上,HashMap会使用链表将这些键值对串起来,以便查询时遍历链表查找。
6.在插入新的键值对时,HashMap会根据哈希函数计算出对应的数组下标,并将新的键值对插入到该位置的链表中。如果该位置的链表长度超过阈值(默认为8),则将这个链表转化为红黑树,以提高查询效率。
7.在查询、删除键值对时,HashMap根据哈希函数计算出对应的数组下标,并遍历该位置的链表或红黑树,查找对应的键值对。如果链表或红黑树中没有对应的键值对,则返回null。
总之,HashMap是一个高效的数据结构,能够快速地插入、查询、删除键值对。不过,对于高度散列的数据集,也可能导致哈希冲突的增加,进而导致查询效率下降。因此,在使用HashMap时,需要合理地设置容量和负载因子,以及注意键的哈希函数的设计。

9.请说一下ArrayList和LinkedList的区别

ArrayList和LinkedList是Java中常用的两种列表实现方式。它们的主要区别在于底层数据结构不同,ArrayList底层是动态数组,而LinkedList底层是双向链表。由于底层数据结构不同,它们在访问、插入、删除元素时的时间复杂度有所不同。在访问元素方面,ArrayList比LinkedList更快,因为ArrayList可以通过数组下标直接访问元素,而LinkedList需要通过遍历链表来查找元素;在插入和删除元素方面,LinkedList比ArrayList更快,因为LinkedList只需要修改节点的指针,而ArrayList需要移动数据。所以,如果需要经常访问元素,使用ArrayList更好;如果需要经常插入和删除元素,使用LinkedList更好。

10.SpringMVC有了解吗?

SpringMVC是基于Spring框架之上的MVC架构模式的Web应用程序开发框架。它提供了丰富的特性,如请求映射,视图解析,数据绑定和校验,异常处理等,使得开发人员能够高效、灵活、简单地开发Web应用程序。

11.SpringIOC和AOP有了解吗?

SpringIOC (Inversion of Control) 是一种通过控制反转来达到松耦合、可扩展和易测试的开发框架。它是一种依赖注入的方式,它可以把依赖的对象注入到相应的类中,从而解耦和简化了应用的开发。
AOP (Aspect-Oriented Programming) 是一种编程模式,它将编程逻辑分成多个模块(切面),每个模块负责不同的功能,可以在不修改原有代码的情况下,为应用增加新的功能或处理横切关注点的问题。 Spring AOP 基于动态代理实现切面,可以很好地支持面向切面的编程。

12.创建线程池的参数?

创建线程池的参数包括线程池的大小、核心线程数、最大线程数、空闲线程存活时间、工作队列类型、工作队列大小等。

13.MySQL的连接查询方式?

MySQL的连接查询方式有三种:
1.内连接(INNER JOIN):只返回符合条件的行。
2.左连接(LEFT JOIN):返回左侧表中的所有行和符合条件的右侧表中的行。
3.右连接(RIGHT JOIN):返回右侧表中的所有行和符合条件的左侧表中的行。

14.Left Join 、Right Join和Inner Join有什么区别?

Left Join、Right Join和Inner Join是SQL中常用的三种连接方式。
1.Inner Join:只返回两个表中匹配的行。如果两个表中有任何一方没有匹配的行则不显示。
2.Left Join:返回左表中所有的行,而右表中不符合条件的行则增加NULL值。如果右表中有任何一方没有匹配的行则也会显示。
3.Right Join:和Left Join相反,返回右表中所有的行,而左表中不符合条件的行则增加NULL值。如果左表中有任何一方没有匹配的行则也会显示。
所以,区别在于对于符合条件的行和不符合条件的行的处理方式不同。

二、美团一面凉经

1.TCP和UDP

TCP和UDP都是计算机网络传输协议。TCP是传输控制协议,UDP是用户数据报协议。 TCP建立连接并保证数据可靠传输,而UDP则是无连接的,不保证数据可靠传输。
TCP使用三次握手建立连接,并在传输过程中进行数据的校验和流量控制;UDP没有连接的概念,没有流量控制和重发机制,适用于一些实时性要求较高的应用,如视频流传输等。
总的来说,TCP适用于对数据传输可靠性要求高、需要双向通信的应用,而UDP适用于数据传输实时性要求高、可以容忍少量数据丢失的应用。

2.list和set

Java中的List和Set都是集合框架中的接口,它们的实现类都可以存储一组元素。其中,List接口提供了一种有序的集合,允许存储重复元素。而Set接口则提供了一种无序的集合,不允许存储重复元素。
具体来说,List可以通过索引来访问元素,而Set只能通过迭代器来访问元素。此外,List还提供了许多有序集合的特定操作,如获取子列表、插入、删除等。而Set则提供了判断集合相等、判断元素是否存在等操作。
在使用时,应根据实际需求选择合适的集合类型。如果需要保证集合中元素的顺序或者需要允许存储重复元素,应该选择List。如果需要保证元素的唯一性或者不关心顺序,应该选择Set。

3.数组和链表

数组和链表都是数据结构。数组是一种线性数据结构,用于在内存中存储一组相同类型的元素。数组中的元素是连续的,并且可以通过索引访问,索引通常从0开始。
链表也是一种线性数据结构,但它的元素是不连续的。相反,每个元素都包含指向下一个元素的指针。由于它们的灵活性,链表在插入和删除元素时比数组更有效。
区别:
1.存储方式:数组是按顺序存储数据,链表是按指针存储数据。
2.插入和删除操作:在数组中,如果要在中间插入或删除元素,则需要移动后续元素。链表中,只需要更改指针即可。这使得链表对于插入和删除操作更加高效。
3.访问元素:数组中访问元素非常快,因为可以通过索引直接计算出元素的地址。在链表中,必须按顺序遍历链表找到相应的元素。
4.空间使用:数组在创建时需要固定大小的空间,而链表可以动态分配内存并且不需要一开始指定大小。

4.MySQL底层实现

MySQL底层实现包括存储引擎、数据结构、算法等。其中存储引擎是MySQL的核心组件,主要负责数据的存储和管理。MySQL支持多种存储引擎,包括InnoDB、MyISAM、Memory等,每种存储引擎都有其特定的优缺点和适用场景。数据结构和算法也是MySQL底层实现的重要组成部分,它们直接影响MySQL的性能和稳定性。MySQL采用了B+树和哈希等数据结构,以及查询优化和索引优化等算法来提高数据库的效率。

5.哈希表底层实现(数组+链表)

哈希表底层实现通常是基于数组和链表结合使用的,即将元素存入数组中,当产生哈希冲突时,通过链表将冲突的元素串在一起形成链表,从而实现快速查找和插入的功能。哈希表的关键在于哈希函数的设计,它能够将任意长度的输入数据映射到固定长度的哈希值,从而保证快速查找。

6.什么情况下索引会失效?

索引会失效的情况有以下几种:
1.当查询条件中使用了函数或者表达式来做计算时,索引失效。
2.当查询条件中使用了大于、小于或者不等于的条件来查询字符串类型的字段时,由于字符串类型的比较是按照字母的顺序进行的,索引失效。
3.当查询条件中使用了 OR 连接多个条件时,如果其中一个条件不能使用索引的话,就会导致索引失效。
4.当查询条件中使用了 LIKE 操作符并且通配符在首字母位置时,例如 ‘%abc’,索引失效。
5.当查询条件中使用了 IS NULL 或者 IS NOT NULL 这样的条件时,由于 NULL 值不能使用索引,索引失效。 总之,只要查询条件中涉及到无法使用索引优化的操作,就可能会导致索引失效。

7.POST和GET安全性

POST和GET都是HTTP请求方法,但它们在安全性方面有所不同。
GET请求将请求信息附在URL后面,明文传输,易被拦截和篡改,因此不适合传输敏感信息。
POST请求将请求信息放在请求体中,不会被明文传输,更安全可靠,适合于传输敏感信息或大量数据。
总之,如果您想传输敏感信息或大量数据,应该使用POST请求来确保安全性。

8.什么情况下要用线程池

线程池用来处理多个任务的场景,通过重用已创建的线程降低线程创建和销毁的开销。当需要处理大量短时间的任务时,使用线程池可以减少线程的创建和销毁,提高性能,避免系统资源过度消耗。同时,线程池还可以限制并发线程的数量,避免线程资源被耗尽。一般情况下,线程池的使用是针对任务执行时间较短,但数量较多的情况。

9.线程池创建的关键信息

线程池的创建需要关注以下几个关键信息:
1.线程池中线程的数量:要根据任务类型和系统配置来设置合理的线程数,避免过多或过少的资源浪费。
2.线程池中任务队列的长度:要根据任务量和线程处理能力设置合适的队列长度,以避免任务过多时因为队列满导致的任务丢失。
3.线程池中线程池管理器的调度方式:根据实际需求可以选择不同的调度方式,如优先调度、平均调度等。
4.线程池中线程的状态:线程池需要监测线程的状态,及时发现并处理异常状态,避免因为线程意外关闭而导致程序崩溃。
5.线程池中任务的类型:根据实际需求和系统特点,可以选择适宜的任务类型,如异步任务、循环任务、定时任务等。
以上是线程池创建时需要关注的关键信息,通过合理的设置可以使线程池的运行更加稳定、高效。

10.介绍一下分布式

分布式系统是由多个独立的计算机组成的网络系统,这些计算机通过网络连接起来,相互协作完成任务。分布式系统具有以下特点:
1.分布性:系统中的各个节点分布在不同的物理位置上,通过网络连接起来。
2.并发性:系统中的各个节点可以同时执行多个任务。
3.协作性:系统中的各个节点相互协作完成任务。
4.通信性:节点之间通过网络通信交换数据。
5.容错性:系统可以通过备份和冗余机制,保证在出现故障时能够正常运行。
6.可扩展性:系统可以通过增加节点的方式,扩展其处理能力。

三、青颖飞帆 Java开发 面试

1.优化过sql语句吗

优化 SQL 语句的方法有以下几种:
1.确保使用正确的索引。可以使用 EXPLAIN 命令查看查询计划,找出性能瓶颈在哪里。
2.减少查询的结果集。可以使用 SELECT 只选择需要的列,或者使用 LIMIT 限制结果集的大小。
3.避免模糊查询。模糊查询会导致全表扫描,性能非常低下。可以使用索引或者全文搜索进行优化。
4.避免使用子查询。子查询会导致多次查询,性能非常低下。可以使用 JOIN 或者表连接进行优化。
5.将计算交给应用程序。一些计算可以在应用程序中完成,而不是在 SQL 语句中计算,可以减轻数据库的负担。
这些是常用的 SQL 优化方法,可以根据具体情况进行选择。

2.explain中的key字段所写的一定是它会用的吗 其他字段都是什么意思?

对于"explain"中的key字段,它所写的内容是需要被使用的。其他字段的意思如下:
1.model:指定使用的模型,缺省为通用模型。
2.version:指定使用的模型版本,缺省为最新版本。
3.topn:返回结果的条数,缺省为5。
4.mode:指定解释模式,缺省为常规解释。
5.kbid:指定知识库ID,缺省为通用知识库。
需要注意的是,除了key字段以外,其他字段都是可选的,根据具体的使用场景和需求进行设置。同时,在使用explain API时,用户需要提供有效的API Key,以保证认证和授权。希望以上信息能够帮助到您,如需进一步了解,可参考官方文档或咨询相关技术人员。

3.索引的机制

索引是用于快速定位、访问和检索数据的一种数据结构。在计算机领域中,常见的索引结构包括B树、Hash表、B+树等。不同的索引结构适用于不同的场景,例如B树适用于范围查询,Hash表适用于精确查询。

4.叶子节点一定是放的数据吗

不一定。在树形结构中,叶子节点一般是没有子节点的节点。它们可以放置数据,但也可以代表其他意义。例如,在文件系统的树形结构中,叶子节点可能代表文件,也可能代表空文件夹。

5.事务安全

事务安全是指在数据库中进行的事务操作具有ACID属性,即原子性、一致性、隔离性和持久性。原子性指事务要么全部执行,要么全部不执行;一致性指事务将数据库从一种有效状态转换为另一种有效状态;隔离性指多个事务同时执行时,每个事务都能够感知到其他事务的执行结果,但是不会受到其他事务的干扰;持久性指在事务完成后,对数据库的修改将会被永久保存。

6.@Transcational机制

@Transactional机制是一种处理事务的方式,它可以确保在需要修改多个数据源的情况下,所有数据源都成功更新或回滚,以保持数据的一致性和完整性。通常用于关系型数据库中。

7.事务与事务之间怎么保证隔离

在数据库中,通过事务隔离级别来保证事务之间的隔离。常用的事务隔离级别有读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。不同的隔离级别对事务之间的隔离程度有所不同,隔离级别越高,事务之间的隔离程度越高,但是同时也可能会影响性能。因此,需要根据具体情况来选择合适的隔离级别。

8.事务的特性

事务的特性有四个,它们分别是:原子性、一致性、隔离性和持久性。
其中,原子性指事务中所有操作要么全部完成,要么全部不完成;一致性指事务前后数据的状态保持一致;隔离性指多个事务并发执行时,每个事务都应该被隔离开来,互不干扰;持久性指事务一旦提交,对数据的修改就会永久保存到数据库中,即使系统发生故障也不会丢失。

9.事务隔离级别 默认的是什么

默认的事务隔离级别是 READ COMMITTED。

10.get和post区别

HTTP中的GET和POST都是HTTP请求方法,用于从服务器获取数据或向服务器提交数据。它们之间的主要区别在于:GET请求会向服务器请求特定的资源,而POST请求会向服务器提交数据。在GET请求中,所有请求数据都以查询字符串的形式附加到URL中,而在POST请求中,请求数据则包含在请求体中。此外,GET请求相对于POST请求更容易缓存、更容易被爬虫搜索引擎索引。

11.http是什么协议 https呢

HTTP指的是超文本传输协议,是一种用于传输超媒体文档的应用层协议。HTTPS指的是超文本传输安全协议,是在HTTP的基础上加入SSL/TLS协议进行加密通信的协议。

12.TCP过程中怎么识别对方

TCP通过IP地址和端口号识别对方。IP地址用于识别一台计算机,端口号用于识别该计算机上的进程或服务。在TCP连接建立时,客户端和服务器端都会指定一个端口号,彼此通过IP地址和端口号进行通信。通过这种方式,TCP可以同时支持多个应用程序在同一台计算机上进行通信,并确保每个连接都是唯一的。

13.介绍Java中用的集合类

在Java中,集合类是一组可变大小的对象,用于存储其他对象。主要集合类包括:
1.ArrayList:基于数组实现的可变大小数组,提供快速的访问和随机访问能力。
2.LinkedList:基于链表实现的集合类,可以方便地在集合中添加和删除元素。
3.HashSet:基于哈希表实现的集合类,没有顺序,不允许重复元素。
4.TreeSet:基于红黑树实现的集合类,按照元素的自然顺序排序,并且不允许重复元素。
5.LinkedHashMap:基于哈希表和链表实现的有序集合类,可以按照加入元素的顺序访问集合中的元素。

四、普元信息Java实习生面经

1.==与equals的区别

在Java中,"=="是比较两个对象的引用是否相等,也就是是否指向了同一个内存地址;而"equals"是比较两个对象内容是否相等,也就是是否具有相同的属性值。如果没有在类中重写equals方法,则默认比较的仍然是两个对象的引用是否相等。

2.数组与链表的区别

数组和链表都是数据结构,它们的主要区别在于数据的组织方式。数组是一组连续的内存单元,用于存储相同类型的数据。它们可以通过索引来访问,因此数组的访问速度很快。但是,数组的大小是固定的,一旦声明后,不能再改变大小。而链表则是一组非连续的内存单元,每个节点存储数据和指向下一个节点的指针。因此,访问链表中的元素需要遍历整个链表,速度比数组慢一些。但是,链表的大小可以动态调整,可以在运行时添加、删除节点。总的来说,数组适合于需要快速访问数据和大小固定的情况,而链表适合于需要动态调整大小和插入或删除元素的情况。

3.jvm的垃圾回收算法

JVM的垃圾回收算法有很多种,其中比较常见的有标记清除算法、复制算法、标记整理算法以及分代收集算法。每种算法都有其适用的场景和优缺点,具体的选择也要根据实际情况进行权衡和取舍。

4.string A=abc ,String B=adc ; AB是否相等

AB不相等,因为A和B的第二个字符不同。

5.mysql事务隔离级别

MySQL事务隔离级别包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。不同的隔离级别具有不同的并发控制机制,可以避免数据不一致和脏数据等问题。但是,更高的隔离级别会带来更严重的性能问题。

6.mysql索引

MySQL索引是一种数据结构,用于提高数据库查询效率。它可以按照一定的规则对表中的数据进行排序,并可以快速地查询特定的数据,从而加快数据库的查询速度。在MySQL中,常用的索引类型包括B-Tree索引、全文索引和哈希索引等。

7.redis为什么快

Redis 之所以快速,是因为它使用了内存存储和异步 I/O 的特性。Redis 将热点数据存储在内存中,而不是磁盘上,这极大地加快了数据读写速度。当然,这也意味着 Redis 支持的数据规模是有限的。此外,Redis 还利用了异步 I/O 实现了高效的单线程处理,避免了多线程带来的线程切换开销。

8.redis的基本数据类型

常见的Redis基本数据类型有五种:字符串类型(string)、哈希类型(hash)、列表类型(list)、集合类型(set)和有序集合类型(sorted set)。这五种数据类型在Redis中被广泛使用,可以满足各种不同的数据处理需求。

9.redis的持久化

Redis支持两种持久化方式:RDB和AOF。
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。可以手动执行SAVE命令,也可以设置自动保存策略,如SAVE 900 1表示在900秒之内如果有至少1个键值被改变就自动执行一次SAVE操作。RDB的优点是文件较小,适合备份,恢复速度较快;缺点是需要定期执行SAVE操作,会有数据丢失的风险。
AOF持久化是指将每个写操作都写入日志文件,写入顺序与执行顺序一致。可以设置同步方式,如每秒同步一次(sync每秒一次),每次写操作都同步(always),或者使用无同步(no)方式。AOF优点是保证数据的完整性,可重放所有操作;缺点是文件较大,不适合备份,恢复速度较慢。

10.redis的淘汰机制

Redis的淘汰机制指的是在内存空间不足时,Redis会根据一定的算法淘汰一些旧的,不使用的key-value对,腾出空间给新的数据使用。Redis目前提供了五种淘汰策略,分别为:volatile-lru(从已设置过期时间的数据集中挑选最近最少使用的数据淘汰)、volatile-ttl(从已设置过期时间的数据集中挑选将要过期的数据淘汰)、volatile-random(从已设置过期时间的数据集中任意选择数据淘汰)、allkeys-lru(从数据集中挑选最近最少使用的数据淘汰)、allkeys-random(从数据集中任意选择数据淘汰)。

11.Spring IOC 和AOP

Spring IOC(控制反转)是一种设计模式,它允许将对象之间的依赖关系委托给容器来管理。在Spring中,容器会负责实例化、初始化和连接对象,而不是由对象自己来完成。AOP(面向切面编程)是一种编程范式,它可以在不修改原始代码的情况下,通过将公共行为(如日志记录、性能监控等)从程序逻辑中分离出来,从而使代码更加模块化和易于扩展。在Spring中,可以使用AOP来增强对象的行为,例如为方法添加事务管理或安全检查。

12.Mybatis 中受用#{} 与 ${}的区别

#{} 是预编译处理,${} 是字符串替换。
Mybatis 在处理 #{} 时,会将 sql 中的 #{} 替换为?号,调用 PreparedStatement 的 set 方法来赋值;
Mybatis 在处理 ${} 时,就是把 ${} 替换成变量的值。
使用 #{} 可以有效的防止 SQL 注入,提高系统安全性

13.linux常用命令

一些常用的Linux命令有:ls、cd、pwd、mkdir、rm、cp、mv、touch、cat、grep、find、ps、top、ifconfig等。

14.linux怎么查找一个已知进程的进程号

查找一个已知进程的进程号可以使用命令行工具ps -ef | grep 进程名,其中进程名可以是进程的可执行文件名或进程的任何名称,通过该命令可以查找到匹配的进程并输出该进程的详细信息,其中包括该进程的PID,即进程号。另外,如果您知道该进程的PID,也可以使用命令kill PID来杀掉该进程。

五、美团到店广告Java 一面

1.整体设计是怎样的?

2.底层的数据表?说一说其中有哪些外键?

3.说说你对Mybatis的理解?为什么能够帮助我们去做这种解耦?

Mybatis是一款开源的持久层框架,它支持自定义SQL、存储过程和高级映射机制,可以简化开发人员在数据访问层的工作。Mybatis通过XML配置文件和Java注解的方式来实现与数据库的交互,从而将SQL语句与Java代码进行了解耦。
Mybatis的主要优势在于它使得Java开发人员可以通过简单的配置文件和注解来进行数据库访问,而不需要编写大量的JDBC代码。另外,Mybatis的灵活性也让它成为了许多大型Web应用的首选持久层框架。
通过使用Mybatis,我们可以将业务逻辑和底层数据访问逻辑分开,从而实现系统的解耦。这意味着我们可以根据不同的需求(例如,不同的数据库或者数据访问方式)来更改数据访问代码,而不需要修改应用程序的代码。这不仅能提高代码的灵活性和可维护性,也能减少应用程序开发的工作量。

4.这个项目你有哪些收获?

5.Kafka

Kafka是一个分布式流处理平台,被广泛应用于海量实时数据处理中。它基于发布/订阅机制,支持高可用和容错,并能够在处理大量数据时保持高性能和低延迟。Kafka通常用于数据收集、日志聚合、流处理和实时分析等领域。

6.盘梯性

盘梯性是指通过一系列的变换,使得初始问题可以被转化为一个简单的形式,从而便于解决。这个概念经常出现在数学和计算机科学中。具体来说,在优化问题中,盘梯性是指一种特定形式的约束条件,可以通过变换将其简化为轮廓消失约束。而在矩阵论中,盘梯性则是一种与特定矩阵的分解有关的性质。

7.ack机制

ACK机制是一种通信协议中的确认机制,用于在数据传输过程中确认接收到的数据包是否正确。在收到数据包后,接收方发送一个ACK确认信号,告诉发送方数据已经被正确接收。ACK机制可以确保数据的可靠性和完整性,在网络通信中应用广泛。

8.pull和push两种的优缺点

Pull 和 Push 是两种常见的数据传输方式。Pull 是由接收方主动从发送方获取数据,而 Push 则是发送方主动向接收方传输数据。
Pull 的优点是可以控制数据的获取频率,接收方可以根据自己的需要决定何时获取数据,避免了不必要的传输,同时也可以降低发送方的压力。缺点是当数据需要及时更新时,需要频繁地获取数据,可能会导致网络拥堵或增加延迟。
Push 的优点是可以实时传输数据,及时更新信息,提高实时性。同时也可以减少接收方的等待时间,降低延迟,提高数据传输效率。缺点是数据传输可能没有经过接收方的授权,容易受到网络攻击和数据泄漏的风险。
综上所述,两种传输方式具有各自的优缺点,应根据具体情况选择合适的方式。

9.Redis数据结构

Redis是一个基于内存的开源Key-Value存储系统。它支持多种数据结构,包括字符串(string),哈希表(hash),列表(list),集合(set),有序集合(sorted set)等。其中,字符串类型是最常用的数据结构之一,它支持字符串的存储和操作,比如存储和获取字符串、计数器、位图等。哈希表类型可以存储多个键值对,类似于关联数组,可以快速地进行读取和修改操作。列表类型可以存储一组有序的元素,支持从头部或尾部进行插入和弹出元素等操作。集合类型可以存储多个元素,支持交集、并集、差集等操作。有序集合类型类似于集合类型,但多了一个权重值,可以按照权重值进行排序。

10.Redis中的String底层

Redis中的String底层数据结构是简单动态字符串(SDS)。这种结构可以自动扩展容量,同时支持高效的追加、删除、插入等操作。此外,SDS还支持O(1)复杂度的字符串长度计算、常数级别的时间复杂度的字符串切割等高性能操作,能够满足Redis的高吞吐量、低延迟的要求。

11.volatile

volatile 关键字是用于编写并发程序的时候使用的。在多线程环境下,某些变量可能被多个线程同时访问和修改,这就会导致对这些变量的可见性问题。
当一个变量被声明为 volatile 类型时,编译器会把对这个变量的读写操作都直接映射到内存上,这样就能确保多个线程之间对这个变量的可见性。
不过,使用 volatile 并不能确保对变量的操作的原子性,也就是说,对 volatile 变量的写操作可能会被编译器优化,导致多个线程对同一个变量的修改产生冲突。因此,如果需要对变量的操作具有原子性,可以使用 synchronized 或者 Lock 等同步机制来保证。

12. synchronized和lock

synchronized 和 Lock 都是 Java 中用于实现线程同步的机制。它们之间的主要区别在于 sychronized 是 Java 语言原生层面的关键字,而 Lock 是 Java API 中的一个类。
synchronized 关键字是隐式的,它的加锁和解锁操作是由 JVM 自动完成的,而 Lock 对象则需要显式的进行加锁和解锁操作。
另外,Lock 对象可以支持多个 Condition(条件),而 synchronized 关键字只能支持一个相关条件。此外,Lock 对象还提供了更加灵活的加锁和解锁机制,可以更好地满足并发编程的需求。

13.jvm内存结构

JVM内存结构主要分为以下几个部分:
程序计数器:用于存储当前线程执行的字节码指令地址。
Java虚拟机栈:每个线程都有自己的虚拟机栈,用于存储局部变量、方法出口等信息。
堆:用于存储对象实例和数组,是Java程序的动态内存区域。
方法区:用于存储类的信息、常量、静态变量等,也称为永久代,但在Java 8之后已经逐渐被元空间所代替。
本地方法栈:用于支持本地方法(native方法)的执行。
这些部分组成了JVM内存结构,它们在Java程序的运行过程中扮演着不同的角色。

14. OOM

OOM全称为Out Of Memory,是Java中常见的一种运行时错误,表示内存不足。当JVM无法分配更多的内存空间时,就会抛出OOM错误。通常情况下,OOM错误是由于程序中存在内存泄漏、内存溢出等问题引起的。如果不解决OOM问题,会导致应用程序崩溃,影响用户体验和应用系统稳定性。

15.内存泄漏 内存溢出

内存溢出指的是当程序运行时需要分配的内存超过了系统可用的内存时,导致程序崩溃或无法继续运行。而内存泄漏指的是程序中已经不再需要的内存没有被及时地释放,导致这些内存无法被再次使用,最终导致系统的性能降低或崩溃。区别在于内存泄漏是因为没有正确释放内存导致的问题,而内存溢出是因为需要的内存超过了系统的可用内存。

16.内存泄漏和内存溢出有什么好的解决方法?

对于内存泄漏,一般通过定期执行垃圾回收器(GC)来清理不再被引用的对象,或者通过程序设计避免出现内存泄漏的情况。对于内存溢出,可以通过增加JVM的堆内存、优化程序代码等方式来解决。此外,还可以使用一些工具来监控和分析程序的内存使用情况,找出内存泄漏和内存溢出的具体原因。

17.如何确认垃圾回收

在 JVM 中,垃圾回收器通过两种方式来确定哪些对象可以被回收。第一种是引用计数法,即每个对象都有一个计数器,当有其他对象引用该对象时,计数器加一,引用该对象的对象被销毁时,计数器减一,当计数器的值为零时,对象被标记为垃圾,等待回收。但这种方法存在循环引用的问题,因此 JVM 采用的是第二种方法,即可达性分析法。可达性分析法是从一组称为 GC 根的对象开始,搜索所有与之直接或间接相连的对象,任何未被搜索到的对象都被标记为垃圾,等待回收。

18.哪些可以作为GCRoots呢

GCRoots 是指被视为“根”的对象,是在垃圾回收中保持活动对象的关键点。以下对象可以作为 GCRoots:
1.虚拟机栈中的对象
2.方法区中类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中 JNI(Java Native Interface)引用的对象
5.虚拟机内部引用的基本数据类型对象,如系统类加载器等。

19.在代码中引入一个自定义的类要怎么做呢?

要在Java代码中引入一个自定义的类,需要使用Java的import语句。具体操作步骤如下:
1.编写自定义的类,并将其保存在一个java文件中,例如MyClass.java;
2.在另外一个Java文件中引入MyClass类,可以这样写import语句:import 包名.MyClass;
3.在需要使用MyClass类的地方直接使用MyClass即可。
需要注意的是,如果导入的类和当前类不在同一个包中,就要加上包名。如果不加包名,Java会默认在同一包中查找该类。如果找不到,就会报错。如果不确定类的完整路径,可以使用Java的自动导入功能,即在需要使用该类的地方输入该类的简化名称,然后按下CTRL+SHIFT+O快捷键,Java会自动导入相关类。

20.非阻塞IO

非阻塞IO(Non-blocking IO)是指在读写数据的过程中,不会阻塞当前线程,允许程序在等待数据到达的同时继续执行其他任务。相比阻塞IO,非阻塞IO能够提高程序的并发性和响应速度,适用于高并发、高吞吐量的场景。非阻塞IO通常使用异步IO或多路复用技术来实现。

21. 序列化和反序列化

序列化是将对象转换成可存储或可传输的格式,例如将对象转换成二进制或JSON格式。反序列化则是将序列化后的数据重新转换成对象的过程。序列化和反序列化可以用于数据存储和网络通信等应用场景。

22. static变量会参与序列化吗

对于静态变量,在Java中不会参与序列化过程。序列化只会包括实例变量,它是根据对象的实例信息进行序列化的。静态变量属于类,所有对象共享,它们保存在JVM的方法区中,不隶属于任何一个实例对象。因此,静态变量不会参与对象的序列化和反序列化过程。

23.如果在服务端修改了类,增删字段,那么对反序列化有影响吗

如果在服务端修改了类,增删字段,那么对于之前已经序列化的对象进行反序列化时会出现错误。因为反序列化时需要使用与序列化时相同的类定义,如果类定义已经发生了变化,那么就会出现无法读取某些字段的情况,从而导致反序列化失败。为了避免这种情况,可以使用一些类似于版本控制的方法来解决,比如序列化时添加版本号,在反序列化时根据版本号来适配不同的类定义。

24.HashMap的设计

HashMap是Java中一个非常常用的数据结构,它是一种哈希表实现的Map接口,它提供了键值对的映射关系,并且支持常数时间的插入、删除和查找操作。在一个HashMap中,每一个键值对被存储在一个桶中,而每个桶是由一个链表或者红黑树实现的。当插入或者查找一个键值对时,HashMap会首先计算出对应的哈希值,然后根据哈希值找到对应的桶,从而提高插入、查找和删除操作的效率。

25. HashMap线程安全吗?体现在哪里?

HashMap在多线程环境下是不安全的,因为多个线程同时修改HashMap时可能会导致数据不一致的问题。具体体现在并发修改HashMap时可能会导致元素丢失或覆盖,或者导致死循环等问题。为了实现线程安全,可以使用ConcurrentHashMap或者在使用HashMap时进行同步处理(比如使用Collections.synchronizedMap方法)。

26.concurrentHashMap

ConcurrentHashMap是Java集合框架中的一个线程安全的哈希表实现。它支持高并发的读写操作,采用了分段锁的机制,同时保证了并发性和数据的一致性。相比于Hashtable和synchronizedMap等线程安全的哈希表实现,ConcurrentHashMap可以同时进行读取和写入操作而不需要加锁整个表,因此并发性能更高。

27.在jdk1.8中cas+synchronized与segment相比的好处是什么?

在 JDK1.8 中,使用 CAS(Compare And Swap)和 synchronized(锁)机制实现并发同步。相比于 JDK1.7 中使用的 Segment 机制,CAS 和 synchronized 在性能和并发度上都有所提高。
具体来说,CAS 操作相当于一个乐观锁,当进行操作时,先比较当前内存值是否和预期值相等,如果相等则进行操作,否则不进行操作。这避免了竞争和阻塞,提高了并发度。而 synchronized 在加锁时会阻塞其他的线程,降低了并发度。此外,CAS 操作在执行时也更加轻量级,性能更优。
另外,JDK1.8 中的 ConcurrentHashMap 通过分段锁,从而减少了对全局锁的依赖,也提高了并发度和性能。而在 JDK1.7 中的 ConcurrentHashMap 使用的是 Segment 机制,需要对每个 Segment 加锁,带来了一定的性能损失。

28. 线程创建

常见的线程创建方式有以下几种:
1.继承Thread类,重写run()方法来实现线程
2.实现Runnable接口,重写run()方法来实现线程
3.实现Callable接口,通过FutureTask包装器来包装Callable的返回结果
4.使用线程池创建线程
这些都是 Java 中常见的线程创建方式。

29.线程池参数 创建线程的流程

关于线程池参数,一般包括核心线程数、最大线程数、队列类型、队列长度、线程存活时间等。核心线程数是线程池中最少的线程数,也是保证线程池最少有几个线程在工作的参数;最大线程数是线程池中最多能容纳的线程数;队列类型可以分为有界队列和无界队列,分别对应的是有界缓存池和无界缓存池;队列长度代表着线程池队列能够缓存的任务数量;线程存活时间是当线程池中的线程数量大于核心线程数时,这些多余的空闲线程能够存活的最长时间。
至于创建线程的流程,基本上分为以下几步:
1.创建线程池
2.当需要执行任务时,向线程池提交任务
3.线程池调用线程工厂创建新的线程
4.新线程从任务队列中取出任务并执行
5.执行完任务后,线程重新回到线程池中被复用
以上就是线程池参数及创建线程的流程的基本介绍。希望对您有所帮助。

30.线程池源码看过吗?

线程池是一种可以优化线程使用的方式,其实现思路就是在系统启动时创建一定数量的线程,并将它们放置在线程池中,等待工作的到来。当需要进行任务处理的时候,就可以从线程池中取出一个空闲的线程来完成任务,可以避免频繁创建和销毁线程所产生的开销,因此在并发编程中得到了广泛的应用。
Java提供了Executor框架,实现线程池的功能。其中,ThreadPoolExecutor类是Java内置的线程池实现类,具有灵活性和优秀的封装性,可以满足大多数并发编程需求。使用ThreadPoolExecutor时需要注意一些参数:
corePoolSize:线程池核心线程数;
maximumPoolSize:线程池最大线程数;
keepAliveTime:线程存活时间;
workQueue:任务队列;
threadFactory:线程生产工厂类;
handler:线程异常处理类。

31.sleep 和wait的区别

sleep和wait都可以让程序等待一段时间,不过它们的用途是有所不同的。sleep是让线程或进程停止执行一段指定的时间,而wait则是让线程或进程等待某个特定的事件发生。wait通常用在多线程或多进程的情况下,当一个线程或进程需要等待其他线程或进程完成一定的工作后再继续执行时,就可以使用wait。在wait被唤醒之前,它会一直阻塞。而sleep则是一个单独的操作,它不需要等待任何特定的事件发生,只需要暂停一段时间即可。

32.start和run

start()是启动一个线程,而run()是线程中的方法。也就是说,调用start()方法会新建一个线程并执行线程的任务,而使用run()方法仅仅是执行该方法的代码块,不会新建线程。

33.MySQL日志有哪些

MySQL日志一般分为以下几类:
1.错误日志(error log):记录MySQL Server启动、运行过程中的错误信息,例如某个操作失败、某个文件无法读取等。
2.查询日志(query log):记录MySQL Server收到的所有查询请求,包括查询语句、连接信息、查询时间等。
3.慢查询日志(slow query log):记录查询响应时间超过设定时间阈值的查询语句、连接信息、查询时间等。
4.二进制日志(binary log):记录MySQL Server的数据更改操作,例如insert、update、delete等,以便进行数据恢复和复制等操作。
5.撤销日志(undo log):用于事务的回滚、MVCC的实现等。
6.重做日志(redo log):用于事务的提交、崩溃恢复等。
以上是MySQL日志的主要种类,不同的日志有不同的作用和使用场景。

34.undolog和redolog的作用是什么

undolog和redolog是数据库日志文件,用于记录操作数据的过程和结果。
undo log(撤销日志)记录的是事务执行前的数据状态和相关操作,以便在撤销操作时将数据恢复到事务执行之前的状态。
redo log(重做日志)记录的是事务执行过程中所进行的修改操作,以便在重启数据库后将数据恢复到事务执行后的状态。
简单来说,undolog记录的是“回退”操作,而redolog记录的则是“前进”操作;两种日志文件的作用是为了保证数据的一致性、可靠性和安全性。

35.MVCC用于解决什么问题的?

MVCC(Multi-Version Concurrency Control)用于解决并发控制问题。它允许多个事务能够同时访问同一数据,而不会相互干扰或产生不一致的结果。在MVCC中,每个事务可以看到数据库中的一个历史版本,这个历史版本会与事务的隔离级别进行比较,以确保每个事务都能看到它应该看到的数据。

36.索引的作用

索引的作用是在大型数据集中,通过创建一个快速的索引结构,可以提高数据的检索速度和准确性。索引可以帮助我们快速地定位到特定的数据记录。在数据库中,通过索引可以更快地查询数据,也可以加速排序操作和提高查询结果的准确性。在搜索引擎中,索引可以帮助我们快速地搜索到相关的信息。

37. 时间复杂度?

在Java语言中,时间复杂度常用的有O(1)、O(log n)、O(n)、O(n log n)、O(n²)等,表示程序执行所需要的时间与数据规模之间的关系。其中,O(1)表示执行时间与数据规模无关,即为常数级别的时间复杂度;O(log n)表示执行时间随着数据规模的增加而增加,但增加速度逐渐减慢;O(n)表示执行时间与数据规模成线性关系;O(n log n)表示执行时间随着数据规模的增加而增加,但增加速度比O(n)慢;O(n²)表示执行时间与数据规模成平方关系,执行时间增长非常快。

六、wind万得Java实习

1.Java语言聊聊和其他语言区别

Java语言与其他语言的主要区别在于其跨平台性和自动内存管理机制。Java语言可以在不同的操作系统和硬件上运行,而不需要修改代码,这是因为Java源代码被编译成可移植的字节码,然后在Java虚拟机(JVM)上执行。 另外,Java还具有自动内存管理机制,这意味着程序员无需手动分配和释放内存,因为Java虚拟机会自动管理内存分配和释放。其他语言,如C ++,需要手动进行内存管理,这可能会导致内存泄漏和其他问题。 此外,Java语言还具有面向对象编程的特性,提供了许多面向对象的概念和工具,如类、对象、封装、继承和多态。这使得Java语言易于理解和使用,并且有助于提高代码的可读性和重用性。

2.面向对象三大特性 各自理解

三大特性是封装、继承和多态。封装指的是将数据和方法组合成一个有机的整体,对外隐藏实现的细节,只向外界提供访问接口。继承指的是从已有的类派生出新的类,新类继承了基类的属性和方法,可以覆盖父类中的方法并添加新的方法和属性。多态指的是多种形态,同一种行为在不同的对象中有不同的表现形式,允许不同的子类对象对同一方法作出不同的响应。

3.String、StringBuffer、StringBuilder 区别

String、StringBuffer和StringBuilder都是Java中表示字符串的类。它们的区别主要在于它们的可变性和线程安全性。
String是不可变的类,一旦创建它的值就无法改变。当需要对String进行拼接操作时,每次操作都会创建一个新的String对象,非常浪费资源。
StringBuffer和StringBuilder是可变的类,他们都提供了append()方法来进行字符串拼接。不同的是,StringBuffer是线程安全的,而StringBuilder则是非线程安全的。
因此,如果需要在多线程环境下进行字符串拼接,应该选择StringBuffer。而在单线程环境下,如果字符串拼接操作较频繁,应该选择StringBuilder。

4.string 我想要加几个字符 咋办

你可以使用字符串的拼接操作,如将想要添加的字符与原字符串拼接起来即可,例如:

string str = "Hello";
str += " World";
cout << str;  // 输出:Hello World

如果你想在特定位置添加字符,可以使用字符串的 insert 方法,如:

string str = "Hello";
str.insert(5, "world");  // 在第 5 个字符后面插入 "world"
cout << str;  // 输出:Hello world

5.MySQL 成绩表查成绩 每人一到三门课

如果您想要查询每个人的一到三门课的成绩,您可以使用如下的 MySQL 查询语句:

SELECT name, course1, course2, course3 FROM score;

其中,name 表示学生的姓名,course1、course2 和 course3 分别表示三门课的成绩。
如果您只想要查询某个学生的成绩,可以使用如下的语句:

SELECT name, course1, course2, course3 FROM score WHERE name='张三';

其中,name=‘张三’ 表示查询姓名为张三的学生的成绩。

6.锁听过吗 干啥用的

Java中的锁用于实现线程同步和互斥访问共享资源。多个线程可以同时访问一个共享资源,并且锁能够确保在任意时刻,只有一个线程可以访问该共享资源,从而避免了多个线程同时修改一个变量或对象导致的数据不一致性和并发问题。Java中的锁包括synchronized关键字和Lock对象,它们可以实现不同的锁定机制和线程同步。

7.类锁和实例锁区别

类锁和实例锁的区别在于锁住的对象不同。类锁是锁住类的class对象,而实例锁是锁住实例对象。一个类只有一个class对象,而可以有多个实例对象。当一个线程获取了类锁,其他线程便不能同时获取该类的锁,直到该线程释放锁为止;而当一个线程获取了某个实例对象的锁时,其他线程还可以获取该类其他实例对象的锁。因此,类锁和实例锁的范围和对象都不相同。

8.Redis 数据类型

Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等。每种数据类型都有自己的特点和用途。例如,字符串可以保存任意格式的数据,哈希可以表示对象的属性和属性值,列表和集合可以用来保存多个值,有序集合可以按照分数排序保存一组元素等。这些数据类型都可以通过Redis命令进行操作和管理。

9.最近在看啥基础 :Redis

10.Redis 消息队列咋实现

Redis 消息队列可以通过 Redis 的 List 数据结构来实现。具体步骤如下:
1.将消息添加到一个 List 中,可以使用 Redis 的 LPUSH / RPUSH 命令。
2.消费者使用 RPOP / BLPOP 命令从 List 中读取消息,并进行处理。
3.可以使用 Redis 的 BRPOPLPUSH 命令将消息从一个 List 中移动到另一个 List 中,同时防止多个消费者重复处理同一个消息。
此外,Redis 还提供了一些高级特性,如批量读取、阻塞读取、监听多个消息队列等。这些特性可以大大提高消息队列的性能和可靠性。

11.Redis 持久化 咋实现

Redis 提供了两种持久化方式:RDB 持久化和 AOF 持久化。
RDB 持久化可以在指定的时间间隔内将内存中的数据集快照写入磁盘,对于数据恢复方面的需求来说,RDB 持久化是比较适合的。而 AOF 持久化则可以将 Redis 执行的所有写命令都写入一个日志文件中,当服务器重启时可以通过重新执行日志中的命令来恢复原始数据。相较于 RDB,AOF 的数据完整性更好,但同时会增加硬盘的 I/O 开销。
通过 Redis 的配置文件,可以设置 RDB 和 AOF 持久化的参数,来满足各种场景下的需要。

12.一万个文件乱序在文件中,找到1-10号文件怎么做

您可以使用快速排序算法对这些文件进行排序,然后找到1-10号文件即可。步骤如下:
1.选取一个基准数,比如选第一个数为基准数。
2.将所有比基准数小的数放在它前面,比基准数大的数放在它后面。这个过程也叫做分区操作(partition)。
3.递归地将基准数左边的数和右边的数分别进行排序。
4.当只有一个数或者没有数需要排序时,排序完成。
5.找到排好序的第1-10号文件即可。
需要注意的是,在排序时要使用时间复杂度为O(nlogn)的排序算法,如快速排序、归并排序等。

七、焦点科技 后端实习(OC)

1.开头经典自我介绍

2.介绍项目(具体问了其中的redis项目,负责哪些功能,利用什么技术实现)

3.项目中遇到的难点

4.登录功能怎么实现的

登录功能的实现需要涉及到前端页面、后台接口以及数据库的设计。以下是一个基本的登录功能实现步骤:
1.前端页面:设计登录页面,包括用户名和密码的输入框,以及登录按钮。
2.后台接口:设计一个处理登录请求的后台接口,接收前端传递的用户名和密码参数。
3.数据库设计:设计一个用户表,其中包含用户名和密码两个字段,并将用户信息存储到数据库中。
登录功能的实现流程如下:
1.用户在前端页面输入用户名和密码,并点击登录按钮。
2.前端向后台发送登录请求,将用户名和密码参数传递给后台接口。
3.后台接口接收到请求后,从数据库中查询用户信息,检查用户名和密码是否匹配。
4.如果用户名和密码匹配,则生成一个唯一的登录凭证(如token),并将该凭证存储到数据库中,并将该凭证返回给前端。
5.前端接收到登录凭证后,将该凭证存储到本地(如cookie或localStorage)中,并将用户重定向到主页面。
6.在用户访问需要登录权限的页面时,前端将登录凭证携带到后台接口,并进行验证。
7.后台接口接收到请求后,从数据库中查询该登录凭证是否有效,如果有效则返回请求结果,否则返回登录失效提示。
需要注意的是,登录功能的实现还需要考虑安全性问题,如密码加密存储、防止SQL注入、防止跨站攻击等。

5.数据库怎么实现的

6.有没有写过sql

7.如果有两张表,他们直接有关联关系,具体怎么设计

通常情况下,我们可以通过为表之间的关系创建外键来实现表之间的关联关系。具体来说,我们可以在一个表中创建一个指向另一个表的外键,这样就能够在两个表之间建立关联。在创建外键时,我们需要考虑以下几个因素:
外键所指向的表和列:我们需要指定外键指向的目标表和目标列,这样才能建立起正确的关联关系。
外键是否允许为空:如果我们允许外键为空,那么意味着该表的记录可能与另一个表中的记录没有任何关联。否则,我们必须确保所有记录之间都有正确的关联关系。
外键的级联删除行为:当我们从目标表中删除一条记录时,如果存在其他表中指向该记录的外键,我们需要考虑对这些记录的处理方式。一般来说,我们可以指定级联删除行为,这样就可以自动删除与目标记录相关的所有外键记录。
总之,通过正确定义外键,我们可以轻松地实现两个表之间的关联关系,并保证数据的完整性和一致性。

八、小厂面试

1.Java几大特性 展开说说

Java有以下几大特性:
1.简单易学:Java语言相对于其他编程语言来说比较简单易学,其语法与C++等其他语言相比简化了很多。
2.面向对象:Java是一种面向对象的编程语言,类、继承、封装、多态等面向对象的特性都得到了很好的支持。
3.平台无关性:Java程序可以在不同的操作系统上运行,而不需要进行任何修改。这一特性主要是由于Java虚拟机(JVM)的存在。
4.安全性:Java的安全性能非常高,主要是因为JVM可以对Java代码进行安全检查并提供执行环境的安全性保障。
5.多线程:Java支持多线程编程,可以充分利用多核处理器的性能,提高程序的效率。
6.高性能:Java语言在编译和执行效率上都和其他编程语言相差不大,且有很多性能优化的工具和框架。
7.开源社区:Java拥有一个非常庞大的开源社区,有很多优秀的开源库、框架和工具。

2. 说一下集合,具体实现都说一下 ?为什么要用锁

Java中常见的集合包括List、Set、Map三种类型。它们的具体实现分别为ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap、TreeMap。
Java中的锁用于实现线程同步和互斥访问共享资源。多个线程可以同时访问一个共享资源,并且锁能够确保在任意时刻,只有一个线程可以访问该共享资源,从而避免了多个线程同时修改一个变量或对象导致的数据不一致性和并发问题。Java中的锁包括synchronized关键字和Lock对象,它们可以实现不同的锁定机制和线程同步。

3.为什么使用多线程

多线程是指在一个程序中可以同时运行多个线程,每个线程可以独立执行不同的任务。它的作用是可以提高程序的执行效率和并发性,使程序更加高效地利用计算机的资源。多线程可以使复杂的程序更加简单、可维护和可扩展,同时可以使用户界面更加流畅,并且可以避免长时间的阻塞。

4.线程的实现方式

Java中线程的实现方式包括继承Thread类、实现Runnable接口、实现Callable接口、使用线程池等。

5.Java提供的线程池说一下

Java提供了以下线程池:
1.FixedThreadPool:该线程池包含固定数量的线程,由于线程数固定,因此任务可能会在队列中等待执行。
2.CachedThreadPool:该线程池包含可缓存的线程,如果线程数超过了需求,那么多余的线程将会被回收,这个线程池适合处理大量的短时间任务。
3.ScheduledThreadPool:该线程池包含固定数量的线程,可以定时执行任务,适合需要定时执行任务的应用。
4.SingleThreadPool:该线程池包含只有一个线程的线程池,适合需要保持任务按顺序执行的应用。

6.说一下连接查询有什么特点

连接查询的特点是可以将来自多个表的数据进行关联,查询出符合条件的结果。在连接查询中,通常使用join操作符来将两个或多个表进行关联,然后通过指定查询条件来过滤结果集。连接查询可以更加灵活地操作数据,可以在不同的表中查询出相关联的数据,扩展了数据查询的范围和灵活性。

7.出了一个简单的连表SQL

8. jdbc用过吗 ? jdbc有哪些重要参数

JDBC(Java Database Connectivity)是Java语言编程中用于连接和操作关系型数据库的标准API。它允许Java应用程序通过一个标准的Java API来访问关系型数据库。
JDBC的重要参数包括:
1.URL(Uniform Resource Locator):指定数据库的位置。
2.Driver:数据库的驱动程序,用于连接不同的数据库。
3.User Name:使用数据库的用户名。
4.Password:使用数据库的用户密码。
5.Connection:连接对象,允许Java应用程序与数据库进行交互。
6.Statement:封装并执行SQL语句的对象。
7.ResultSet:执行查询后返回的结果集对象。

9.mybatis有什么特点?为什么要使用它呢?

MyBatis是一种优秀的持久化框架,具有以下特点:
1.简单易用:MyBatis的API简单易懂,使用起来非常方便。
2.灵活性强:MyBatis不会对我们的应用程序架构造成影响,因为它完全是基于Java POJO对象的,使得我们可以自由地编写SQL语句和映射标签。
3.可以自定义SQL:我们可以写自定义SQL语句和存储过程,这样可以灵活适配应用程序。
4.提供多种映射标签:MyBatis提供了很多种标签,可以很方便地映射数据库表和Java对象。
5.提供一级缓存和二级缓存:MyBatis提供一级缓存和二级缓存,可以有效地提高应用程序的性能。
使用MyBatis可以使我们的开发效率更高,代码更简洁,同时还可以提高应用程序性能。

10.你的数据库配置都写在哪里呢

application.properties文件中

九、用友 java实习 一面面经

1.java常见的集合有哪些

Java常见的集合包括:List、Set、Map、Queue等。其中,List可以有重复元素,Set不允许有重复元素,Map通过键值对来存储元素,Queue则是先进先出的数据结构。具体集合类的实现有:ArrayList、LinkedList、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap和TreeMap等。

2.数据库索引有哪些缺点

数据库索引的一些缺点包括:
1.增加了数据插入、更新、删除等操作的时间和成本;
2.索引占用磁盘空间,特别是对于大表来说;
3.索引需要额外的维护成本;
4.当数据分布不均匀时,索引对性能的提升可能不太显著;
5.索引可能需要频繁重构以保证查询效率,这也会增加额外的成本和风险。

3.SpringBoot的核心功能

Spring Boot的核心功能包括:
1.自动装配:Spring Boot通过@Configuration和@EnableAutoConfiguration,可以自动配置大量的Spring框架常用的组件和类库,极大简化了Spring的开发和配置。
2.Starter依赖:通过引入与应用相关的所谓"Starter"依赖,Spring Boot可以自动引入应用所需的依赖,从而可以让开发者专注于业务开发,不再关心依赖包冲突等底层实现问题。
3.Actuator:提供了一些监控和管理的端点,可以方便地进行应用状态的监测和管理。
4.内嵌Web服务器:Spring Boot内置Tomcat、Jetty和Undertow等Web服务器,并提供了自动配置,简化了Web应用的开发和部署过程。
5.简化的配置:Spring Boot提供了许多简化配置的方式,例如通过application.properties文件,可以方便地配置应用的各种属性和行为。
总之,Spring Boot的核心功能是极大简化Spring框架的开发和部署,提高了开发效率和代码质量。

4.SpringBoot有哪些缺点

Spring Boot的一些缺点包括:
1.配置过于冗长,需要编写大量的注解和配置文件。
2.依赖关系过于复杂,可能导致程序的运行速度变慢。
3.对于初学者来说比较难以理解,需要一定的学习成本。
4.SpringBoot的自动配置功能可能会导致一些难以发现的问题,需要谨慎使用。
5.整合其他框架的时候可能会出现一些不兼容的问题。

你可能感兴趣的:(每日面试题刷,笔记,java,数据结构)