这些全是面试中真实问到的问题,我看到不会回答,所以记录下来

看一下,学一下
https://www.nowcoder.com/discuss/352030?type=post&order=time&pos=&page=2&channel=666&source_id=search_post

https://www.nowcoder.com/discuss/494464?type=post&order=time&pos=&page=4&channel=666&source_id=search_post

Redis相关

Redis与Memcached的区别

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据

Redis为什么这么快?然后问I/O多路复用,数据类型,单线程模型

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用多路 I/O 复用模型,非阻塞 IO;因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

Redis为何要采用单线程模型?会有什么问题?

1.CPU不是redis的瓶颈
2.redis的瓶颈主要在内存大小和网络的快慢
3.redis的tps能达到百万级(这已经够快了)

redis实现分布式锁?

Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系,Redis中可以使用SETNX命令实现分布式锁。当且仅当 key 不存在,将 key 的值设为 value。 若给定的 key 已经存在,则 SETNX 不做任何动作。
解锁:使用 del key 命令就能释放锁
解决死锁:
1)通过Redis中expire()给锁设定最大持有时间,如果超过,则Redis来帮我们释放锁。

redis分布式锁流程,如何解决缓存雪崩问题

使用SETNX完成同步锁的流程及事项如下:1:使用SETNX命令获取锁,若返回0(key已存在,锁已存在)则获取失败,反之获取成功
2:为了防止获取锁后程序出现异常,导致其他线程/进程调用SETNX命令总是返回0而进入死锁状态,需要为该key设置一个“合理”的过期时间
3:释放锁,使用DEL命令将锁数据删除缓存雪崩:缓存同一时间大面积失效,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。解决方案:
1:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2:一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
3:给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

redis的分布式锁,超时时间以及时间续约?
参考:https://blog.csdn.net/wutengfei_java/article/details/100699538
setnx和redlock实现分布式锁
此外,redisson客户端也可以实现Redis分布式锁

Redis锁的过期时间小于业务的执行时间该如何续期?默认情况下,加锁的时间是30秒.如果加锁的业务没有执行完,那么到 30-10 = 20秒的时候,就会进行一次续期,把锁重置成30秒.
那这个时候可能又有同学问了,那业务的机器万一宕机了呢?宕机了定时任务跑不了,就续不了期,那自然30秒之后锁就解开了呗.

15.redis的数据类型 5种,关键是特点以及使用场景

String: 可以包含任何数据
List: 双向链表
Hash:键值对集合(Map),适合存储对象
Set:哈希表实现,元素不重复
Zset:通过跳表实现,将Set中的元素增加一个权重参数score,元素按score有序排列

16.hash,set,zset的使用场景

list: 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
hash:存储、读取、修改用户属性
set:1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,求朋友圈的交集,大于某个阈值就可以推荐
zset: 1、排行榜 2、带权重的消息队列

17.zset内部实现

跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)在链表上实现二分查找,维护更多的链表(由二分节点组成)

redis持久化是什么,持久化的方式都有哪些
redis做持久化了吗,怎么保证rdb的完整性
为了保证RDB文件的完整性会在文件末尾加入一个CRC64的校验码。

RDB是Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到磁盘上,
对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。AOF:Redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似于MySQL的binlog。当
Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

4 redis怎么实现事务

Redis事务通常会使用MULTI,EXEC,WATCH等命令来完成.
Redis事务分为三个阶段:
事务开始 MULTI
命令入队
事务执行 EXECWATCH 命令是一个乐观锁,可以为 Redis 事务提供 check-and-set (CAS)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令。
UNWATCH命令可以取消watch对所有key的监控

Redis缓存如何保证一致性

先更新数据库,然后再删除缓存。
不一致发生时:写数据库成功,但写缓存失败,则下次读取(并发读)缓存时,则读不到数据
解法方法是:假如读缓存失败,先读数据库,再回写缓存的方式实现

Redis的事务和Mysql事务是一样的吗? 不一样

Mysql事务是满足ACID特性的一组操作redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。不满足原子性,持久性

介绍一下redis,为什么用redis,你项目中redis用来干什么

redis的内存淘汰策略(问过无数次,基本是必问)

1: 全局的键空间选择性移除
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。2: 设置过期时间的键空间选择性移除
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

多线程与高并发

同步代码块中怎么释放锁?Object.wait() 的底层原理是什么?或者说 wait() 和 notify() 的机制在底层是怎么实现的?
https://www.jianshu.com/p/f4454164c017

释放锁看你加的什么锁,像synchronized会自动释放锁,reentrantLock需要手动释放,调用lock.unlock()在HotSpot虚拟机中,monitor采用ObjectMonitor实现
ObjectMonitor对象中有两个队列:_WaitSet 和 _EntryList
_WaitSet:处于wait状态的线程,会被加入到wait set;
_EntryList:处于等待锁block(阻塞)状态的线程,会被加入到entry set;Object.wait()方法最终通过ObjectMonitor的void wait(jlong millis, bool interruptable, TRAPS)实现:
1、将当前线程封装成ObjectWaiter对象node;
2、通过ObjectMonitor::AddWaiter方法将node添加到_WaitSet列表中;
3、通过ObjectMonitor::exit方法释放当前的ObjectMonitor对象,这样其它竞争线程就可以获取该ObjectMonitor对象。
4、最终底层的park方法会挂起线程;Object.notify()方法最终通过ObjectMonitor的void notify(TRAPS)实现:
1、如果当前_WaitSet为空,即没有正在等待的线程,则直接返回;
2、通过ObjectMonitor::DequeueWaiter方法,获取_WaitSet列表中的第一个ObjectWaiter节点
3、根据不同的策略,将取出来的ObjectWaiter节点,加入到_EntryList或则通过Atomic::cmpxchg_ptr指令进行自旋操作cxq,notifyAll方法实现
lock.notifyAll()方法最终通过ObjectMonitor的void notifyAll(TRAPS)实现:
通过for循环取出_WaitSet的ObjectWaiter节点,并根据不同策略,加入到_EntryList或则进行自旋操作。

