2023-04-13_面试题复盘笔记(81)

一、美团后端一面

1、用了 LRU,为什么用 LRU,你还知道其他的置换算法吗 ?

LRU 是内存管理的一种页面置换算法,选择最近最久未使用的页面予以淘汰。
内存大小有限,所存放的数据也是有限的,在有新数据到来的时候,就需要我们从内存里面移除一些数据给新数据腾出空间,这个时候就可以用 LRU 算法来制定相应的删除策略。
常见的置换算法有:
LRU(Least recently used,最近最少使用)就是把那个最久没有使用过的数据移除;
FIFO(First in first out, 先进先出)就是最先存入的数据最先淘汰;
LFU(Least Frequently Used,最近最少使用)就是最近使用频率最低的被淘汰。

2、你用了 LRU 做缓存类,那你听过缓存雪崩和击穿吗 ?

缓存雪崩:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
解决办法:
大多数系统设计者考虑用加锁( 最多的解决方案)或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单方案就时讲缓存失效时间分散开。

缓存穿透:指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
解决办法:
最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。

3、那数据持久化你有了解吗 ?

Redis 提供两种持久化机制 RDB 和 AOF 机制:
RDB 持久化方式: 是指用数据集快照的方式(半持久化模式)记录 redis 数据库的所有键值对,在某个时间点将数据写入一
个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复的目的。
优点:
1、只有一个文件 dump.rdb,方便持久化。
2、容灾性好,一个文件可以保存到安全的磁盘。
3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis的高性能)
4.相对于数据集大时,比 AOF 的启动效率更高。
缺点:
1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)

AOF 持久化方式: 是指所有的命令行记录以 redis 命令请求协议的格式(完全持久化存储)保存为 aof 文件。
优点:
1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。
2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点:
1、AOF 文件比 RDB 文件大,且恢复速度慢。
2、数据集大的时候,比 RDB 启动效率低。

4、能接收10000+请求,你是怎么测出来支持这个数量的请求?

使用测试工具Jmeter,配置线程组信息;填写Http请求;响应断言;查看结果数;聚合报告提供详细的性能指标和监测数据。

5、get 和 post 请求的区别 ?

GET请求:一般用于获取数据,通过URL中的查询字符串(Query String)来传递参数,数据会附在URL之后,因此数据的长度受限于URL的长度限制,一般为1024个字符,不安全,因为数据会暴露在URL上。
POST请求:一般用于提交数据,数据会包含在请求体(Request Body)中,因此数据长度不受限制,数据不会暴露在URL上,相对安全。
总的来说,GET请求适合用于获取数据,POST请求适合用于提交数据。除了数据的传递方式不同,GET和POST请求还有其他一些区别:
缓存:GET请求会被浏览器缓存,而POST请求不会。
安全性:POST请求相对于GET请求更加安全,因为POST请求不会把数据暴露在URL上,而且POST请求可以使用SSL/TLS加密传输数据。
幂等性:GET请求具有幂等性,即重复请求不会对服务器端产生副作用,而POST请求不具备幂等性,因为重复请求会导致多次提交相同的数据。
可见性:GET请求会把请求参数显示在URL上,而POST请求不会。
综上所述,选择使用GET还是POST请求取决于你的具体需求,需要考虑数据传输方式、数据安全性、缓存、幂等性等因素。

6、线程间通信和进程间通信

线程间通信是指在同一进程内的不同线程之间进行消息传递,以实现数据共享和协同工作。
进程间通信是指在不同进程之间进行消息传递,以实现不同程序之间的数据共享和协同工作。

7、你了解过分布式吗 ?

分布式技术是指使用多台计算机系统来共同完成特定的任务,它可以提高系统的性能和可靠性,并提供更多的可用性。
Java中常用的分布式技术有:
RMI:是一种远程调用协议
JMS:是用于发送和接收消息的API
JNDI:是命名和目录服务的接口
IIOP:是一种对象请求代理协议

8、MySQL索引的作用,有哪些分类,什么时候要建立索引 ?

MySQL索引通常用于提高查询速度和效率,通过对记录的索引进行搜索可减少数据库的扫描次数。MySQL索引一般分为B树索引、哈希索引、全文索引等几种类型。建立索引一般有以下几种情况:表中的某个字段作为查询的条件经常被使用;表中的某个字段作为排序的字段经常被使用;特定的表中某个字段的唯一性需要保证等。

9、最左匹配法则听过吗,解释一下

最左匹配法则是指,在自然语言处理中,当处理一个字符串时,会尽可能地匹配最左边的子串。
索引中的最左匹配法则是指当使用复合索引时,查询中的条件以及排序方式必须要匹配索引中的最左侧列,这样查询效率才能最大化。换句话说,复合索引的最左列是最重要的,其他列只有在最左列匹配的情况下才会被使用到。

