1.南京某公司
1.Java的几种基本数据类型?分别是多少字节?
byte,8bit == 1字节
char,16bit == 2字节
short,16bit == 2字节
int,32bit == 4字节
float,32bit == 4字节
long,64bit ==8字节
double,64bit ==8字节
boolean,只有两个值:true、false,可以使⽤用 1 bit 来存储
2.Int转byte怎么做?
进行强制类型转换
3.左外连接和innerjoin的区别?
内连接(Inner Join):
内连接是通过匹配两个表之间的共同字段来返回匹配的行。
结果集中包含两个表中共同满足连接条件的行。
如果某行在一个表中没有匹配的行,则不会包含在结果集中。
左外连接
左外连接会返回左边表中的所有行,以及右边表中与左边表匹配的行。
如果右边表中没有匹配的行,则返回NULL值。
结果集中包含左边表的所有行,无论是否存在匹配的行。
4.mysql的存储引擎,它的实现原理?
MySQL支持多种存储引擎,其中最常见的是InnoDB和MyISAM。每种存储引擎都有其自己的实现原理和特点。
InnoDB存储引擎:
InnoDB 是 MySQL 中最常用的存储引擎之一,它的实现原理主要包括以下几个方面:
事务支持: InnoDB 是一个支持事务的存储引擎,它采用了ACID(原子性、一致性、隔离性、持久性)事务模型。这意味着它能够保证数据的一致性和完整性。
行级锁: InnoDB 使用行级锁来实现并发控制,这使得多个事务可以并发地访问和修改数据,从而提高了系统的并发性能。
多版本并发控制(MVCC): InnoDB 使用多版本并发控制来处理读写冲突,它可以在读操作和写操作之间提供一致性的快照视图,从而实现了高并发和高性能的读操作。
聚簇索引: InnoDB 使用聚簇索引来存储数据,这意味着数据行实际上是按照主键顺序存储在磁盘上的,这样可以提高数据的读取性能。
MyISAM存储引擎:
MyISAM 是 MySQL 中另一个常用的存储引擎,它的实现原理与 InnoDB 有所不同:
表级锁: MyISAM 使用表级锁来进行并发控制,这意味着在写操作期间会锁定整个表,从而降低了并发性能。
不支持事务: MyISAM 不支持事务,因此无法提供像 InnoDB 那样的事务支持和ACID特性。
非聚簇索引: MyISAM 使用非聚簇索引来存储数据,索引文件和数据文件是分开存储的,这可能导致性能上的一些损失。
全文索引: MyISAM 支持全文索引,这使得它在文本搜索方面具有一定的优势。
5.你说一下InnoDB存储引擎的索引的底层数据结构,为什么用这个数据结构?
MySQL 中常用的是 Hash 和 B+ 树索引。
Hash 索引底层就是 Hash 表,进行查询时调用 Hash 函数获取到相应的键值(对应地址),然后回表查询获得实际数据。
B+ 树索引底层实现原理是多路平衡查找树,对于每一次的查询都是从根节点出发,查询到叶子节点方可以获得所查键值,最后查询判断是否需要回表查询。
为什么使用B+树?
-
B+ 树减少了 IO 次数。
由于索引文件很大因此索引文件存储在磁盘上,B+ 树的非叶子结点只存关键字不存数据,因而单个页可以存储更多的关键字,即一次性读入内存的需要查找的关键字也就越多,磁盘的随机 I/O 读取次数相对就减少了。
-
B+ 树查询效率更稳定
由于数据只存在在叶子结点上,所以查找效率固定为 O(log n),所以 B+ 树的查询效率相比B树更加稳定。
-
B+ 树更加适合范围查找
B+ 树叶子结点之间用链表有序连接,所以扫描全部数据只需扫描一遍叶子结点,利于扫库和范围查询;B 树由于非叶子结点也存数据,所以只能通过中序遍历按序来扫。也就是说,对于范围查询和有序遍历而言,B+ 树的效率更高。
————————————————版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/adminpd/article/details/122910606
6.说一下事务,事务的特性?
数据库的事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
事务的典型应用场景,如转账。
什么是事务的四大特性(ACID)?
-
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用
-
一致性: 事务执行前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
-
隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
-
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
————————————————版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/adminpd/article/details/122910606
7.数据结构中二叉树有几种遍历方式?
在数据结构中,二叉树有三种常见的遍历方式,它们分别是前序遍历(Preorder traversal)、中序遍历(Inorder traversal)和后序遍历(Postorder traversal)。这三种遍历方式的区别在于节点的访问顺序不同。
- 前序遍历(Preorder traversal):
访问顺序:根节点 -> 左子树 -> 右子树
先访问当前节点,然后递归地访问左子树和右子树。
- 中序遍历(Inorder traversal):
访问顺序:左子树 -> 根节点 -> 右子树
先递归地访问左子树,然后访问当前节点,最后递归地访问右子树。
- 后序遍历(Postorder traversal):
访问顺序:左子树 -> 右子树 -> 根节点
先递归地访问左子树和右子树,最后访问当前节点。
8.Springboot的常用注解。
@SpringBootApplication:一个复合注解,
@RestController:用于定义 RESTful 接口,相当于 @Controller 和 @ResponseBody 的组合。
@RequestMapping:用于定义 HTTP 请求的映射,用于处理 HTTP 请求。
@Autowired:自动注入注解,用于自动装配 Spring Bean。
@Value:属性注入注解,用于注入配置文件中的属性值。
9.@SpringbiotApplication注解解释一下吧?有哪几个注解组成?
@SpringBootApplication:一个复合注解,包括了
@Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解,用于标识 Spring Boot 应用的主类。
@Configuration:表明该类是一个 Java 配置类,用于定义 Spring Bean 的配置信息。@EnableAutoConfiguration:自动配置注解,用于开启 Spring Boot 的自动配置功能。@ComponentScan:用于自动扫描和注册 Spring Bean。
10.mybatis和mybatisplus是如何传参的?基于注解的方式:
使用 @Param 注解标注参数,可以在 SQL 语句中通过参数名引用参数值。
@Select("SELECT * FROM users WHERE id = #{userId}")
User getUserById(@Param("userId") Long userId);
基于 XML 的方式:
在 XML 配置文件中,使用<parameterMap>或者<parameterType>
定义参数类型,然后在 SQL 语句中通过参数名引用参数值。
<select id="getUserById" parameterType="java.lang.Long" resultType="User">SELECT * FROM users WHERE id = #{userId}
</select>
MyBatis Plus 传参方式:
MyBatis Plus 是在 MyBatis 的基础上进行了扩展和增强,因此它也支持 MyBatis 中的传参方式,并且提供了更多的便利方法。
基于注解的方式:
MyBatis Plus 支持和 MyBatis 相同的基于注解的方式传参。
基于 Lambda 表达式的方式:
MyBatis Plus 提供了 LambdaQueryWrapper 和 LambdaUpdateWrapper 等方法,可以使用 Lambda 表达式来进行查询条件的构建和传参。
// 示例:使用 Lambda 表达式构建查询条件
List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getUserName, "username").like(User::getEmail, "example@example.com")
);
11.list,set,map的区别?
-
List(列表):
List是有序集合,可以存储重复的元素。
可以通过索引访问元素,保持插入顺序。常见的实现类包括ArrayList和LinkedList。
2.Set(集合):
Set是无序集合,不允许存储重复的元素。
不保证插入顺序,元素存储的顺序取决于具体实现类。常见的实现类包括HashSet、TreeSet等。
3.Map(映射):
Map是键值对的集合,每个键对应一个值,键不能重复但值可以重复。
通过键可以唯一标识值,类似于字典或哈希表的结构。常见的实现类包括HashMap、TreeMap等。
12.git出现合并分支冲突。如何解决?
13.你是怎么部署项目的?
14.vue之间的父子组件之间的通信?
在Vue.js中,父组件可以通过props向子组件传递数据,子组件可以通过$emit触发事件向父组件传递数据,这样就实现了父子组件之间的通信。
15.vue的构建工具?
16.如何解决跨域问题?
跨域是指从一个域名的网页去请求另一个域名的资源。由于有同源策略的关系,一般是不允许这么直接访问的。但是,很多场景经常会有跨域访问的需求,比如,在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域问题。
- CORS,跨域资源共享
CORS(Cross-origin resource sharing),跨域资源共享。CORS 其实是浏览器制定的一个规范,浏览器会自动进行 CORS 通信,它的实现主要在服务端,通过一些 HTTP Header 来限制可以访问的域,例如页面 A 需要访问 B 服务器上的数据,如果 B 服务器 上声明了允许 A 的域名访问,那么从 A 到 B 的跨域请求就可以完成。
- @CrossOrigin注解
如果项目使用的是Springboot,可以在Controller类上添加一个 @CrossOrigin(origins =“*”) 注解就可以实现对当前controller 的跨域访问了,当然这个标签也可以加到方法上,或者直接加到入口类上对所有接口进行跨域处理。注意SpringMVC的版本要在4.2或以上版本才支持@CrossOrigin。
- nginx反向代理接口跨域
nginx反向代理跨域原理如下: 首先同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题。
nginx反向代理接口跨域实现思路如下:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。
// proxy服务器
server {listen 81;server_name www.domain1.com;location / {proxy_pass http://www.domain2.com:8080; #反向代理proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名index index.html index.htm;add_header Access-Control-Allow-Origin http://www.domain1.com;}
}
这样我们的前端代理只要访问 http:www.domain1.com:81/*就可以了。
17.tcp,udp的区别?
18.tcp255.255.255.255会出现什么情况?
19.html和xml区别?
20.如何设计一个区域表让省市县在一个表里面?
2.山东某公司
Java的特性
jvm,jre,jdk的区别和联系
JDK 包含了 JRE,因此 JDK 可以用于开发和运行 Java 程序。
JRE 包含了 JVM,因此 JRE 可以用于运行 Java 程序,而 JVM 是 JRE 的核心组件之一。
JVM 是 Java 程序的运行环境,负责将 Java 字节码解释成特定平台上的机器码并执行,是 Java 跨平台性的基础。
讲讲面向切面编程
作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,
这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理等。
AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。
静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。
(1)AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理
类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的
时候就是增强之后的AOP对象。
(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次
运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在
特定的切点做了增强处理,并回调原对象的方法。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_30999361/article/details/124519472
泛型了解吗
Java泛型是JDK 5中引⼊的⼀个新特性, 允许在定义类和接口的时候使⽤类型参数。声明的类型参数在使⽤时⽤具体的类型来替换。
泛型最⼤的好处是可以提⾼代码的复⽤性。以List接口为例,我们可以将String、 Integer等类型放⼊List中, 如不⽤泛型, 存放String类型要写⼀个List接口, 存放Integer要写另外⼀个List接口, 泛型可以很好的解决这个问题。
什么是反射
反射机制允许程序在运行时动态地获取类的信息(例如字段、方法、构造器等),并且可以在运行时创建新的类实例、调用方法、访问或修改字段值,甚至在运行时修改类的行为。通过反射,程序可以在不知道类结构的情况下操作类和对象,从而实现一些动态的、灵活的功能。
在Java中,反射机制主要通过java.lang.reflect包提供支持。常见的反射操作包括:
-
获取类的信息:通过反射可以获取类的字段、方法、构造器等信息,例如Class.getDeclaredFields()、Class.getDeclaredMethods()等方法。
-
创建对象:可以使用反射来在运行时动态地创建对象实例,例如Class.newInstance()方法或者Constructor.newInstance()方法。
-
调用方法:可以通过反射来动态地调用类的方法,例如Method.invoke()方法。
-
访问和修改字段值:可以通过反射来获取和设置类的字段值,例如Field.get()和Field.set()方法。
-
修改类的行为:通过反射可以在运行时修改类的访问控制权限、添加新的方法、修改已有方法等。
spring是什么
Spring是一个开源的Java框架,由于其轻量级、非侵入性和综合性等特点,成为了当今最受欢迎的企业级应用开发框架之一。
什么是索引
索引是对数据库表中一列或多列的值进行排序的数据结构,用于快速访问数据库表中的特定信息。
从物理结构上可以分为聚集索引和非聚集索引两类:
-
聚簇索引指索引的键值的逻辑顺序与表中相应行的物理顺序一致,即每张表只能有一个聚簇索引,也就是我们常说的主键索引;
-
非聚簇索引的逻辑顺序则与数据行的物理顺序不一致。
从应用上可以划分为一下几类:
-
普通索引:MySQL 中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了提高查询效率。通过 ALTER TABLE table_name ADD INDEX index_name (column) 创建;
-
唯一索引:索引列中的值必须是唯一的,但是允许为空值。通过 ALTER TABLE table_name ADD UNIQUE index_name (column) 创建;
-
主键索引:特殊的唯一索引,也成聚簇索引,不允许有空值,并由数据库帮我们自动创建;
-
组合索引:组合表中多个字段创建的索引,遵守最左前缀匹配规则;
-
全文索引:只有在 MyISAM 引擎上才能使用,同时只支持 CHAR、VARCHAR、TEXT 类型字段上使用
介绍一下分组关键字
在SQL中,GROUP BY 是一个非常重要的关键字,用于对查询结果进行分组。使用 GROUP BY 可以按照一个或多个列对查询结果进行分组,然后对每个组应用聚合函数(如 SUM、AVG、COUNT、MAX、MIN 等)进行计算。
如何创建表
了解ORM框架吗?
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
常见的 ORM 框架:
Hibernate:Hibernate 是 Java 平台上最流行的 ORM 框架之一,它提供了强大的对象关系映射功能,支持多种数据库,并且具有高度的灵活性和可扩展性。
mybatis和Hibernate的区别
①mybatis是半自动化对象关系映射框架(提供数据库和实体类的映射关系,还需要自己写sql),Hibernate是全自动化对象关系映射框架(提供数据库和实体类的映射关系,自动生成sql)。
②mybatis控制sql执行,灵活度高。Hibernate虽然灵活度没那么高,但是可以节省代码,效率高。
③mybatis数据库无关性差,移植性差,Hibernate数据库无关性好,移植性好,靠的是强大的hql语言。
④Hibernate日志更加完善,而mybatis只是基础记录功能。
为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
————————————————
两张表字段一致,填充第二张表到第一张表除了id所有字段。
SELECT *
FROM table1
INNER JOIN table2 ON table1.id = table2.id;
在这个语句中,INNER JOIN 关键字用于连接两张表。ON 子句指定连接条件,通常是两张表中的某个共同字段(例如 id)。这个例子中,假设 id 字段用于连接两张表。你可以根据需要替换连接条件。
这个查询将返回两张表中 id 字段相匹配的行,并且会将来自两张表的数据组合在一起。如果两张表中有相同名称的字段,你可以使用 table1.column_name 和 table2.column_name 来指定具体来自哪张表的字段。如果你只想选择特定的字段,可以在 SELECT 子句中列出它们的名称,而不是使用通配符 *。
将第二张表的数据插入到第一张表中的方法(使用 INSERT INTO SELECT):
INSERT INTO table1 (column2, column3, column4, ...)
SELECT column2, column3, column4, ...
FROM table2;
3.东莞某公司
Null和空字符串的区别
Null 不会占用额外的内存空间,因为它只是表示引用变量没有指向有效的对象。
空字符串会占用一定的内存空间来存储字符串的长度和字符内容,即使字符串是空的也会有一定的内存开销。
堆和栈的区别
Mybatis连接数据库的配置信息有哪些?
数据库驱动信息:指定用于连接数据库的驱动程序类名。
数据库连接信息:包括数据库的 URL、用户名和密码。
连接池配置:指定连接池的相关参数,例如最大活动连接数、最大空闲连接数、连接超时时间等。
MyBatis 相关配置:例如映射文件的位置、别名的配置等。
其他可选配置项:例如超时时间、事务管理器、日志输出等。
常见的排序算法?哪个效率最高?
冒泡排序(Bubble Sort)
选择排序(Selection Sort)
插入排序(Insertion Sort)
归并排序(Merge Sort)
快速排序(Quick Sort)
堆排序(Heap Sort)
计数排序(Counting Sort)
桶排序(Bucket Sort)
基数排序(Radix Sort)
这些排序算法在不同情况下有不同的效率表现。一般来说,快速排序(Quick Sort)和归并排序(Merge Sort)是效率较高的排序算法,它们的平均时间复杂度为 O(n log n) 但是,在最坏情况下,快速排序的时间复杂度可能达到 O(n^2),而归并排序的时间复杂度保持在 O(n log n)。因此,如果对稳定性要求高且内存空间充足的情况下,归并排序更适合;而快速排序则更适合对空间复杂度有要求或者对稳定性要求不那么高的情况。
Java常用的web容器?
Apache Tomcat:Tomcat 是 Apache 软件基金会的一个开源 Web 服务器和 Servlet 容器,用于执行 Java Servlet、JavaServer Pages(JSP)等。它是 Java Web 开发中最受欢迎的容器之一,简单易用,适合于小型和中小型应用。
Jetty:Jetty 是 Eclipse Foundation 的一个开源项目,也是一个轻量级的 Servlet 容器和 HTTP 服务器。Jetty 可作为独立的服务器运行,也可以嵌入到其他应用中,提供灵活性和高性能。
Tomcat和Weblogic的区别?
Restful和Webserver的区别?
RESTful 是一种基于 REST 架构风格设计的 Web 服务。它使用 HTTP 协议进行通信,通过 URL 定位资源,并使用 HTTP 方法(如 GET、POST、PUT、DELETE 等)对资源进行操作。
RESTful 服务通常返回 JSON 或 XML 格式的数据,适用于构建可扩展和灵活的网络应用程序。它强调资源的表现层状态转移,可以被不同类型的客户端(如 Web 应用、移动应用)调用。
Web 服务器 是一种运行在服务器端的软件应用程序,用于处理 HTTP 请求,响应客户端的请求并返回网页内容。
常见的 Web 服务器包括 Apache、Nginx、IIS 等。它们接收来自客户端的 HTTP 请求,处理请求并将处理结果返回给客户端。Web 服务器用于托管和提供静态网页、动态网页和应用程序等内容。
4.南京某外包
微服务的组件?
Linux怎么查看内存?
Redis的持久化机制?
持久化就是把内存的数据写到磁盘中,防止服务宕机导致内存数据丢失。
Redis支持两种方式的持久化,一种是RDB的方式,一种是AOF的方式。前者会根据指定的规则定时将内存中的数据存储在硬盘上,而后者在每次执行完命令后将命令记录下来。一般将两者结合使用。
RDB和AOF的区别?
**RDB是Redis默认的持久化方式。**按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应
产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件
中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
5.西安某公司
数据库的分组和排序关键字。
你对线程和进程的理解
根本区别:
进程是操作系统资源分配的基本单位,
而线程是处理器任务调度和执行的基本单位
资源开销:
每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;
线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:
如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;
线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:
同一进程的线程共享本进程的地址空间和资源,
而进程与进程之间的地址空间和资源是相互独立的
影响关系:
一个进程崩溃后,在保护模式下不会对其他进程产生影响,
但是一个线程崩溃有可能导致整个进程都死掉。所以多进程要比多线程健壮。
执行过程:
每个独立的进程有程序运行的入口、顺序执行序列和程序出口。
但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_30999361/article/details/124545403
栈和队列的区别?请举例子说明?
你对面向对象的理解和对面向对象涉及的原则的理解。