JUC 包下常用的锁有哪些?ReentrantLock 中有个 Condition ,你了解吗,一般怎么使用?

java 1.5 出现的显式协作Condition接口的 await、signal、signalAll 也可以说是普通并发协作 wait、notify、notifyAll 的升级;
普通并发协作 wait、notify、notifyAll 需要与synchronized配合使用,
显式协作Condition 的 await、signal、signalAll 需要与显式锁Lock配合使用(Lock.newCondition()),
调用await、signal、signalAll方法都必须在lock 保护之内。

讲一下对池化技术的理解?

提前创建好需要用到的资源,把这些资源放到一个池子里统一管理,
当需要的时候去池子里面取出来,当用完后再放回池子里,复用相同的资源,减少新建和销毁的开销。
比如java线程池,java 内存池,数据库连接池

怎么实现一个线程池?工作线程,任务队列?
如果任务队列是空的,线程池中的核心线程是什么状态? parked状态,不是阻塞?
三、线程的几种状态,线程池中的空闲的线程处于什么状态?

**停止,Parked**(此状态必须明确,与字面意思不同,主要是指线程空闲时候的状态.如在线程池中,当线程被调用使用后再次放入到池子中,则其状态变为了Parked)
parked状态的由来:只有被使用过的线程再次放入线程池中才被赋予这种状态

3.线程池参数以及线程池的流程 7大参数
4.线程池的抛弃策略 4个策略
5.停止线程池,停止时会接新的任务嘛? 线程池的状态

停止状态(STOP):此状态下,线程池不接受新任务,也不处理阻塞队列中的任务,
反而会尝试结束执行中的任务。当工作线程数为0时,进入整理(TIDYING)状态。

2.你知道哪些线程池? 4种线程池
9.java线程池,拒绝策略**
9. 线程池的关键结构有哪些
线程池的原理和工作流程介绍一下,线程数量怎么配置?

1:当调用execute()方法添加一个任务请求时,线程池会做如下判断:1.1 正在执行的线程小于核心线程数,立即创建新线程执行这个任务1.2 正在执行的线程大于等于核心线程数,把任务放到阻塞队列中1.3 当阻塞队列满了,正在执行的线程小于最大线程数,创建非核心线程执行这个任务1.4 当阻塞队列满了,正在执行的线程大于等于最大线程数,执行饱和策略
2:线程执行完一个任务后,从阻塞队列中取出下一个任务来执行
3:当线程空闲时间超过设置的存活时间时,标记为可回收的

线程池有哪些参数,执行流程是怎样的?有哪些常用 BlockingQueue,区别是什么?拒绝策略有哪些?
线程池的原理和工作流程介绍一下,线程数量怎么配置?
线程池的阻塞队列怎么选择,会出现阻塞的情况吗?

3种阻塞队列,各自的区别
ArrayBlockingQueue  基于数组,先进先出
LinkedBlockingQueue 基于链表,先进先出,吞吐量比Array大
SynchronousQueue:不存储元素的阻塞队列,生产一个消费一个阻塞队列是有界的,当队列为空或为满时会阻塞

3.线程池为什么有一个阻塞队列,为什么一定要是阻塞的?

当阻塞队列为空的时候,从队列中取元素的操作就会被阻塞。
当阻塞队列满的时候,往队列中放入元素的操作就会被阻塞。
然后,一旦空队列有数据了,或者满队列有空余位置时,被阻塞的线程就会被自动唤醒。这就是阻塞队列的好处,你不需要关心线程何时被阻塞,也不需要关心线程何时被唤醒,
一切都由阻塞队列自动帮我们完成。我们只需要关注具体的业务逻辑就可以了。

线程池的五大状态

运行状态(RUNNING):此状态下,线程池可以接受新的任务,也可以处理阻塞队列中的任务。执行shutdown()方法可进入待关闭(SHUTDOWN)状态,执行shutdownNow()方法可进入停止(STOP)状态。待关闭状态(SHUTDOWN):此状态下,线程池不再接受新的任务,但会继续处理阻塞队列中的任务。当阻塞队列中的任务为空,且工作线程数为0的时候,进入整理(TIDYING)状态。停止状态(STOP):此状态下,线程池不接受新任务,也不处理阻塞队列中的任务,反而会尝试结束执行中的任务。当工作线程数为0时,进入整理(TIDYING)状态。整理状态(TIDYING):此状态下,所有任务都已经执行完毕,且没有工作线程。执行terminated()方法进入终止(TERMINATED)状态。终止状态(TERMINATED):此状态下,线程池完全终止,并完成了所有资源的释放。

线程池中shutdown() 和 shutdownNow() 有什么区别?

执行shutdown()方法可进入待关闭(SHUTDOWN)状态,执行shutdownNow()方法可进入停止(STOP)状态。