10、什么时候匹配会失效?

索引中的最左匹配规则会失效的情况是,当使用了非最左前缀的字段进行查询时,最左匹配规则无法生效,索引也无法被使用。比如在一个包含(a,b,c)三个字段的索引中,若查询语句中只使用了b、c字段,则最左匹配规则失效。

二、同花顺Java二面

1、一个数据表建立索引需要注意的问题

  1. 选择合适的数据类型和长度,避免对索引和查询造成负面影响。
  2. 根据实际业务需求选择合适的索引类型(如B-Tree索引、哈希索引、全文索引等)。
  3. 不要在过多的列上创建索引,这可能会导致索引维护开销增大。
  4. 避免创建重复的索引,重复索引既浪费了空间,也增加了更新索引的成本。

2、 稀疏性

稀疏性是指一个数据集或矩阵中的大部分元素都是零,只有少数元素是非零的。在机器学习和数据分析中,稀疏性通常可以提高算法的效率和减少计算资源的需求。

3、常用数据结构

常用的数据结构有:数组、链表、栈、队列、树、图等。
常用的数据类型有:整型、浮点型、字符型、布尔型等

4、TreeMap

TreeMap是一种基于红黑树(Red-Black Tree)实现的有序映射表(Map)。它可以按照键的自然顺序排列,也可以通过指定Comparator来定制排序方式。它可以快速通过键值访问对应的值,常用于需要按照一定顺序访问的场景中。我们可以通过创建TreeMap对象,然后调用put和get等方法实现。

5、线程安全集合

Java中有以下线程安全的集合类:ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentLinkedQueue、ConcurrentSkipListMap、ConcurrentSkipListSet、LinkedBlockingQueue、PriorityBlockingQueue、LinkedTransferQueue、ArrayBlockingQueue、DelayQueue、SynchronousQueue等。

6、Synchronize 与 RecentLock 区别

Synchronize(同步)和ReentrantLock(重入锁)都是Java中用于实现线程安全的机制。它们的用途相似,但是有一些区别。Synchronize是Java中内置的一种锁机制,ReentrantLock是API层面提供的一个可重入锁,它比Synchronize更加灵活和精细化。ReentrantLock允许更细粒度地控制锁的获取和释放,并提供了一些Synchronize所没有的高级功能,例如可中断的锁等待、公平锁、多个条件变量等等。总的来说,ReentrantLock提供了更多扩展性和灵活性,但也需要更多的代码来实现。

7、如何设计一个线程安全的LRU

关于如何设计一个线程安全的LRU,我可以提供以下建议:
1.使用双向链表来存储最近使用的元素,最近使用的放在链表头部,最久未使用的放在链表尾部。
2.使用Map(哈希表)来存储key和对应的节点。
3.加锁来确保线程安全,可以使用ReentrantReadWriteLock,读写锁可以分离读和写的操作,提高效率。
4.当节点访问时,直接对双向链表进行操作,不必对整个缓存进行加锁。
5.当缓存满时,将最久未使用的元素从链表尾部删除,再将新元素添加到链表头部。同时删除Map中的对应key节点。

8、是否有GC调参,请简单说说?

关于GC调参,可以从以下方面入手:
1.初始堆大小:初始堆大小应该足够大,避免频繁扩容导致性能损失。
2.垃圾回收算法:选择合适的算法可以提高性能,比如CMS算法可以减少暂停时间。
3.垃圾回收的触发时间:可以通过设定阈值,让JVM在满足一定条件后自动触发垃圾回收。
4.年轻代与老年代比例:根据具体场景调整年轻代与老年代的比例,以达到最优的性能与内存使用效率。
5.垃圾回收线程数:合理设置垃圾回收线程的数量,可以避免和其他线程抢占CPU资源而导致性能下降。

9、用哪个版本Java(1.8),为什么用,有什么新特性 ?

Java 8是一个重要的版本,它引入了许多新功能,包括:
1.Lambda表达式: Lambda表达式是一种简洁的代码,可以使用它来创建匿名函数。这样可以更方便地使用函数式编程风格,同时可以减少代码的冗余。
2.接口的默认方法: Java 8引入了接口的默认方法,允许接口中定义带有实现的方法。这使得接口可以在不破坏现有代码的情况下进行更新,并提高了代码的可扩展性。
3.方法引用: Java 8引入了方法引用,这是一种简洁的语法,可以使用已经存在的方法或构造函数来创建Lambda表达式。这样可以避免重复编写相同的代码,同时也更方便阅读。
4.新的日期和时间API: Java 8引入了新的日期和时间API,这个API比旧版本的API更加简单易用,并且提供了许多新功能。
5.Stream API: Java 8引入了Stream API,这是一个用于处理数据的函数式编程库。使用Stream API可以更简单地处理数据,同时还可以利用多核架构来提高性能。

