面试相关问题总结

字节:

体会:面试时候一定带上本子纸笔,不会的技术问题随时随地记录~

1.扫码登陆你有什么思路?

2.setnx和setex区别是什么?

介绍几个常用的redis命令:

SET 命令

set key value

设置指定 key 的值为 value。

如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。

127.0.0.1:6379> set testSetKey aaa
OK
127.0.0.1:6379> get testSetKey
"aaa"
127.0.0.1:6379> set testSetKey bbb  # 会覆写旧值
OK
127.0.0.1:6379> get testSetKey
"bbb"

SETEX 命令

setex key seconds value

设置指定 key 的值为 value,并将 key 的过期时间设为 seconds (以秒为单位)。

如果 key 已经存在, SETEX 命令将会替换旧的值。

127.0.0.1:6379> setex testSetexKey 60 aaa   # 设置过期时间为60秒
OK
127.0.0.1:6379> get testSetexKey   # 有效期内获取
"aaa"
127.0.0.1:6379> get testSetexKey   # 时间过期后再次获取返回 nil
(nil)
127.0.0.1:6379> setex testSetexKey 60 aaa
OK
127.0.0.1:6379> get testSetexKey
"aaa"
127.0.0.1:6379> setex testSetexKey 60 bbb    # 替换旧值
OK
127.0.0.1:6379> get testSetexKey
"bbb"

SETNX 命令

setnx key value

设置指定 key 的值为 value,只有在 key 不存在时设置 key 的值。

setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。

设置成功,返回 1 。 设置失败,返回 0 。

127.0.0.1:6379> setnx testSetnxKey aaa
(integer) 1
127.0.0.1:6379> get testSetnxKey
"aaa"
127.0.0.1:6379> setnx testSetnxKey bbb  # 当key值存在时,返回0
(integer) 0
127.0.0.1:6379> get testSetnxKey
"aaa"

GETSET 命令

getset key value

设置指定 key 的值为 value,并返回 key 的旧值(old value)。

返回给定 key 的旧值。 当 key 没有旧值时,即 key 不存在时,返回 nil 。

当 key 存在但不是字符串类型时,返回一个错误。

127.0.0.1:6379> getset testGetsetKey aaa  # 没有旧值时,返回 nil
(nil)
127.0.0.1:6379> get testGetsetKey
"aaa"
127.0.0.1:6379> getset testGetsetKey bbb  # 返回旧值
"aaa"
127.0.0.1:6379> get testGetsetKey
"bbb"

3.http协议有哪些函数?

4.500状态码可能是哪些问题?

信息响应 (100–199)
成功响应 (200–299)
重定向消息 (300–399)
客户端错误响应 (400–499)
服务端错误响应 (500–599)

什么是重定向:重定向 是一种常见的技术,用于在浏览器请求页面时将用户重定向到另一个页面。

重定向可以出于多种原因发生,包括但不限于以下几个方面:

1. URL更改: 当网站的URL结构变更时,为了保持用户体验和链接的有效性,服务器可能会对旧URL进行重定向到新的URL。
2. 页面跳转: 当网页需要实现页面跳转功能时,可以通过重定向操作将用户从一个页面导航到另一个页面。
3. 访问权限限制: 当网站需要实现访问控制功能时,可以通过重定向将未经授权的用户重定向到登录页面或错误页面。

以下是几种常见的重定向方法:

1. 301重定向: 表示永久重定向,服务器返回该状态码后,浏览器会缓存这个重定向,将请求自动发送到新的URL。
2. 302重定向: 表示临时重定向,服务器返回该状态码后,浏览器会在每次请求时都重定向到新的URL。
3. 303重定向: 表示查看其他位置,服务器返回该状态码后,浏览器会使用GET方法发送新的请求。
4. 307重定向: 表示临时重定向,类似于302,但要求客户端保持请求方法不变。

为了解决重定向问题,我们可以采取以下几种方法:

1. 更新URL: 如果重定向是因为URL更改而发生的,我们可以更新网站的链接和引用,将旧URL替换为新的URL。
2. 服务器端重定向: 在服务器端代码中处理重定向,可以通过在响应中设置相关的状态码和重定向URL来实现。
3. 客户端重定向: 在客户端代码中处理重定向,可以使用浏览器提供的重定向API或JavaScript进行相关的操作。
4. 代理重定向: 在代理服务器中处理重定向,在代理服务器上配置相关的规则和重定向逻辑。

5.进程、线程、协程?什么是协程?

进程是程序执行的过程,包括了动态创建、调度和消亡的整个过程,进程是程序资源管理的最小单位

线程是操作操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运作单位,一个进程内可以包含多个线程,线程是资源调度的最小单位。

****协程 Coroutines 是一种比线程更加轻量级的微线程。**类比一个进程可以拥有多个线程,一个线程也可以拥有多个协程,因此协程又称微线程和纤程。可以粗略的把协程理解成子程序调用,每个子程序都可以在一个单独的协程内执行。
**

6.手撕一道利用给出的数组,可重复的拼接出最大且小于目标数的一个题目!

体会:一定要快速的手撕,先有思路,有了思路之后,速度要快,姿势要帅!最短时间内编程~

7.堆和数区别

堆是一种特殊的完全二叉树,只不过父亲与儿子节点间有关系。也就是首先要满足完全二叉树的定义,只有右下角可能有缺。

所有父结点都比子结点要小的完全二叉树我们称为最小堆(Java中的优先级队列PriorityQueue默认最小堆)。反之,如果所有父结点都比子结点要大,这样的完全二叉树称为最大堆。