java有哪些锁(悲观乐观,自旋互斥,读写锁,锁的分类,好像马士兵课件有

乐观锁/悲观锁 版本号机制和CAS算法实现, synchronized和ReentrantLock等独占锁就是悲观锁独享锁/共享锁,synchronized和ReentrantLock等独占锁,Semaphore、CountDownLatch 是共享锁
互斥锁/读写锁 ReentrantLock,ReadWriteLock
可重入锁:synchronized和ReentrantLock
公平锁/非公平锁:synchronized是非公平的,ReentrantLock默认非公平,也可以公平
分段锁:conCurrentHashMap使用分段锁
偏向锁/轻量级锁/重量级锁:synchronized锁升级的过程
自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

5、synchronized之后的1.6之后的升级过程,以及与lock的区别?

无锁->偏向锁->轻量级锁->重量级锁

10.保证线程安全的方式,CAS优化,AQS,以及AQS是否可以实现非公平锁
synchronized详细的原理,其他未获取锁的线程会阻塞在哪里

synchronized详细的原理,讲的是锁的升级过程,然后把里面详细说一下
重量级锁,获取锁失败的线程放进阻塞队列中,等待持有锁的线程释放锁后唤醒阻塞队列队头的线程

锁释放后,其他线程是如何竞争的?? 我不会

非公平锁,阻塞队列队头的线程与新来的线程进行竞争

synchronized 和 ReentrantLock 区别?ReentrantLock 实现原理,AQS 原理,CountdownLatch 和 Semaphore 的作用?

CountDownLatch一般用于线程A等待若干个其他线程执行完任务之后,它才执行;(秦灭六国,再一统华夏,做减法)CyclicBarrier通过它可以实现让一组线程等待await()至某个状态之后再全部同时执行(集合七颗龙珠才能召唤神龙,做加法)。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。Semaphore是用来协调多个线程来访问共享资源,以保证合理的使用公共资源(获取资源做减法,释放资源做加法)
通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
用于做流量控制,特别公用资源有限的应用场景

假设要求线程t1执行完后,线程t2才能执行,有哪些实现方式?

- 在线程t2中调用线程t1的join方法.表示t2需要等待t1执行完才执行

ThreadLocal相关
ThreadLocal 原理,线程池中使用 ThreadLocal 会有什么问题,为什么?软引用和弱引用有什么区别?

3.start和run方法 区别

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。
run(): run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

停止一个正在运行的线程

如何停止java的线程一直是一个困恼我们开发多线程程序的一个问题。
这个问题最终在Java5的java.util.concurrent中得到了回答:
使用interrupt(),让线程在run方法中停止。其他方法:
已废弃的Thread.stop(),不安全
最佳实践:共享条件变量
通过条件变量控制线程的执行,线程内部检查变量状态,外部改变变量值可控制停止执行。
为保证线程间的即时通信,需要使用使用volatile关键字或锁,确保读线程与写线程间变量状态一致。

多线程中interrupted 和 isInterrupted 方法的区别

interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真正的停止线程interrupted()是静态方法,它调用的是currentThread().isInterrupted(true)方法,即说明是返回当前线程的是否已经中断的状态值,而且有清理中断状态的机制。isInterrupted()是一个实例方法,它调用的是isInterrupted(false)方法,意思是返回线程是否已经中断的状态,它没有清理中断状态的机制。

JVM

9、CMS和G1的优缺点,G1能百分百保证在指定时间内完成回收吗
它允许设置一个停顿的时间,然后每次都尽可能地在指定的时间内完成部分回收的任务,只能是大概率实现,不能百分百保证在指定的时间内完成。

CMS:回收老年代,并发低停顿垃圾收集器
四个过程:初始标记,并发标记,重新标记,并发清理
缺点:对CPU资源非常敏感,无法处理浮动垃圾,产生大量的碎片G1:既可以回收新生代也可以回收老年代
过程:1、初始标记;2、并发标记;3、最终标记;4、筛选回收
特点:并行与并发,分代收集,空间整合,可预测的停顿G1的内存布局不一样,它把java堆划分为多个大小相等的独立区域,G1跟踪每一个区域的垃圾堆的价值大小,在后头维护一个优先队列,每次根据允许的收集时间,优先回收价值大的区域。价值是回收锁获得的空间大小以及所花的时间的经验值。使用Remembered set 来避免全堆扫描,缺点
1:G1需要额外占用10%~20%的空间来维护一个记忆集,因此空间上的开销要大一点,在小内存的环境下难以发挥优势,因为每次都只回收部分的分区,如果内存小,那么可能会来不及回收。
2:G1在回收期间的写屏障会消耗相应的性能,会给程序的执行造成一定的负担。
  1. JVM内存模型,分代收集算法,什么时候分配在栈,什么时候分配在堆,内存泄漏出现的场景
内存溢出(OOM):程序没有足够的内存使用时,就会发生内存溢出。内存溢出后程序基本上就无法正常运行了。
内存泄漏:当程序不能及时释放内存,导致占用内存逐渐增加,就是内存泄漏。
内存泄漏一般不会导致程序无法运行。不过持续的内存泄漏,累积到内存上限时,就会发生内存溢出。
在Java中,如果发生内存泄漏,会导致GC回收不彻底,每次GC后,堆内存使用率逐渐增高。ThreadLocal就会可能会导致内存泄漏

讲一下ClassLoader?

在类加载阶段“通过类名来获取描述此类的二进制字节流”
以便让应用程序自己决定如何去获取自己所需要的类,实现这个动作的代码模块称为类加载器
类加载器的类型
四种类加载器
双亲委派机制

对JVM的理解。这里谈到了编译的问题。
聊一聊JVM的编译怎么搞的?
聊聊熟悉的垃圾收集器。
4、问jvm内存模型
5、说说Java垃圾回收是怎么做的

什么是垃圾?
怎么找到垃圾?
什么时候回收垃圾? Minor GC和Full GC的触发条件
垃圾后怎么清除? 垃圾收到算法

java相关

String的intern()方法

当调用 intern 方法时,如果常量池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。
否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

1.ArrayList和LinkedList的 get(0)方法那个更快点(???) 访问元素感觉ArrayList效率高

ArrayList: get(int):获取某个位置下的元素,时间复杂度为O(1)
LinkedList:get(int index):返回此链表中指定位置处的元素。如果在上半部分,从上往下遍历,如果在下半部分,从后往前遍历

java的异常体系?项目中是怎么使用异常的?受检非受检?
5.java反射机制,泛型

框架中什么地方用到了反射?

反射是框架的灵魂,它可以有效地降低类之间的耦合,很多框架都运用了反射原理,
例如hibernate 的实体类,Spring 的 AOP等等都有反射的实现
Spring:
用 IoC 来注入和组装 bean
动态代理、面向切面、bean 对象中的方法替换与增强,也使用了反射
定义的注解,也是通过反射查找

Java的反射机制了解吗?讲一下java的反射?

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

反射机制中获得实例的方式有几种?分别是什么?

获取类对象有3种方式
Class.forName()(常用)
User.class
new User().getClass()//第一种:Class.forName()
String objStr = "itat.zttc.model.User";
Class clz = Class.forName(objStr);    //获得Class对象
User u = (c)clz.newInstance();     //在这创建了User对象
//获取类对象的第二种方式
Class pClass2 = User.class;
//获取类对象的第三种方式
Class pClass3 = new User().getClass();1. Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象;多用于配置文件,将类名定义在配置文件中,通过读取配置文件加载类。
2. 类名.class:通过类名的属性class获取;多用于参数的传递;需要导包,依赖性强
3. 对象.getClass():此方法是定义在Objec类中的方法,因此所有的类都会继承此方法。多用于对象获取字节码的方式
4. Class.forName()在运行时加载;类.class和getClass()是在编译时加载

getClass和forName得到的Class实例是同一个实例还是不同的实例?


讲一下Spring的IOC?
说一下springIOC
问了一下 Spring中的问题,一开始也尬住了,面试官提示想想 AOP,

10、Java怎么实现定时任务
阻塞和非阻塞?同步和异步?Java的线程模型?

HashMap一个线程正在扩容,另一个线程在加数据,另一个在删数据,如何处理?
1.8的HashMap的线程不安全体现在哪里

首先HashMap是线程不安全的,其主要体现:
#1.在jdk1.7中,在多线程环境下,扩容时会造成环形链或数据丢失。
#2.在jdk1.8中,在多线程环境下,会发生数据覆盖的情况。

SimpleDateFormat线程安全吗?为什么 不安全

parse()方法不安全

HashMap到1.8之后改头插法为尾插法,避免了死循环,具体的原理是什么
jdk1.7多线程环境下HashMap容易出现死循环,jdk1.8是怎么优化的呢?

因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。多线程同时插入到链表时发生死循环
但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。
直接在末尾插入对应元素,不会变化原Node的next关系,所以不会出现死循环

9. 工作内存

10. 注解,常用哪些呢?

Java 注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。内置注解:
@override  重写
@Deprecated 已废弃的,经常看到
@SuppressWarnings: 抑制编译时的警告信息元注解:注解其他注解
@Target: 注解的使用范围
@Retention: 描述注解的生命周期
@Document:注解被包含在javadoc中
@Inherited: 子类继承父类spring注解:

12. 动态代理

JDK 动态代理
CGLib 动态代理
使用 Spring aop 模块完成动态代理功能

43、谈谈JDK静态代理、动态代理、cglib动态代理的区别和优缺点。

JDK静态代理
是代理类与委托类实现同一接口,并且在代理类中需要硬编码接口;
优点:实现简单,容易理解。
缺点:代理类需要硬编码接口,不能实现运行时反射;JDK动态代理
代理类与委托类实现同一接口,主要是通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中将对方法进行增强处理,底层使用反射机制进行方法的调用。
优点:不需要硬编码接口,代码复用率高;
缺点:只能够代理实现了接口的委托类,不能针对类;CGLIB动态代理
代理类将委托类作为自己的父类并为其中的非final委托方法创建两个方法,一个是与委托方法签名相同的方法,它在方法中会通过super调用委托方法;另一个是代理类独有的方法。在代理方法中,它会判断是否存在实现了MethodInterceptor接口的对象,若存在则将调用intercept方法对委托方法进行代理。底层将方法全部存入一个数组中,通过数组索引直接进行方法调用。
优点: 可以在运行时对类或者是接口进行增强操作,且委托类无需实现接口。
缺点:不能对final类以及final方法进行代理。

4.object的常见方法(回答不是很好,没有全部说完) 9个函数

public final native Class<?> getClass(); 获取类结构信息
public native int hashCode() 获取哈希码
public boolean equals(Object) 默认比较对象的地址值是否相等,子类可以重写比较规则
protected native Object clone() throws CloneNotSupportedException 用于对象克隆
public String toString() 把对象转变成字符串
public final native void notify() 多线程中唤醒功能
public final native void notifyAll() 多线程中唤醒所有等待线程的功能
public final void wait() throws InterruptedException 让持有对象锁的线程进入等待
public final native void wait(long timeout) throws InterruptedException 让持有对象锁的线程进入等待,设置超时毫秒数时间
public final void wait(long timeout, int nanos) throws InterruptedException 让持有对象锁的线程进入等待,设置超时纳秒数时间
protected void finalize() throws Throwable 垃圾回收前执行的方法
finalize()方法中一般用于释放非Java 资源(如打开的文件资源、数据库连接等),或是调用非Java方法(native方法)时分配的内存

5.重写equals和hashcode

1. 重写equals
假设现在有很多学生对象,
默认情况下,要判断多个学生对象是否相等,需要根据地址判断,若对象地址相等,那么对象的实例数据一定是一样的,
但现在我们规定:当学生的姓名、年龄、性别相等时,认为学生对象是相等的2. student1和student2在重写equals方法后被认为是相等的。
在两个对象相等的情况下进行把他们分别放入Set中,默认计算的hashcode会是不一致的,所以我们需要重写hashcode()函数,只要姓名和学号的hashcode值一致就认为这两个学生等价

抽象类和接口的区别,什么场景使用抽象类比较好

① 抽象类有构造方法,接口没有构造方法
② 抽象类可以包含普通方法,接口中只能是public abstract修饰抽象方法(Java8之后可以)
③ 抽象类只能单继承,接口可以多继承
④ 抽象类可以定义各种类型的成员变量,接口中只能是public static final修饰的静态常量
④ 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范1.抽象类的使用场景
既想约束子类具有共同的行为(但不再乎其如何实现),又想拥有缺省的方法,又能拥有实例变量
如:模板方法设计模式,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现。2.接口的应用场景
① 约束多个实现类具有统一的行为,但是不在乎每个实现类如何具体实现
② 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
③ 实现类需要具备很多不同的功能,但各个功能之间可能没有任何联系。
④ 使用接口的引用调用具体实现类中实现的方法(多态)

new Integer(1) 和Integer.valueOf(1)的区别是什么

new Integer(1) :会新建一个对象;
Integer.valueOf(1) :使用对象池中的对象,如果多次调用,会取得同一个对象的引用。
Integer i = 1 等同于 Integer.valueOf(1)扩展:String s = "a" 和 String s = new String("a") 的区别是什么?
String s1 = "a" 时,首先会在字符串常量池中查找有无 “a” 这个对象。 若没找到,就创建一个 "a" 对象。
String s3 = new String("a") 时,将在堆里,创建一个 "a" 对象,

泛型了解吗?
泛型中类型检查是在编译阶段还是运行阶段?

泛型的本质是为了类型参数化,
操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法Java中的泛型,只在编译阶段有效。
在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。
也就是说,泛型信息不会进入到运行时阶段。

Java中的网络编程了解吗? 这是一大块知识


观察者模式和发布订阅模式的区别
https://zhuanlan.zhihu.com/p/51357583

1.先给你出个题吧 (a,b两个List, 泛型不同, a.Class()==b.Class() 输出啥 为什么)
2.父类private属性的变量,子类能直接super. 调用吗
不能,private只能类内访问

super(): 在子类中调用父类的属性或方法, 在子类中指代父类构造函数

3.一个类实现两个接口 两个接口里的方法名参数列表等都一样, 重写用的是哪个接口的方法(懵)

因为IFTest中的f()既是Type1中的f()也是Type2中的f()。因为既然IFTest这个类没有发生编译错误,那就说明它既实现Type1也实现了Type2,也就是说Type1中的f()与Type2中的f()在IFTest中是相安无事的如果两个接口有同名的方法,但是它们的返回值不一样,那么,是无法用一个类同时来实现这两个接口的。

TreeSet 和 HashSet 是怎么比较两个元素是否相等的?

HashSet内部使用hashMap来实现的,利用HashMap中Key的唯一性,来保证HashSet中不出现重复值
HashMap中的Key是根据对象的hashCode() 和 euqals()来判断是否唯一的。结论:为了保证HashSet中的对象不会出现重复值,在被存放元素的类中必须要重写hashCode()和equals()这两个方法。而treeset用comparable接口的compareTo()方法比较

Integer 和 Long 的 hashCode() 方法实现有什么区别?

32位: Integer就是很简单的重写了一下hashCode方法,返回的就是底层包装的基本数据类型int对应的数值value
64位:用64-bit的大数据类型(如Long)就要经过一些压缩处理,才能转成 int 类型hashCode
Long: 高32位和低32位的值进行异或操作,留下32位Int为hashcode值
Double: doubleToLongBits(), 返回的是高32位和低32位的值进行异或后的结果String: 以31为重,每一位字符的ASCII只进行计算,公式是:s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]