10、在Linux部署一个Java程序需要注意什么 ?

在Linux部署Java程序需要注意以下几点:
1.安装Java运行环境:Java程序需要JRE或JDK运行环境,需要通过命令行或者其他方式安装。
2.配置环境变量:为了让Linux系统识别Java运行环境,需要将Java环境变量配置到系统路径中。
3.程序部署目录:将Java程序部署到一个具备访问权限的目录中,并设置必要的文件、目录和权限。
4.端口号和安全设置:如果Java程序需要通过网络访问,需要指定一个端口号并确保安全设置。
5.运行程序:通过Java命令行或者其他方式运行程序,并根据程序需要提供合适的参数。

11、 Linux常用指令

常用的Linux指令包括:ls(列出文件和文件夹)、cd(进入到指定的目录)、mkdir(创建一个新目录)、rm(删除一个文件或目录)、cp(复制文件或目录)、mv(移动或重命名一个文件或目录)、vi(编辑文件)、ps(查看当前进程)、top(查看系统资源使用情况)、ping(测试网络连接)、ssh(远程连接服务器)。

三、携程java后端二面(暑期实习)

1、MySQL 怎么回滚事务,用什么来做,代码怎么设计 ?

可以使用MySQL语句中的ROLLBACK命令进行事务回滚。在代码中的设计可以使用try-catch代码块来实现事务回滚的操作。下面是样例代码:
try {
// 开始事务
con.setAutoCommit(false);
// 执行事务相关代码
// 如果出现异常,执行回滚操作
con.rollback();
} catch (SQLException e) {
// 执行回滚操作
con.rollback();
// 抛出异常
throw e;
} finally {
// 关闭连接
con.close();
}

2、MySQL 为什么考虑设计读提交和可重复读隔离级别 ?

MySQL 考虑设计读提交和可重复读隔离级别是为了解决并发事务的问题。在并发操作中,如果多个事务同时修改同一行数据,可能会产生数据不一致的情况,这就需要隔离级别来控制事务之间的访问和影响。而读提交和可重复读隔离级别正是为了解决并发事务中的读写冲突和脏读等问题。

3、为什么要设计可重复读,在真实场景下什么条件下需要用可重复读?举个例子。(面试官说这个例子不好举,因为真实开发中一般不用可重复读,用读提交,性能好)

可重复读是指在一个事务内,多次读取同一数据时,得到的结果始终相同。在真实场景下,当需要确保并发事务对同一数据的读取结果相同且不受其他事务干扰时,需要使用可重复读。例如,在一个购物应用中,用户点击某个商品进行查看时,系统需要保证他看到的商品信息是一致的,而不会因为其他用户在同时修改商品信息而导致数据不一致。因此,在此场景下需要使用可重复读。

4、怎么解决缓存和数据库一致性问题 ?

关于缓存和数据库一致性问题,有多种解决方案。一种常用的方法是使用缓存中间件,比如 Memcached 或 Redis,来管理缓存和数据库之间的数据同步。可以使用一些技术手段来确保数据的一致性,例如在更新数据库时同时更新缓存中的数据,或者在缓存过期时刷新数据库中的数据。此外,还可以利用一些工具和技术,比如分布式事务和分布式锁来确保数据的一致性。需要根据具体情况做出选择。

5、先更新数据库再删除缓存会出现不一致问题的场景说一下。

假设我们需要从一个包含用户信息的数据库中获取某个用户的信息,同时也需要将该信息缓存起来以加速后续的请求。在这种情况下,如果我们先更新了数据库中的用户信息,然后立即删除了已经缓存的旧数据,但由于网络延迟或其他原因,缓存数据未能及时更新,那么后续的请求就会读取到已经过期的缓存数据,导致数据不一致的情况发生。因此,应该先删除缓存,再更新数据库,这样可以避免数据不一致的问题。

6、讲一下为什么要用消息队列 ?

消息队列是一种异步通信模式,它将消息从发送者发送到接收者,使得发送者和接收者不必在同一时间产生或处理消息。
使用消息队列有以下几个好处:
1.解耦:消息队列可以将不同的系统或部分解耦,因为消息处理者不需要了解发送者的细节。通过将处理过程分离,消息队列可以使系统更加灵活,并使其更容易扩展。
2.异步:消息队列可以提高系统的响应速度和吞吐量。发送者发送消息后,就可以立即处理其他事情,而不必等待接收者响应。这使得系统更加容错,也更加可扩展。
3.冗余:消息队列可以提供消息的冗余备份,以防止消息丢失。如果一个接收者无法处理消息,该消息会被重新发送到队列中,直到可以处理为止。这保证了消息的可靠性和一致性。
4.扩展:消息队列可以很容易地实现横向扩展,从而实现更高的负载量和更大的并发性。通过添加更多的可扩展节点,可以增加处理器的数量和处理消息的速度。
综上所述,消息队列是一个强大的工具,可以提高系统的性能和可靠性,并促进系统的灵活性和可扩展性。