4399薄弱:–》八股文整体还是薄弱,各方面的熟悉应该加强

1、MQ相关,消息队列相关内容加强

2、归并排序为什么是Nlog(N)的时间复杂度?

3、申请情况会报oom的异常,总结下

①堆内存不足(最常见)

java.lang.OutOfMemoryError: Java heap space

原因

1、代码中可能存在大对象分配

2、可能存在内存泄露,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象。

解决方法

1、检查是否存在大对象的分配,最有可能的是大数组分配

2、通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄露的问题

3、如果没有找到明显的内存泄露,使用 -Xmx 加大堆内存

4、还有一点容易被忽略,检查是否有大量的自定义的 Finalizable 对象,也有可能是框架内部提供的,考虑其存在的必要性

②永久代/元空间溢出

java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Metaspace

原因

出现永久代或元空间的溢出的原因可能有如下几种:

1、在Java7之前,频繁的错误使用String.intern方法

2、生成了大量的代理类,导致方法区被撑爆,无法卸载

3、应用长时间运行,没有重启

解决方法

永久代/元空间 溢出的原因比较简单,解决方法有如下几种:

1、检查是否永久代空间或者元空间设置的过小

2、检查代码中是否存在大量的反射操作

3、dump之后通过mat检查是否存在大量由于反射生成的代理类

4、放大招,重启JVM

③GC overhead limit exceeded

java.lang.OutOfMemoryError:GC overhead limit exceeded

原因

这个是JDK6新加的错误类型,一般都是堆太小导致的。 Sun 官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。

解决方法

1、检查项目中是否有大量的死循环或有使用大内存的代码,优化代码。

2、添加参数-XX:-UseGCOverheadLimit 禁用这个检查,其实这个参数解决不了内存问题,只是把错误的信息延后,最终出现 java.lang.OutOfMemoryError: Java heap space。

3、dump内存,检查是否存在内存泄露,如果没有,加大内存。

④方法栈溢出

java.lang.OutOfMemoryError : unable to create new native Thread

原因

出现这种异常,基本上都是创建的了大量的线程导致的,以前碰到过一次,通过jstack出来一共8000多个线程。

解决方法

1、通过 *-Xss *降低的每个线程栈大小的容量

2、线程总数也受到系统空闲内存和操作系统的限制,检查是否该系统下有此限制:

/proc/sys/kernel/pid_max

/proc/sys/kernel/thread-max

max_user_process(ulimit -u)

/proc/sys/vm/max_map_count

4、java中List初始化的几种方法

1、构造 List 后使用 List.add 初始化
1 List<String> stringList = new LinkedList<>();
2 stringList.add("a");
3 stringList.add("b");
4 stringList.add("c");

这是最常规的做法,用起来不太方便。

2、使用 {{}} 双括号语法
1 List<String> stringList = new LinkedList<String>(){{
2     add("a");
3     add("b");
4     add("c");
5 }};

这种相对方便一些。外层的 {} 定义了一个 LinkedList 的匿名内部类。内层的 {} 的定义了一个实例初始化代码块。 这个代码块在初始化内部类时执行。所以这里相当于定义了一个匿名内部类,并使用 add 添加元素来初始化。

这种方式有几个缺点:

  • 使用匿名内部类,会有效率上的损失。当然在大多数情况下,这点效率都是可接受的。
  • 静态内部类持有所在外部类的引用。如果需要将 List 返回给到其他地方使用,可能造成内存泄漏。
3、使用 Arrays.asList
1 List<String> stringList = Arrays.asList("a", "b", "c");

这种方式使用了 java.util.Arrays 的静态方法。写法上比之前的两种都更简洁,也没有构造匿名内部类的效率问题。

但也有几点需要注意:

  • Arrays.asList 返回的是 Arrays 的静态内部类(静态内部类不持有所在外部类的引用)。
    这个内部类继承自 AbstractList,实现了 RandomAccess,内部使用了一个数组来存储元素。但是不支持增删元素。这点需要注意。如果只是使用 Arrays.asList 来初始化常量,那么这点就不算什么问题了。
  • Arrays.asList 的参数如果是基本类型的数组时,需要留意返回值可能和你预期的不同。
1 int[] intArray = new int[]{1, 2, 3};
2 Integer[] integerArray = new Integer[]{1, 2, 3};
3 
4 List<int[] > intArrayList = Arrays.asList(intArray);
5 List<Integer> integerList = Arrays.asList(integerArray);
6 List<Integer> integerList2 = Arrays.asList(1, 2, 3);

这里 Arrays.asList(intArray) 的返回值是 List<int[]> 而不是 List。这一点也算不上问题,只是使用时需要留意。如果能在 Java 中做到尽量使用 List 和 Integer,尽量避免使用 int 等基本类型和 [] 这种较为底层的数据结构即可避免。

] > intArrayList = Arrays.asList(intArray);
5 List integerList = Arrays.asList(integerArray);
6 List integerList2 = Arrays.asList(1, 2, 3);


这里 Arrays.asList(intArray) 的返回值是 List<int[]> 而不是 List。这一点也算不上问题,只是使用时需要留意。如果能在 **Java 中做到尽量使用 List 和 Integer,尽量避免使用 int 等基本类型和 [] 这种较为底层的数据结构即可避免。**

**虽然本文是在讲初始化 List,但这里的 {{}} 双括号语法同样可用于初始化 Map 等其他众多类型。相对而言,Arrays.asList 就只能用于初始化 List 类型了。**
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之所向521

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值