ConcurrentHashMap 原理,1.7 和 1.8 区别。


JDK 1.7 分段锁实现线程安全,锁定每一个数组下标对应的链表
JDK 1.8 采用了 CAS + synchronized 来保证并发安全性

设计模型

经常使用的,并且面试也经常问到的
单例,工厂

代理模式
建造者模式
观察者模式

原型
装饰器与适配器的区别

适配器模式被用于桥接两个接口,
而装饰模式的目的是在不修改类的情况下给类增加新的功能

计算机网络

SYN 攻击如何防止

  1. TCP粘包
    参考 https://blog.csdn.net/weixin_41047704/article/details/85340311

  2. HTTP还有哪些方法

  3. HEAD方法可以讲一下吗

  4. 1、http的幂等性问题,网络框架以及各层之间的协议都有什么?
    https为什么是安全的,SSL工作原理,数字签名,对称加密和非对称加密

  5. tcp四次挥手的状态,close_wait太多怎么检测和解决
    https://blog.csdn.net/libaineu2004/article/details/78886182

什么情况下,连接处于CLOSE_WAIT状态呢? 谁主动关闭链接,则对方则可能进入CLOSE_WAIT状态
在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。
通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。
但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。出现大量close_wait的现象:主要原因是某种情况下对方关闭了socket链接,但是我方忙于读或者写,没有关闭连接。
代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。
解决方法:基本的思想就是要检测出对方已经关闭的socket,然后关闭它。
1.代码需要判断socket,一旦read返回0,断开连接,read返回负,检查一下errno,如果不是AGAIN,也断开连接。(注:在UNP 7.5节的图7.6中,可以看到使用select能够检测出对方发送了FIN,再根据这条规则就可以处理CLOSE_WAIT的连接)
2.给每一个socket设置一个时间戳last_update,每接收或者是发送成功数据,就用当前时间更新这个时间戳。定期检查所有的时间戳,如果时间戳与当前时间差值超过一定的阈值,就关闭这个socket。
3.使用一个Heart-Beat线程,定期向socket发送指定格式的心跳数据包,如果接收到对方的RST报文,说明对方已经关闭了socket,那么我们也关闭这个socket。
4.设置SO_KEEPALIVE选项,并修改内核参数
  1. tcp/ip为什么分层