7、消息队列可以解决哪些问题 ?

消息队列可以解决异步通信、解耦、流量削峰、服务降级、分布式事务等问题。

8、用消息队列的真实场景讲一下?

消息队列是一种高效的通信方式,可以将消息发送到某个中心队列中,并由消费者按照一定的规则来消费这些消息。
一个常见的场景是在线购物网站中的订单处理。当用户下单后,后台系统将订单信息发送到消息队列中。然后,订单处理系统可以从消息队列中获取订单信息,进行处理并更新订单状态等信息。这种方式可以避免系统繁忙时的请求堆积,提高系统的处理能力和并发性能。
另一个场景是微服务架构中的组件通信。微服务架构中的各个服务之间可以通过消息队列进行通信,实现异步处理和解耦。例如,当一个服务发生异常时,可以将异常信息发送到消息队列中,由错误处理服务接收并进行处理。

四、浩鲸科技 Java日常实习技术面

1、为什么以 Java 语言作为求职方向 ?

Java作为一种广泛应用于企业级软件开发的编程语言,有着强大的跨平台性和稳定性,历经多年的发展已经成为IT行业中的热门技能之一。许多企业都对Java技术人才有着很高的需求,因此Java开发具有较好的就业前景。

2、面对对象编程编程语言的三大特性

面向对象编程语言的三大特性是封装、继承和多态性。封装指的是将数据和操作数据的代码封装在一起,以隐藏实现细节;继承指的是子类可以继承父类的属性和方法,同时可以定义自己的方法和属性;多态性指的是同一个方法可以被不同类的对象调用,且能产生不同的行为。

3、JDK 中对封装、继承、多态的典型应用

封装、继承、多态是面向对象编程中的三大特性。在JDK中,封装可以通过将属性设置为private来实现,继承可以通过extends关键字来实现,而多态可以通过方法重载和方法重写来实现。其中,封装可以保护属性不被其他对象直接访问和修改,继承可以减少代码的冗余,多态可以提高代码的扩展性和灵活性。一个典型的应用包括,使用封装来保护数据的安全性,使用继承来实现代码的复用,使用多态来处理不同对象的特定行为。

4、ArrayList 和 LinkedList 区别

ArrayList 和 LinkedList 的主要区别在于其底层数据结构不同,ArrayList 是基于动态数组实现的,LinkedList 是基于双向链表实现的。另外,ArrayList 的随机访问效率比较高,而插入和删除操作效率比较低,而 LinkedList 则相反,插入和删除操作效率比较高,但是随机访问效率比较低。因此,在使用时需要根据具体场景选择适合的数据结构。

5、List 和 Set 区别

List和Set都是在Java中常用的集合类型。List是有序的集合,可以重复元素;而Set是无序的集合,不可以重复元素。
具体地说,List中的元素是按照添加的顺序排列的,可以根据下标来访问和操作。常见的List有ArrayList和LinkedList两种实现方式。
Set中的元素是无序排列的,不能通过下标来访问或操作,它只是保证集合中不存在重复元素。常见的Set有HashSet和TreeSet两种实现方式。
因为List和Set在实现和使用上有很大的区别,所以在不同的场合下选择使用不同的集合,可以提高程序的效率和可读性。

6、HashMap 的数据结构

HashMap 是一种基于哈希表的数据结构,通过键值对的方式存储数据。它可以提高数据的访问速度和效率,适用于需要快速访问、添加、修改、删除数据的场景。

9、JDK8新特性

Java 8是一个重要的版本,它引入了许多新功能,包括:
1.Lambda表达式: Lambda表达式是一种简洁的代码,可以使用它来创建匿名函数。这样可以更方便地使用函数式编程风格,同时可以减少代码的冗余。
2.接口的默认方法: Java 8引入了接口的默认方法,允许接口中定义带有实现的方法。这使得接口可以在不破坏现有代码的情况下进行更新,并提高了代码的可扩展性。
3.方法引用: Java 8引入了方法引用,这是一种简洁的语法,可以使用已经存在的方法或构造函数来创建Lambda表达式。这样可以避免重复编写相同的代码,同时也更方便阅读。
4.新的日期和时间API: Java 8引入了新的日期和时间API,这个API比旧版本的API更加简单易用,并且提供了许多新功能。
5.Stream API: Java 8引入了Stream API,这是一个用于处理数据的函数式编程库。使用Stream API可以更简单地处理数据,同时还可以利用多核架构来提高性能。

10、有没有关注过 JDK 最新版本的新特性,最新的版本是多少,有哪些 LTS 版本 ?