a.原因:因为计算机网络是一个复杂的系统,采用层次化结构的方法来描述它,可以将复杂的网络间题分解为许多比较小的、界线比较清晰简单的部分来处理;
b.好处:
1.每一层之间是独立的,某一层并不需要知道它的下一层是如何实现的,而仅仅需要知道该层通过层间的接口所提供的服务
2.灵活性好。当任何一层发生变化时,只要层间接口关系保持不变,则在这层以上或以下层均不受影响
8. 结构上可分割开。各层都可以采用最合适的技术来实现。技术的发展往往不对称的,层次化的划分有效避免了木桶效应,不会因为某一方面技术的不完善而影响整体的工作效率
9. 易于实现和维护
10. 能促进标准化工作
c.分层原则:分层的一般原则是将一组相近的功能放在一起,形成一个网络的结构层次。
  1. get和post的区别,post一定会发两个包嘛?
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
  1. 还有什么请求方法
    get post options put
    head delete connect trace

  2. TCP三次握手,在三次握手的过程中可以传输数据吗?为什么

TCP协议建立连接的三次握手过程中的第三次握手允许携带数据。
RFC793文档表示,第三次握手的ACK包是可以携带数据。当客户端发过来的第三次握手的ACK包含有数据时,服务端是可以正常处理的。
什么情况会导致第三次握手包可能携带数据呢? 三种情况下回导致
https://blog.csdn.net/weixin_34198797/article/details/90687285

10.长连接和短连接的区别?

短连接是指建立连接后,发送接收完数据后马上断开连接。
长连接指建立连接后不管是否使用都保持连接,但安全性较差。
tcp长连接优缺点:长连接可以省去较多的tcp建立/关闭的操作,减少浪费,节省时间,对于频繁请求资源的客户,较适用于长连接;
client和server如果长时间不关闭的话,会存在一个问题,随着客户的越来越多,server早晚会有扛不住的一天,这时需要采取一些策略,如关闭一些长时间不读写操作的连接,这样可以避免一些恶意连接导致server端服务受损,
如果条件再允许,就可以以客户端为颗粒度,限制每个客户端的最大连接数tcp短连接优缺点:短连接对于服务器来说较为简单,存在的连接都是有用的连接,不需要额外的控制,但如果客户端连接频繁,会在tcp的建立和关闭上浪费时间。

场景题一个电脑接入局域网后分配一个IP地址,这个是怎么实现的
公网设备是怎么访问内网的设备,有什么技术可以实现**

操作系统

linux下的cpu调度算法(进程调度算法)

linux内核的三种调度方法:
1. sched_other分时调度策略
实时进程将得到优先调用,实时进程根据实时优先级决定调度权值。
分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。2. SCHED_FIFO实时调度策略,先到先服务
3. SCHED_RR实时调度策略,时间片轮转

写出Socket的整体流程图,select函数的具体用法及改进, 已经建立好的连接一边断了,另一边调用write()发送数据返回的是什么。


操作系统的中断机制,硬中断和软中断的区别

1:硬件中断是由外设引发的, 软中断是执行中断指令产生的.
2:硬件中断的中断信号是由中断控制器提供的, 软中断的中断信号由指令直接指出, 无需使用中断控制器.
3:硬件中断是可屏蔽的, 软件中断不可屏蔽.

进程和线程的区别,多线程共享进程资源时候可能遇到的问题及解决方案

并发修改问题,需要使用线程同步机制
多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件
阻塞式的解决方案:synchronized,Lock
非阻塞式的解决方案:原子变量

协程和线程的区别 shopee问到
协程的调度是怎么做的 Go语言用的多

N:1模型,多个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快,因为这些线程都在内核态运行,但是无法利用多核系统的优点。
1:1模型,1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。POSIX线程模型(pthread)就是这么做的。
M:N模型,内核空间开启多个内核线程,一个内核空间线程对应多个用户空间线程。效率非常高,但是管理复杂。

mmap,NIO,Direct IO有什么区别?Direct IO可以直接落盘吗?
mmap减少了哪一次拷贝?整个的流程 没想到快手面试问到了零拷贝,就是这个


进程调度、如何创建进程? fork函数的工作原理

进程调度算法就是cpu调度算法,1.先来先去服务 2.时间片轮转法 3.多级反馈队列算法
4.优先级调度 5.最短剩余时间优先 6.最高响应比优先fork()函数创建子进程当进程调用fork后,当控制转移到内核中的fork代码后,内核会做4件事情:
1、分配新的内存块和内核数据结构给子进程
2、将父进程部分数据结构内容拷贝到子进程
3、添加子进程到系统进程列表当中
4、fork返回,开始调度器调度fork()调用clone(),然后由clone()去调用do_fork(), 再然后do_fork()完成了创建中的大部分工作,该函数调用copy_process()做最后的收尾工作

linux:chmod命令、chattr命令、文件的权限

美团问到: linux如何进行权限管理? ACL权限访问控制访问前, Linux系统通常都是先做DAC检查(自主访问控制),如果没有通过则操作直接失败 ;如果通过DAC检查并且系统支持MAC模块(强制访问控制),再做MAC权限检查。

socket编程的流程 其他地方也遇到过,问过很多次

服务端:
sokect()函数创建套节字,返回套接字句柄s
bind()函数绑定 IP 地址和端口号
listen()函数,进入监听状态
accept()函数,等待客户端连接请求,客户端通过connect()函数与服务端建立连接,服务端accept()返回,得到新的套接字句柄cs
send()/recv()函数,在新的套接字句柄cs上进行收发数据,直到完成交换
closesocket(),先关闭套接字cs,再关闭套接字s,服务结束客户端:
sokect()函数创建套节字,返回套接字句柄s
connect()函数与服务端建立连接
send()/recv()函数,在新的套接字句柄cs上进行收发数据,直到完成交换
closesocket()函数,关闭套接字s

IO模型(阻塞和非阻塞)

网络编程中的select,poll,epoll

4. 进程通信方式,socket和其余几种的区别