JDK最新版本是JDK 20, 目前jdk的三个LTS版本分别是JDK8、JDK11和JDK17。如果不是LTS版本呢? 非LTS版本只会得到六个月的产品支持。所以大家还是使用LTS版本吧

11、线程创建的方式,都讲一下

关于线程创建的方式,一般有以下几种:
1.继承Thread类并重写run()方法,然后创建该类的实例并调用start()方法启动线程。
2.实现Runnable接口并实现run()方法,然后创建Thread类的实例并将实现了Runnable接口的对象作为参数传递给Thread的构造方法,最后调用start()方法启动线程。
3.实现Callable接口并实现call()方法,然后将实现了Callable接口的对象作为参数传递给FutureTask的构造方法,最后创建Thread类的实例并将FutureTask对象作为参数传递给Thread的构造方法,最后调用start()方法启动线程。
4.使用线程池来启动线程,可以使用Executors类的静态方法创建一个线程池,然后将实现了Runnable接口或Callable接口的对象作为参数传递给线程池的submit()方法。

12、有操作过文件吗,说一下流

Java中的IO流是指Input/Output Stream(输入/输出流),是Java中用于处理IO操作的一种机制。它可以将数据读入到内存中,或将数据从内存中输出到磁盘等外部设备中。Java 中的IO流分为字节流和字符流两种类型,字节流以字节为单位读取,而字符流以字符为单位读取。Java中的IO流提供了很多类和方法,可以方便地处理不同类型的IO操作。

13、项目里的签名认证算法怎么实现的签名认证算法

签名认证算法的实现可以采用非对称加密技术,其中常用的算法有RSA和DSA。具体实现方式为:首先,生成一对公钥和私钥,将私钥保存在签名者手中,将公钥公开。然后,在数据传输前,签名者使用自己的私钥对数据进行加密,生成数字签名。接着,数据传输方将数据和数字签名一起发送给接收方。接收方使用签名者公钥对数字签名进行解密,得到原始数据,并使用相同算法重新计算数字签名,将其与接收到的数字签名进行比较,以验证签名的真实性和完整性。

14、starter 加载机制,项目中怎么实现 starter的

Starter加载机制是Spring Boot应用程序中的一种机制,它允许应用程序通过简单的方式引入外部依赖项,以便快速启动。在Spring Boot中,Starter是一个预定义的依赖项,它包含了一组相关的依赖项和自动配置类,可以快速实现某种功能。

15、gateway 在项目中用来干嘛了

Java中的gateway指的是网关,是指将不同的网络或不同的协议相连接的设备或程序,主要用于互联网中数据包的转发和路由选择。

16、数据库的左连接、右连接和内连接的区别

左连接、右连接和内连接都是关系型数据库中的连接操作。
内连接(Inner Join):只要两个表中有匹配的数据就返回,不匹配则不返回。
左连接(Left Join):左边表中的数据全部返回,如果右边表中有与之匹配的数据则一并返回,如果没有则返回 NULL。
右连接(Right Join):右边表中的数据全部返回,如果左边表中有与之匹配的数据则一并返回,如果没有则返回 NULL。
区别就在于匹配的方式和返回的结果不同。

17、这两个项目中数据表最大数据量有多少

18、sql优化,说一下添加索引的注意事项

当需要优化 SQL 查询时,通过添加索引可以加快查询速度。以下是添加索引时需要注意的几点:
1.确定需要添加索引的列:应该优先考虑经常作为查询条件的列,而不是仅仅频繁出现在查询中的列。
2.对于大表,应该避免添加太多的索引,因为过多的索引可能会影响写入性能。因此,应该根据实际的查询需求和数据特点来确定需要添加的索引。
3.不要添加过于冗长的索引:索引应该足够短小,这样它们才能更快地被扫描。如果添加了过于冗长的索引,可能会导致查询速度变慢。
4.对于字符串类型的列,可以使用前缀索引,这样可以通过索引查询列的部分值,而不是整个列的值。
5.对于联合索引,应该优先考虑按照最左边的列进行排序,因为这样可以让索引更快地被扫描。
总之,添加索引时应该根据实际需求进行选择,避免过度、冗长或不必要的索引。

19、vue这个项目自己搭建的吗,vue3有哪些新的特点

Vue 是一个由 Evan You 开发的框架,可以用于构建用户界面。Vue 3 的新特点包括更快的渲染速度、更小的 bundle 大小、更好的 TypeScript 支持、更好的异步组件加载、更好的组合 API 等。

20、说一下vue父子与兄弟传值

Vue父子组件传值可以通过props属性和 e m i t 方法实现,父组件通过 p r o p s 属性向子组件传递数据,子组件通过 emit方法实现,父组件通过props属性向子组件传递数据,子组件通过 emit方法实现,父组件通过props属性向子组件传递数据,子组件通过emit方法向父组件传递数据。 Vue兄弟组件传值需要借助一个共同的父组件,将需要共享的数据通过props属性传递给父组件,再通过父组件向兄弟组件传值。