socket套接字:不同机器之间的应用进程之间的通信

协程的调度是怎么做的? 其他地方也见过

数据库

数据库中有值 a=1, b=2, 依次执行 set a = 3, set b = 5, set a = 1, 在undo log中依次写入的是什么?

undo log是逻辑日志,可以理解为记录当前操作的相反操作,有顺序!set a = 1
set b = 2
set a = 1

数据库中有两个索引,分别是主键 id 和 name, 问 select * from name = “key” 怎么走索引?

id 是主键索引,name是普通索引
所以先去普通索引树中查询name="key",获得name对应的主键id,
然后去主键索引树中再次查询,获得数据行记录

如何优化慢查询? 从除了数据库以外的角度来考虑

慢查询的优化首先要搞明白慢的原因是什么?
是查询条件没有命中索引?是加载了不需要的数据列?还是数据量太大?所以优化也是针对这三个方向来的,1:首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。
2:分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。
3:如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。
第一步:开启mysql慢查询
第二步:分析慢查询日志  explain + sql语句,关注使用的索引,扫描行数,查询类型(如有简单查询、联合查询、子查询等)
第三步:常见的慢查询优化1:索引没起作用的情况(索引失效的情况)2:优化数据库结构,如将字段很多的表分解成多个表,增加中间表3:分解关联查询,切分大查询(一次锁住很多数据),分解大连接查询(分解成对每一个表进行一次单表查询,然后在应用程序中进行关联)4:优化LIMIT分页,需要分页的操作通常会使用limit加上偏移量的方法实现当偏移量非常大的时候,尽可能的使用索引覆盖扫描,而不是查询所有的列

12.讲一讲gap lock和next-key lock,具体是怎么锁的,比如age=20,锁的是id还是age
参考博客:点击此处
假设有id,age两列,我们需要更新age=7这一行,就是age的值上加间隙锁,锁定的区间是(5,7)和(7,9)

间隙锁(Gap Lock)一般是针对非唯一索引而言,所以锁定的是age,而不是id

InnoDB有三种行锁的算法:
记录锁、间隙锁、临键锁,他们都是排它锁如果更新条件为唯一索引,则使用Record Lock(记录锁)
record lock:记录锁也叫行锁,锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引。gap lock: 重点是间隙锁,在索引之间的间隙中加锁,或者是在第一条索引记录之前或者最后一条索引之后加锁,并不包括该索引记录本身。
Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生InnoDB默认加锁方式是next-key 锁:next-key lock:重点,innodb_locks_unsafe_for_binlog参数为0,这时默认采用next-key locks
Record lock和gap lock的结合,即除了锁住索引本身,还要再锁住索引之间的间隙。
当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙修改或者插入记录。意向锁的主要作用是处理行锁和表锁之间的矛盾,能够显示“某个事务正在某一行上持有了锁,或者准备去持有锁

6、当插入一个新的数据时候,Mysql的索引需要变更时是怎么保持高性能的?

少量插入时,涉及索引树中的节点分裂与合并
大量的插入时,可以考虑让索引失效,然后再重建索引树

问了一下 MySQL 的幻读以及 For UPDATE 会不会触发间隙锁,这里没答起。

总结:
Innodb中select for update的使用:
只要是可重复读隔离级别下,此时一定会有间隙锁,被锁范围内insert一定不可以
只要where条件走了索引,则只会对条件命中的记录上行锁,此时别的select for update不会阻塞;如果where条件没

InnoDB默认隔离级别是什么?它有解决幻读吗?

什么情况下会加间隙锁?举个例子 进行范围查询时,查询条件是非唯一索引

next-key lock锁是自动加的,那可串行化与可重复读是达到一致的效果吗?还有其他区别吗?
默认打开了next-key lock锁,是为了解决幻影读的问题,但是没有实现可串行化这种隔离级别。

mysql建议使用自增的id作为主键,为什么?

1:与业务逻辑无关的字段
2:长度短,占空间更小(主键占用空间越大,每个页存储的主键个数越少,B+树的深度会增加,导致IO次数会变多。)
3:聚簇索引(主键索引默认是聚簇索引)的数据的物理存放顺序与索引顺序是一致的,
即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。范围查询时是顺序I/O
4:增加排序效率;自增主键对索引有什么好处呢?
维护B+索引树的时候,索引是从同一个方向进行扩展,所以不需要进行页的分裂与合并,所以可以很方便地维护索引树

算法题:

判断两个字符串是否是相似字符串,相似的含义是只允许交换一次字符串的两个位置,使得和第二个字符串相等,那么他们就是相似的。
长度相同,然后再计数,统计字符出现的次数,只有都是一样的字符组成,并且次数也相同才进行下一步判断
下一步遍历,相同位置遇到不同的字符的时候,记录下来,看下一次再不同的时候能不能交换,若交换后相同,则是相似的,否则不是相似的。

算法题:给一个整形数组,要求分为两部分,第一个部分的元素的最大值比第二部分的最小元素要小,要求左边部分的范围近可能的短,输入第一个部门的长度,比如[1,1,1,0,6,7,12]长度输出4,这个想了一下没有思路,面试官降低难度给了下面一个题目

可以用 O(N) 空间存每个位置右侧所有数的最小值,然后一次扫描就可以吧
arr = [1, 1, 1, 0, 6, 7, 12]
maxv = [0, 0, 0, 0, 6, 7, 12] 从后往前扫描一次
*最后放个大招。手撕八皇后问题。有点猛。

# 八皇后问题
class Solution(object):def solveNQueens(self, n):ans = []# nums[row] = col 表示第row行皇后放的列数def traceback(nums, row):  if row == n:ans.append(nums[:])returnfor col in range(n):  # 对于每一列,都判断一下能不能放皇后nums[row] = colif valid(nums, row):  # 这一行放的合法,开始放下一行traceback(nums, row+1)def valid(nums, row):  # 判断放第row行的皇后是否与前面放的皇后冲突for i in range(row):if nums[i] == nums[row] or abs(nums[i] - nums[row]) == abs(row-i): # 同一列或对角线return Falsereturn Truetraceback([0]*n, 0)  # nums = [1, 3, 0, 2] 表示一个解决方案# 画矩阵出来res = [[] for i in range(len(ans))]for i in range(len(ans)):for col in ans[i]:  # ans[i]为一个数组tmp = '.' * nres[i].append(tmp[:col] + 'Q' + tmp[col+1:])return res

整数拆分,要求用动态规划
1 矩阵顺时针翻转90度 我记得是找规律啊
leetcode 143. Reorder List 切成前后两部分,翻转后半部门再合并就行
栈排序

IP地址划分,力扣93. 复原IP地址

秋招面经总结(针对看到不会的问题)相关推荐

  1. 2020应届生:今年秋招也太太太太太难了吧!

    讲个简短的鬼故事: 2020秋招已经过去一大半了! 回顾9月,你可能以为秋招还有很多机会,还有大把时间准备.然而各大名企的实际进度却不等人. 阿里巴巴9月12日网申截止: 腾讯9月15日网申截止: 宝 ...

  2. 不可错过的2019秋招CV岗心得!原来拿offer也是有套路的

    来源:CSDN博客,遵循 CC 4.0 BY-SA 版权协议 作者:Lovewxy_不再回忆 链接:https://blog.csdn.net/weixin_37627840/article/deta ...

  3. 第五期直播《聊聊目标检测和秋招那些事》精彩回顾

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  4. 秋招面经来了,收藏!

    作者 | 骆俊武 来源 | IT人的职场进阶(ID:BestITer) 金九银十,又到一年秋招季.这场规模巨大的校园招聘,承载了近千万毕业生的梦想.不过,在这特殊的2020年,这场秋招也变得非比寻常. ...

  5. 写给准备参加秋招的童鞋的一点建议(1)

    写在前面 取这个标题的时候,说实话,属实有一些标题党的意思.自己有什么能力给别人建议呢.但是自己有真的想把这些东西写出来.回忆起自己学习编程,实习之路,一路上栽过的跟头只有自己知道.所以每次遇到想要入 ...

  6. 【面试招聘】聊聊秋招中的面试技巧

    秋招的序幕已经拉开,很多公司都已经开启了秋招的进程,甚至有些互联网大厂的秋招都已经开始将近一个月的时间了,我在前面的文章中也写了很多关于秋招准备和一些技术面试相关的文章,那么今天我们从另外一个角度来聊 ...

  7. 【职场】肺腑之言,给即将参加秋招的同学一点建议

    文章来源于AI的那些事儿,作者黄鸿波 7月份到了,很多公司都陆陆续续的开启了秋招的进程,也有不少2021年毕业的同学也都在积极的准备着,并且也有很多同学都已经进入到了提前批的面试阶段.今天我就结合我自 ...

  8. 【面试招聘】非科班的秋招攻略贴

    秋招进程过半,最近很多人看到我的面经的帖子都在询问楼主做什么的,非科班该如何备战秋招,因为实在一个个的回复起来比较麻烦,这里趁着闲暇时光整理了一下自己作为一个非科班的学生是如何准备秋招的过程,供大家参 ...

  9. 推荐一位学霸的秋招经历(已收到百度、阿里、腾讯、美团、京东、拼多多的 offer)...

    本文作者黄海龙,优秀的研三学生,也是我的知识星球合伙人,名字跟我的名字有66.7%的相似.曾经获得18年9月份在京东举办的对话比赛中拿到了亚军,18年11月份在李开复的创新工场举办的大规模文本竞赛中, ...

  10. 推荐Datawhale整理的秋招求职攻略

    秋招变夏招,还没准备好?Datawhale团队成员offer收割机牵头,带领14名成员历时2个月,整理了一份机器学习算法工程师求职面经:Daily-interview.一份小而美的面经助您备战秋招,夏 ...

最新文章

  1. 一些关于找工作的书籍
  2. 开发购物车应用程序(1)
  3. docker 异常:“fork/exec /proc/self/exe: no such file”
  4. CodeSmith基础(七)
  5. 在WEBSTART中实现串口通信(WINDOWS版)
  6. 手把手教你如何安装多个node版本
  7. 高效的企业测试-工作流和代码质量(4/6)
  8. tf.reduce_sum()方法深度解析
  9. 大话信号多久可以移服务器,关于第十届服务器联赛规则及日期详细介绍(二)...
  10. 利用nginx 反向代理解决跨域问题
  11. python用什么来写模块-用Python编写模块有何技巧?
  12. 各种应用程序错误,xx内存地址不能read等报错可能的原因与解决方案
  13. 投资学翻译及感悟 Lazy Prices
  14. 格创东智获《互联网周刊》2020工业互联网平台TOP12 解决方案提供商TOP16
  15. html语言字体大小修改,html怎么修改字体大小
  16. VC6.0快捷键一览表
  17. iOS让屏幕保持常亮,不自动锁屏
  18. Prege(图计算框架)
  19. 问卷星自动填写,智能验证和滑动块
  20. 1602液晶显示器代码

热门文章

  1. Robot Framework For循环详解
  2. 在大厂的数据工程师工作日常工作分享
  3. HTC Vive手柄
  4. ThinkPHP 6 数据库查询,where 、or、and
  5. lintcode 骰子求和
  6. numpy.polyfit:LinAlgError: SVD did not converge in Linear Least Squares
  7. 在线接口文档管理工具(小幺鸡)使用说明
  8. 【BZOJ 2563】 阿狸和桃子的游戏 脑洞+贪心
  9. 企业如何建设知识管理系统
  10. 在Spring Security中启用Group Authorities