五、天津小公司Java面试(实习岗)

1、String 是什么数据类型 ?基本数据类型包括哪些 ?

String 是 Java 的引用类型,用来表示字符串。Java 的基本数据类型包括整型(int、short、long、byte)、浮点型(float、double)、布尔型(boolean)和字符型(char)。

2、List、Set、Map之间的区别 ?

关于List、Set和Map的区别,可以理解为它们都是Java中的集合框架中的不同类型的集合。List是一个有序的,可以包含重复元素的集合,可以通过索引来访问其中的元素;Set是一个无序的,不包含重复元素的集合,可以用来去重;而Map是一种映射表,包含键-值对,可以通过键来访问对应的值。

3、public、private、protected 的作用域 ?

public、private、protected 是 Java 语言中的访问修饰符,用于控制类中成员的可见性和访问性。public 表示该成员可以被所有类访问,private 表示该成员只能被自身类访问,protected 表示该成员只能被自身类及其子类访问。这些修饰符可以用于类、方法和变量。

4、流的分类 ?

Java中的IO流是指Input/Output Stream(输入/输出流),是Java中用于处理IO操作的一种机制。它可以将数据读入到内存中,或将数据从内存中输出到磁盘等外部设备中。
Java 中的IO流分为:
1.按照流向可以分为输入流和输出流;
2.按照操作单元可以划分为字节流和字符流,字节流以字节为单位读取,而字符流以字符为单位读取
3.按照流的角色可以划分为节点流和处理流。

5、Spring 常用注解(最少说出5种)并简单解释

5种常用的Spring注解:
@Autowired:自动装配,可以用于实现依赖注入,将相关的组件引入到某个类中
@Component:用于将一个类定义为可扫描的组件,可以被Spring容器进行管理
@RequestMapping:处理请求映射的注解,用于标注Controller中的方法请求路径
@Service:服务层注解,用于标识一个类作为业务逻辑层组件
@Transactional:声明式事务注解,在接受到事务请求时,Spring会根据注解的声明自动处理事务

6、Spring 的工作流程

Spring 的工作流程主要包括:加载配置文件,创建Bean实例,Bean属性赋值,Bean初始化,Bean销毁等步骤。具体而言,Spring容器会先读取核心配置文件和Bean配置文件,并将其中的Bean定义信息实例化为Bean对象并存入Bean工厂(BeanFactory)中。然后,容器会根据Bean之间的依赖关系进行注入,即将Bean属性的值赋给实例化后的Bean对象。接下来,在所有的属性都注入完成后,容器会进行初始化,例如调用init-method方法等。当容器关闭时,会调用Bean的destroy-method方法进行销毁。

7、Spring Boot 启动类的注解,请求类的注解,服务层的注解都有哪些 ?

Spring Boot 启动类的注解通常包括 @SpringBootApplication、@EnableAutoConfiguration 和 @ComponentScan。
请求类的注解通常包括 @RestController、@GetMapping、@PostMapping 等。
服务层的注解通常包括 @Service、@Autowired、@Transactional 等。
这些注解只是常用的一些,具体使用会根据不同的场景和需求而有所不同。

8、列举一些 Spring Boot 特性

Spring Boot 是一个流行的 Java 开发框架,具有以下特性:
1、自动配置: Spring Boot 通过自动配置来消除了大部分的样板式代码,从而让开发者专注于业务逻辑。
2、起步依赖: Spring Boot 采用起步依赖的方式来管理依赖关系,从而让开发者可以更轻松地集成第三方库。
3、监控和管理端点: Spring Boot 通过集成 Actuator,提供了一系列监控和管理端点,可以方便地查看应用程序的运行状态。
4、内嵌 Tomcat 或 Jetty 服务器: Spring Boot 可以内嵌 Tomcat 或 Jetty 服务器,从而使得应用程序的部署变得更加容易。
5、配置文件外置: Spring Boot 可以将配置文件外置,从而使得更改配置变得更加简单。
6、CLI: Spring Boot 提供了一个 CLI 工具,可以方便地创建项目和运行脚本。
7、注解驱动开发: Spring Boot 支持注解驱动开发,从而可以更加方便地开发高效的 Web 应用程序。
以上就是一些 Spring Boot 的特性

9、如何用 SQL创建一张表,写一个简单的查询,添加,修改,删除(注:简单写出表可以不需要约束、引擎,但要建立主键、数据类型、长度随意,处理主键值不能为空,可以没有注解,建立至少两个字段)

创建一张表可以使用以下 SQL 语句:
CREATE TABLE my_table (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
age INT,
PRIMARY KEY (id)
);
这将创建一个名为 my_table 的表,包含 id、name 和 age 三个字段。其中 id 字段为主键,使用 AUTO_INCREMENT 自增,保证每行数据的唯一性。
接下来是一些简单的查询、添加、修改、删除语句示例:
查询所有数据:
SELECT * FROM my_table;
按条件查询数据:
SELECT * FROM my_table WHERE age > 18;
添加一条数据:
INSERT INTO my_table (name, age) VALUES (‘John’, 25);
修改一条数据:
UPDATE my_table SET age = 30 WHERE id = 1;
删除一条数据:
DELETE FROM my_table WHERE id = 2;

10、什么是事务 ?

事务是一系列操作的逻辑单元,被认为是一个不可分割的工作单位,这些操作要么都执行成功,要么都不执行。在计算机领域,事务通常被用在数据库操作中,可以保证一系列的操作在数据库中的一致性和可靠性。

六、开望科技(亲宝宝)Java日常实习一面

1、简历上第二个项目前后端怎么分工

2、项目有没有进行过数据库表设计

3、数据库中char和varchar区别

Char和Varchar都是数据库中存储字符串类型的数据,但是它们之间有一些区别。Char类型是一个定长的字符串类型,它指定了存储的字符串长度,不足该长度时会用空格补充,而Varchar则是一个可变长的字符串类型,它指定了存储的字符串最大长度。因此,当存储的字符串长度不够指定的长度时,Char会浪费一定的存储空间,而Varchar可以很好地节省存储空间。

4、为什么定长用char不用varchar

关于为什么在编程中要选择定长的 char 类型而不是变长的 varchar 类型,主要是为了提高数据的检索速度和占用空间的效率。定长的 char 类型在存储时占用固定的空间,而变长的 varchar 类型则需要存储长度和实际数据,导致空间占用不稳定。此外,char 类型的数据检索速度也比 varchar 类型快。

5、什么是加密算法和摘要算法

加密算法是指将明文转换成密文的方法,使得密文只有特定的人或者特定的程序才能够进行解密。摘要算法是指将任意长度的消息转化成固定长度的消息摘要,一般用于确保消息的完整性和验证消息的真实性。

6、索引是什么?B+树索引搜索起来为什么会快?

索引是一种数据结构,用于快速查找和访问数据库中的数据。B 树索引搜索起来会快,因为它可以通过多级索引的方式,将数据划分成多个小块,从而达到快速定位目标数据的目的。B 树索引还可以进行范围查询和模糊查询,因此在实际应用中具有广泛的应用价值。

7、Collections和Collection的区别,有什么联系

Collections是Java集合框架的一个类,提供了一些静态方法来操作集合,如排序、查找等。而Collection是Java集合框架中的接口,定义了一些集合应该具有的基本操作,如添加、删除、查询等。可以说,Collections类是Collection接口的工具类。两者的联系在于,Collections类中的方法均是基于Collection接口的操作而实现的。

8、说一下Map下面的实现类

Java中Map接口的实现类有HashMap、TreeMap、LinkedHashMap等,它们各自有不同的特点。
HashMap是最常用的实现类,使用哈希表来存储键值对,具有快速的查找和插入性能,但不保证有序;
TreeMap则是基于红黑树的实现类,键值对按键的自然顺序或者自定义排序进行存储,可以进行区间查找和排序操作;
LinkedHashMap继承自HashMap,除了具有快速的查找和插入性能外,还保持了元素的插入顺序。
除了以上三个常用实现类,还有EnumMap、WeakHashMap、IdentityHashMap等,它们各自适用于不同的场景和需求。

9、HashMap、HashTable、SortedMap如何选择及其使用场景

对于HashMap和HashTable,它们都是实现了Map接口的类,用于存储Key-Value键值对。其中HashMap是非线程安全的,而HashTable是线程安全的;HashMap允许key和value都可以为null,而HashTable则不允许;在性能方面,HashMap比HashTable更快。对于SortedMap,它实现了Map接口,并且提供了按照Key排序的功能,常用的类有TreeMap。选择哪种Map取决于项目的具体需求,如果需要线程安全,则可以选择HashTable;如果需要按照Key排序,则可以选择SortedMap;如果对性能要求比较高,则可以选择HashMap。在使用Map的时候,需要根据具体场景来选择适合的类,这样可以提高程序的执行效率和安全性。

10、HashMap被new出来有没有默认size

HashMap被new出来时,默认size是16。

11、HashMap的key和value是否可以为空

HashMap的key和value都可以为空,但是需要注意的是,如果key为空,它只能与null进行比较。如果value为空,则可以将null值作为value存储在HashMap中。

12、Collections.sort()这个方法使用的是什么排序算法

Java中Collections.sort()方法默认使用的是归并排序算法,时间复杂度为O(nlogn)。

13、排序算法的稳定性指的是什么

排序算法的稳定性指的是在排序过程中,对于相等的元素,在排序前和排序后的位置顺序是一致的。如果排序算法是稳定的,相当于对于相等元素的顺序没有改变,如果不稳定,则相等元素的顺序可能会发生改变。

14、做后端时是怎么和前端约定接口的

对于前后端约定接口,通常可以遵循以下方案:
1.制定接口文档:在项目开发之前,前后端共同讨论和制定接口文档,明确每个接口的请求方式、参数、响应数据等信息,以便于双方开发。
2.使用统一的命名规范:在接口命名上,可以根据业务逻辑和功能进行命名,并且使用统一的命名规范,方便前后端开发进行沟通和协调。
3.联调测试:前后端在开发接口的过程中,需要有一定的联调测试,确保接口的实现和调用正确无误。
4.接口维护:在项目上线后,需要及时维护接口,包括更新文档、优化接口实现、修复漏洞等。
总的来说,前后端约定接口需要双方进行充分沟通和协调,做到规范化、及时性和有效性。

七、美团一面

1、分布式事务场景题

可能存在多个数据库或服务之间的数据交互,需要维护数据的一致性,这就需要使用分布式事务。Java中常见的分布式事务场景包括:跨多个数据库的事务场景(例如一个订单需要同时在订单数据库和库存数据库中更新)、跨多个消息队列的事务场景、跨多个Web服务(例如一个购物车需要从多个不同应用的服务中获取商品信息并且在结算时保证数据的一致性)的事务场景等。在以上场景中,需要使用事务管理器来协调多个事务,确保数据的一致性。

2、数据库redis缓存一致

Redis缓存一致性是指当数据发生变化时,缓存中的数据与数据库中的数据保持一致。具体实现方式可以通过key的过期时间、缓存刷新、读写分离等策略来完成。这样可以提高系统的读取性能,降低数据库的读取压力。

3、索引基础

Java中的索引基础包括主键索引、唯一索引、普通索引(非唯一索引和全文本索引)。主键索引是一种唯一索引,用于确保表中每行的唯一性,通常是表中的主键列。唯一索引与主键索引类似,但允许空值。普通索引用于提高查询效率,可以包括多列。全文本索引用于对文本字段进行全文搜索。

4、Java线程池

Java 线程池是一种通过维护一个线程集合来重复使用线程的机制,用于处理大量的短暂任务。线程池的目的是提高程序的效率和简化线程管理。当任务到达时,它们被放入队列中,然后在线程池中的线程将从队列中提取任务并执行它。完成后,线程可以回到线程池中等待下一个任务,而不是被销毁。
线程池还可以通过限制最大并发线程数来避免资源耗尽。当大量线程同时运行时,它们可能会消耗大量的系统资源,例如 CPU 和内存,并导致程序运行缓慢甚至崩溃。通过使用线程池,开发人员可以限制程序中的并发线程数,从而提高程序的稳定性和性能。

5、volatile关键字

使用volatile关键字来保证多线程情况下变量的可见性和顺序性。当一个变量被声明为volatile时,每次访问这个变量时,都会从主内存中读取最新值;每次写入这个变量时,都会立即将其更新到主内存中。这样可以保证多个线程看到的变量值一致,从而避免出现线程安全问题。同时,使用volatile关键字还可以指定变量的顺序性,即保证变量的写入顺序和真实执行顺序一致,从而避免出现写入顺序和执行顺序不一致的情况。

6、主从复制

主从复制是指在分布式系统中,一台服务器(主服务器)与其他服务器(从服务器)的数据同步方式。在主从复制中,主服务器会将它的数据库中的数据实时同步到从服务器上,从服务器则会对主服务器上的数据进行备份。这样一来,即使主服务器出现故障,从服务器上也可以使用最新的数据进行操作,从而保证了系统的可用性。

7、rpc调用过程

RPC调用是一种远程调用的通信机制,允许应用程序在不同的操作系统或服务器之间进行通信和数据交换。Java后端开发中的RPC调用过程通常包括:客户端通过调用本地接口发起RPC调用请求,然后将请求数据转换为字节流并将其发送到服务器。服务器接收到请求后,将其转换为相应的调用并执行,然后将结果序列化为字节流,并将其发送回客户端。客户端接收到响应后,将其反序列化为相应的结果数据并返回给调用方。RPC调用过程中,客户端和服务器之间的通信通常使用TCP/IP协议完成。

8、服务注册与发现

服务注册与发现(Service Registration and Discovery)是一种分布式架构模式,用于在系统中动态地注册、注销和发现服务。在Java开发中,通常使用一些框架来实现服务注册与发现,如Zookeeper、Consul、Eureka等。这些框架提供了一些API来注册和发现服务,并且能够处理负载均衡、故障转移等问题,以提高系统的可靠性和可伸缩性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值