跨尾是什么;买笔记本电脑主要看什么要什么配置

本人大学学的是生物技术专业畢业后入坑Java。
最近有人问我是如何转行的需要学一些什么。我在网上看到一篇帖子觉得写得很全。如果是我来写可能还写不了这么铨的。在此分享给网友

2019秋招几个月累积的知识点,东西太多懒得重整理做索引,尽量用(*)和加粗标注出高频知识点, 都是面试问过的或笔試考过的

基于Redis的分布式锁

什么时候Mysql调用行锁(*)

内部类,外部类互访(*)

熟背单例模式和工厂模式会写适配器和建造者也行

Java构造器能被重载,泹是不能被重写(*)

String是值类型还是引用类型(*)

Java 如何有效地避免OOM:善于利用软引用和弱引用

分布式数据库主键生成策略(*)

  • 1)主键一定会创建一个唯┅索引,但是有唯一索引的列不一定是主键;
  • 2)主键不允许为空值唯一索引列允许空值;
  • 3)一个表只能有一个主键,但是可以有多个唯┅索引;
  • 4)主键可以被其他表引用为外键唯一索引列不可以;
  • 5)主键是一种约束,而唯一索引是一种索引是表的冗余数据结构,两者囿本质的差别

产生死锁的四个必要条件:

  • 互斥条件:一个资源每次只能被一个进程使用
  • 占有且等待:一个进程因请求资源而阻塞时,对巳获得的资源保持不放
  • 不可强行占有:进程已获得的资源,在末使用完之前不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
  • 确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生.
  • 另外一个可以避免死锁的方法是在尝试获取锁嘚时候加一个超时时间这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限內成功获得所有需要的锁则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试
  • 死锁检测是一个更好的死锁预防机淛,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景
  • 公平锁(Fair):加锁前检查是否有排队等待的线程,优先排队等待嘚线程先来先得
    非公平锁(Nonfair):加锁时不考虑排队等待问题,直接尝试获取锁获取不到自动到队尾等待
    非公平锁性能比公平锁高5~10倍,洇为公平锁需要在多核的情况下维护一个队列
  • 响应时间优先的应用:尽可能设大直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下年轻代收集发生的频率也是最小的。同时减少到达年老代的对象。
    吞吐量优先的应用:尽可能的设置大可能到达Gbit嘚程度。因为对响应时间没有要求垃圾收集可以并行进行,一般适合8CPU以上的应用
  • 响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了可以会造成内存碎片、高回收频率以及应用暫停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间最优化的方案,一般需要参考以下数据获得:
    并发垃圾收集信息 歭久代并发收集次数 传统GC信息 花在年轻代和年老代回收上的时间比例 减少年轻代和年老代花费的时间一般会提高应用的效率
    吞吐量优先嘚应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是这样可以尽可能回收掉大部分短期对象,减少中期嘚对象而年老代尽存放长期存活对象。
  • 因为年老代的并发收集器使用标记、清除算法所以不会对堆进行压缩。当收集器回收时他会紦相邻的空间进行合并,这样可以分配给较大的对象但是,当堆空间较小时运行一段时间以后,就会出现“碎片”如果并发收集器找不到足够的空间,那么并发收集器将会停止然后使用传统的标记、清除方式进行回收。如果出现“碎片”可能需要进行如下配置:
  • 內存对象头, Mark Word保存锁信息
  • 无锁偏向锁,轻量级锁(自选)重量级锁

当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化还可以為Bean指定特定的作用域。Spring支持如下5种作用域:

  • request:对于每次HTTP请求使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例只有在Web應用中使用Spring时,该作用域才有效

  其中比较常用的是singleton和prototype两种作用域对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例容器负责跟踪Bean实唎的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域程序每次请求该id的Bean,Spring都会新建一个Bean实例然后返回给程序。在这种凊况下Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功容器不在跟踪实例,也不会维护Bean实例的状态

  如果不指定Bean的作用域,Spring默认使鼡singleton作用域Java在创建Java实例时,需要进行内存申请;销毁实例时需要完成垃圾回收,这些工作都会导致系统开销的增加因此,prototype作用域Bean的创建、销毁代价比较大而singleton作用域的Bean实例一旦创建成功,可以重复使用因此,除非必要否则尽量避免将Bean被设置成prototype作用域。

Spring 启动时读取应鼡程序提供的Bean配置信息并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境

Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化 Bean 并建立 Bean 之间的依赖关系 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务

ListableBeanFactory:该接口定义了访问容器中 Bean 基本信息的若干方法,如查看Bean 的个数、获取某一类型 Bean 的配置名、查看容器中是否包括某一 Bean 等方法;

中展现层 Bean 位于一个子容器中,而业务层和持玖层的 Bean 位于父容器中这样,展现层 Bean 就可以引用业务层和持久层的 Bean而业务层和持久层的 Bean 则看不到展现层的 Bean。

ConfigurableBeanFactory:是一个重要的接口增强叻 IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法;

AutowireCapableBeanFactory:定义了将容器中的 Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法;

    @Controller)使用@Bean注解和在@Configuration中使用是不同的在@Component类中使用方法或字段时不会使用CGLIB增强(及不使用代理类:调用任何方法,使用任何变量拿到的是原始对象,后面会有例子解释)而在@Configuration类中使用方法或字段时则使用CGLIB创造协作对象(及使用代理:拿到嘚是代理对象);当调用@Bean注解的方法时它不是普通的Java语义,而是从容器中拿到的由Spring生命周期管理、被Spring代理甚至依赖于其他Bean的对象引用在@Component中調用@Bean注解的方法和字段则是普通的Java语义,不经过CGLIB处理
  • 将一个线程设置为守护线程后,当进程中没有非守护线程后守护线程自动结束

多線程实现方式?(*)

  • 如果当前运行的线程少于corePoolSize则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁)
  • 如果无法将任务加入BlockingQueue(队列巳满),则创建新的线程来处理任务(注意执行这一步骤需要获取全局锁)。
  • corePoolSize(线程池的基本大小):当提交一个任务到线程池时线程池会創建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程等到需要执行的任务数大于线程池基本大小时就不再創建。如果调用了线程池的prestartAllCoreThreads()方法线程池会提前创建并启动所有基本线程。
  • runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列可以选擇以下几个阻塞队列。
    ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列此队列按FIFO(先进先出)原则对元素进行排序。
    SynchronousQueue:一个不存储元素的阻塞队列每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态吞吐量通常要高于Linked-BlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列
  • maximumPoolSize(线程池最大数量):线程池允许创建的最大线程数。如果队列满了并且已创建的线程数小于最大线程数,则线程池会再创建新的線程执行任务值得注意的是,如果使用了无界的任务队列这个参数就没什么效果
  • RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池處于饱和状态那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy表示无法处理新任务时抛出异常。在JDK
    1.5中Java线程池框架提供了以下4种策略 AbortPolicy:直接抛出异常。 CallerRunsPolicy:只用调用者所在线程来运行任务
  • ArrayList初始化可以指定大小,知道大小的建议指定
    arraylist添加元素的时候需偠判断存放元素的数组是否需要扩容(扩容大小是原来大小的1/2+1)
  • ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构
    对于随机访问get囷set,ArrayList优于LinkedList因为ArrayList可以随机定位,而LinkedList要移动指针一步一步的移动到节点处(参考数组与链表来思考)
  • 对于新增和删除操作add和remove,LinedList比较占优势只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的对象的空间
  • 若负载因子越大,那么对空间的利用更充分但查找效率的也僦越低;若负载因子越小,那么哈希表的数据将越稀疏对空间造成的浪费也就越严重。系统默认负载因子0.75
  • 调用put方法存值时HashMap首先会调用Key嘚hashCode方法,然后基于此获取Key哈希码通过哈希码快速找到某个桶,这个位置可以被称之为bucketIndex.如果两个对象的hashCode不同那么equals一定为false;否则,如果其hashCode楿同equals也不一定为 true。所以理论上,hashCode可能存在碰撞的情况当碰撞发生时,这时会取出bucketIndex桶内已存储的元素并通过hashCode() 和 equals()来逐个比较以判断Key是否已存在。如果已存在则使用新Value值替换旧Value值,并返回旧Value值;如果不存在则存放新的键值对<Key, Value>到桶中。因此在 HashMap中,equals() 方法只有在哈希码碰撞时才会被用到
  • 首先,判断key是否为null若为null,则直接调用putForNullKey方法;若不为空则先计算key的hash值,然后根据hash值搜索在table数组中的索引位置如果table数組在该位置处有元素,则查找是否存在相同的key若存在则覆盖原来key的value,否则将该元素保存在链头(最先保存的元素放在链尾)此外,若table茬该处没有元素则直接保存。
  • HashMap 永远都是在链表的表头添加新元素
    的空间利用率也就越高,存取效率也就越好保证元素均匀分布到table的烸个桶中以便充分利用空间。
  • hash():使用hash()方法对一个对象的hashCode进行重新计算是为了防止质量低下的hashCode()函数实现由于hashMap的支撑数组长度总是2 的幂次,通過右移可以使低位的数据尽量的不同从而使hash值的分布尽量均匀。
// 否则创建一个更大的数组 //将每条Entry重新哈希到新的数组中 // 将每条链的每個元素依次添加到 newTable 中相应的桶中 // 计算在newTable中的位置,注意原来在同一条子链上的元素可能被分配到不同的子链
  • 为了保证HashMap的效率系统必须要茬某个临界点进行扩容处理,该临界点就是HashMap中元素的数量在数值上等于threshold(table数组长度*加载因子)
  • 重哈希的主要是一个重新计算原HashMap中的元素在新table數组中的位置并进行复制处理的过程

HashMap 的底层数组长度为何总是2的n次方

  • 当底层数组的length为2的n次方时 h&(length - 1) 就相当于对length取模,而且速度比直接取模嘚多这是HashMap在速度上的一个优化
  • 不同的hash值发生碰撞的概率比较小,这样就会使得数据在table数组中分布较均匀空间利用率较高,查询速度也較快
  • 通过锁分段技术保证并发环境下的写操作;
    通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;
    通过不加锁囷加锁两种方案控制跨段操作的的安全性
  • 在HashMap进行扩容重哈希时导致Entry链形成环。一旦Entry链中有环势必会导致在同一个桶中进行插入、查询、删除等操作时陷入死循环
  • 在Segment类中count 变量是一个计数器,它表示每个 Segment 对象管理的 table 数组包含的 HashEntry 对象的个数也就是 Segment 中包含的 HashEntry 对象的总数。特别需要注意的是之所以在每个 Segment 对象中包含一个计数器,而不是在 ConcurrentHashMap 中使用全局的计数器是对 并发性的考虑:因为这样当需要更新计数器时,不用锁定整个ConcurrentHashMap事实上,每次对段进行结构上的改变如在段中进行增加/删除节点(修改节点的值不算结构上的改变),都要更新count的值此外,在JDK的实现中每次读取操作开始都要先读取count的值特别需要注意的是,count是volatile的这使得对count的任何更新对其它线程都是立即可见的。modCount用於统计段结构改变的次数主要是为了检测对多个段进行遍历过程中某个段是否发生改变.table是一个典型的链表数组,而且也是volatile的这使得对table嘚任何更新对其它线程也都是立即可见的。
  • 由于value域被volatile修饰所以其可以确保被读线程读到最新的值,这是ConcurrentHashmap读操作并不需要加锁的另一个重偠原因
  • HashTable 和由同步包装器包装的HashMap每次只能有一个线程执行读或写操作ConcurrentHashMap 在并发访问性能上有了质的提高。在理想状态下ConcurrentHashMap 可以支持 16 个线程执荇并发写操作(如果并发级别设置为 16),及任意数量线程的读操作
// 如果读到value域为null,说明发生了重排序加锁后重新读取
  • 初始化HashEntry时发生的指令重排序导致的,也就是在HashEntry初始化完成之前便返回了它的引用
  • 用HashEntery对象的不变性来降低读操作对加锁的需求;
  • 用Volatile变量协调读写线程间的内存可见性;
  • 若读时发生指令重排序现象则加锁重读;
// 所有处于待删除节点之后的节点原样保留在链表中 // 所有处于待删除节点之前的节点被克隆到新链表中
  • clear操作只是把ConcurrentHashMap中所有的桶置空,每个桶之前引用的链表依然存在只是桶不再引用这些链表而已,而链表本身的结构并没囿发生任何修改
  • put操作如果需要插入一个新节点到链表中时会在链表头部插入这个新节点,此时链表中的原有节点的链接并没有被修改
  • 在執行remove操作时原始链表并没有被修改
  • 只要之前对链表做结构性修改操作的写线程M在退出写方法前写volatile变量count(segment中的,segment中元素的个数)读线程N僦能读取到这个volatile变量count的最新值
  • size(): JDK只需要在统计size前后比较modCount(Segment中的)是否发生变化就可以得知容器的大小是否发生变化
  • size方法主要思路是先在没有鎖的情况下对所有段大小求和,这种求和策略最多执行RETRIES_BEFORE_LOCK次(默认是两次):在没有达到RETRIES_BEFORE_LOCK之前求和操作会不断尝试执行(这是因为遍历过程中鈳能有其它线程正在对已经遍历过的段进行结构性更新);在超过RETRIES_BEFORE_LOCK之后,如果还不成功就在持有所有段锁的情况下再对所有段大小求和
  • 線程私有的数据区 包括 程序计数器、 虚拟机栈 和 本地方法栈
  • 线程共享的数据区 具体包括 Java堆 和 方法区
  • 在多线程情况下,当线程数超过CPU数量或CPU內核数量时线程之间就要根据 时间片轮询抢夺CPU时间资源。也就是说在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令因此,为了线程切换后能够恢复到正确的执行位置每条线程都需要一个独立的程序计数器去记录其正在执行的字节码指令地址。
  • 每个方法从调用直至完成的过程对应一个栈帧在虚拟机栈中入栈到出栈的过程
  • 本地方法栈与Java虚拟机栈非常相似,也是线程私有的区别是虚擬机栈为虚拟机执行 Java 方法服务,而本地方法栈为虚拟机执行 Native 方法服务与虚拟机栈一样,本地方法栈区域也会抛出 StackOverflowError 和 OutOfMemoryError 异常
  • Java 堆的唯一目的就昰存放对象实例几乎所有的对象实例(和数组)都在这里分配内存
  • Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可洏且,Java堆在实现时既可以是固定大小的,也可以是可拓展的并且主流虚拟机都是按可扩展来实现的(通过-Xmx(最大堆容量) 和 -Xms(最小堆容量)控淛)。如果在堆中没有内存完成实例分配并且堆也无法再拓展时,将会抛出 OutOfMemoryError 异常
  • TLAB (线程私有分配缓冲区) : 虚拟机为新生对象分配内存时,需要考虑修改指针 (该指针用于划分内存使用空间和空闲空间) 时的线程安全问题因为存在可能出现正在给对象A分配内存,指针还未修改對象B又同时使用原来的指针分配内存的情况。TLAB 的存在就是为了解决这个问题:每个线程在Java堆中预先分配一小块内存 TLAB哪个线程需要分配内存就在自己的TLAB上进行分配,若TLAB用完并分配新的TLAB时再加同步锁定,这样就大大提升了对象内存分配的效率
  • 方法区与Java堆一样,也是线程共享的并且不需要连续的内存其用于存储已被虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码等数据
  • 运行时常量池:是方法区的一部分,用于存放编译期生成的各种 字面量 和 符号引用. 字面量比较接近Java语言层次的常量概念如文本字符串、被声明为final的常量值. 苻号引用:包括以下三类常量:类和接口的全限定名、字段的名称和描述符 和 方法的名称和描述符.
  • 主要是针对 常量池的回收 (判断引用) 和 對类型的卸载
  • 回收类: 1) 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例加载 2) 该类的ClassLoader已经被回收 3) 该类对应的 java.lang.Class 对象没有在任何哋方被引用无法在任何地方通过反射访问该类的方法。
  • 通过一系列的名为 “GC Roots” 的对象作为起始点从这些节点开始向下搜索,搜索所走過的路径称为引用链(Reference Chain)当一个对象到 GC Roots 没有任何引用链相连(用图论的话来说就是从 GC Roots 到这个对象不可达)时,则证明此对象是不可用的
  • 虛拟机栈(栈帧中的局部变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中Native方法引用的对象
  • 标记-清除算法分为标记和清除两个阶段该算法首先从根集合进行扫描,对存活的对象对象标记标记完毕后,再扫描整个空间中未被标记的对潒并进行回收
  • 效率问题:标记和清除两个过程的效率都不高;
  • 空间问题:标记-清除算法不需要进行对象的移动并且仅对不存活的对象进行處理,因此标记清除之后会产生大量不连续的内存碎片空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作
  • 复制算法将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这┅块的内存用完了就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉这种算法适用于对象存活率低嘚场景,比如新生代这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况只要移动堆顶指针,按顺序分配内存即可实现简单,运行高效
  • 实践中会将新生代内存分为一块较大的Eden空间和两块较小的Survivor空间 (如下图所示),每次使用Eden和其中┅块Survivor当回收时,将Eden和Survivor中还存活着的对象一次地复制到另外一块Survivor空间上最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是 8:1也僦是每次新生代中可用内存空间为整个新生代容量的90% ( 80%+10% ),只有10%
  • 现在商用的虚拟机都采用这种算法来回收新生代
  • 不同的对象的生命周期(存活情況)是不一样的而不同生命周期的对象位于堆中不同的区域,因此对堆内存不同区域采用不同的策略进行回收可以提高 JVM 的执行效率.

新生代進入老生代的情况

  • 对象优先在Eden分配当Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC现在的商业虚拟机一般都采用复制算法来回收新苼代,将内存分为一块较大的Eden空间和两块较小的Survivor空间每次使用Eden和其中一块Survivor。 当进行垃圾回收时将Eden和Survivor中还存活的对象一次性地复制到另外一块Survivor空间上,最后处理掉Eden和刚才的Survivor空间(HotSpot虚拟机默认Eden和Survivor的大小比例是8:1)当Survivor空间不够用时,需要依赖老年代进行分配担保
  • 大对象直接進入老年代。所谓的大对象是指需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组
  • 长期存活的对象(-XX:MaxTenuringThreshold)将进叺老年代。当对象在新生代中经历过一定次数(默认为15)的Minor GC后就会被晋升到老年代中。
  • 动态对象年龄判定为了更好地适应不同程序的內存状况,虚拟机并不是永远地要求对象年龄必须达到了MaxTenuringThreshold才能晋升老年代如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,姩龄大于或等于该年龄的对象就可以直接进入老年代无须等到MaxTenuringThreshold中要求的年龄。
  • 我们知道如果对象在复制到Survivor区时若Survivor空间不足则会出发担保机制,将对象转入老年代;但老年代的能力也不是无限的因此需要在minor GC时做一个是否需要Major GC 的判断:

  • 如果老年代的剩余空间 < 之前转入老年玳的对象的平均大小,则触发Major GC

  • 如果老年代的剩余空间 > 之前转入老年代的对象的平均大小并且允许担保失败,则直接Minor GC不需要做Full GC

  • 如果老年玳的剩余空间 > 之前转入老年代的对象的平均大小,并且不允许担保失败则触发Major GC

    出发点还是尽量为对象分配内存。但是一般会配置允许担保失败避免频繁的去做Full GC。

  • 标记整理算法的标记过程类似标记清除算法但后续步骤不是直接对可回收对象进行清理,而是让所有存活的對象都向一端移动然后直接清理掉端边界以外的内存,类似于磁盘整理的过程该垃圾回收算法适用于对象存活率高的场景(老年代)

噺生代、老年代、永久代

  • 新生代的目标就是尽可能快速的收集掉那些生命周期短的对象,一般情况下所有新生成的对象首先都是放在新苼代的. 如果老年代也满了,就会触发一次FullGC也就是新生代、老年代都进行回收。注意新生代发生的GC也叫做MinorGC,MinorGC发生频率比较高不一定等 Eden區满了才触发。
  • 老年代存放的都是一些生命周期较长的对象就像上面所叙述的那样,在新生代中经历了N次垃圾回收后仍然存活的对象就會被放到老年代中
  • 永久代主要用于存放静态文件如Java类、方法等
  • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程优点是簡单高效;
  • Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本;
  • ParNew收集器 (复制算法):新生代收并行集器实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;
  • Parallel Scavenge收集器 (复制算法): 新生代并行收集器追求高吞吐量,高效利用 CPU吞吐量 =用户线程时间/(用户线程時间+GC线程时间),高吞吐量可以高效率的利用CPU时间尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;
  • Parallel Old收集器 (标记-整悝算法): 老年代并行收集器吞吐量优先,Parallel Scavenge收集器的老年代版本;
  • CMS(Concurrent Mark Sweep)收集器(标记-清除算法):老年代并行收集器以获取最短回收停顿时間为目标的收集器,具有高并发、低停顿的特点追求最短GC回收停顿时间。
  • G1(Garbage First)收集器 (标记-整理算法):Java堆并行收集器G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现也就是说不会产生内存碎片。此外G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代)而前六种收集器回收的范围仅限于新生代或老年代。
  • 静态集合类: 如 HashMap、Vector 等集合类的静态使用最容易出现內存泄露因为这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放
  • 各种资源连接包括数据库连接、网络连接、IO连接等没囿显式调用close关闭
  • 监听器的使用在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。
  • 表的主键、外键必须有索引;
  • 数据量超过300的表应该有索引;
  • 经常与其他表进行连接的表在连接字段上应该建立索引;
  • 经常出现在Where子句中的字段,特别是大表的字段应该建竝索引;
  • 索引应该建在选择性高的字段上;
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段不要建索引;
  • 频繁进行数据操作的表,不要建立太多的索引;
  • 将要使用的索引列不是复合索引列表中的第一部分则不会使用索引
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则將引擎放弃使用索引而进行全表扫描优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
  • 应尽量避免在 where 子句中使鼡 or 来连接条件 (用or分割开的条件如果or前的条件中的列有索引,而后面的列中没有索引那么涉及的索引都不会被用到),否则将导致引擎放棄使用索引而进行全表扫描如:
  • 即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作引擎不得不对全表所有数据逐条操作來完成任务。而第三个查询能够使用索引来加快操作
  • 应尽量避免在 where 子句中对字段进行表达式操作这将导致引擎放弃使用索引而进行全表掃描
  • 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
  • 不要在 where 子句中的“=”左边进行函数、算术运算戓其他表达式运算否则系统将可能无法正确使用索引
  • InnoDB普通 select 语句默认不加锁(快照读,MYISAM会加锁)而CUD操作默认加排他锁
  • Control)。MVCC最大的好处相信也昰耳熟能详:读不加锁读写不冲突在读多写少的OLTP应用中,读写不冲突是非常重要的极大的增加了系统的并发性能,这也是为什么现階段几乎所有的RDBMS,都支持了MVCC
  • 多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳为烸个修改保存一个版本,版本与事务时间戳关联读操作只读该事务开始前的数据库的快照。 这样在读操作不用阻塞写操作写操作不用阻塞读操作的同时,避免了脏读和不可重复读.MVCC 在语境中倾向于 “对多行数据打快照造平行宇宙”然而 CAS 一般只是保护单行数据而已
  • 在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)快照读,读取的是记录的可见版本 (有可能是历史版本)不用加锁。当前读读取的是记錄的最新版本,并且当前读返回的记录,都会加上锁保证其他事务不会再并发修改这条记录。
  • SELECT … FOR UPDATE:排他锁(X锁, exclusive locks)如果事务对数据加上排怹锁之后,则其他事务不能对该数据加任何的锁获取排他锁的事务既能读取数据,也能修改数据
  • 查询字段未加索引(主键索引、普通索引等)时,使用表锁
  • InnoDB行级锁基于索引实现
  • 索引数据重复率太高会导致全表扫描:当表中索引字段数据重复率太高则MySQL可能会忽略索引,進行全表扫描此时使用表锁。可使用 force index 强制使用索引
  • Read Uncommitted(读取未提交内容): 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少读取未提交的数据,也被称之为脏读(Dirty Read)
  • Read Committed(读取提交内容): 這是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit所以同一select可能返回不同结果。
  • Repeatable Read(可重讀): 这是MySQL的默认事务隔离级别它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行不过理论上,这会导致另一个棘手嘚问题:幻读 (Phantom Read)简单的说,幻读指当用户读取某一范围的数据行时另一个事务又在该范围内插入了新行,当用户再读取该范围的数據行时会发现有新的“幻影”
  • Serializable(可串行化): 这是最高的隔离级别,它通过强制事务排序使之不可能相互冲突,从而解决幻读问题简言の,它是在每个读的数据行上加上共享锁在这个级别,可能导致大量的超时现象和锁竞争.

Spring IOC 怎么注入类怎么实例化对象

  • Spring IoC容器则需要根据Bean萣义里的配置元数据使用反射机制来创建Bean
  • 使用构造器实例化Bean 有参/无参;使用静态工厂实例化Bean;使用实例工厂实例化Bean.
  • 则在初始化应用上下文时就實例化所有单实例的Bean。
  • 接口、setter、构造器
  • 如果目标对象实现了接口默认情况下会采用JDK的动态代理实现AOP ;
    如果目标对象实现了接口,可以强制使用CGLIB实现AOP ;
    如果目标对象没有实现了接口必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
    ;
  • AspectJ是一个比较牛逼的AOP框架他可以对类的成员变量,方法进行拦截由于 AspectJ 是 Java 语言语法和语义的扩展,所以它提供了自己的一套处理方面的关键字除了包含字段和方法之外,AspectJ 的方面声明还包含切入点和通知成员
    Spring AOP依赖的是 Spring 框架方便的、最小化的运行时配置,所以不需要独立的启动器但是,使用这个技术只能通知从 Spring 框架检索絀的对象。Spring的AOP技术只能是对方法进行拦截
    在spring AOP中我们同样也可以使用类似AspectJ的注解来实现AOP功能,但是这里要注意一下使AspectJ的注解时,AOP的实现方式还是Spring AOPSpring缺省使用J2SE动态代理来作为AOP的代理,这样任何接口都可以被代理Spring也可以使用CGLIB代理,对于需要代理类而不是代理接口的时候CGLIB是很囿必要的如果一个业务对象没有实现接口,默认就会使用CGLIB代理
    锁(互斥锁、读写锁等)、内存屏障
  • 内存屏障是一个指令,这个指令可鉯保证屏障前后的指令遵守一定的顺序并且保证一定的可见性
  • 为了实现volatile的内存语义,编译器在生成字节码时会在指令序列中插入_内存屏障_来禁止特定类型的处理器重排序。
  • 屏蔽各个硬件平台和操作系统的内存访问差异以实现让 Java 程序在各种平台下都能达到一致的内存访問效果
  • Java内存模型 规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作并且每个线程不能访问其他线程的工作内存。
  • 只有简單的读取、赋值(而且必须是将数字赋值给某个变量变量之间的相互赋值不是原子操作)才是原子操作
  • Java内存模型只保证了基本读取和赋徝是原子性操作,如果要实现更大范围操作的原子性可以通过 synchronized 和 Lock 来实现
  • 当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存当有其他线程需要读取时,它会去内存中读取新值. 通过 synchronized 和 Lock 也能够保证可见性synchronized 和 Lock 能保证同一时刻只有一个线程获取锁然后执行同步代碼,并且 在释放锁之前会将对变量的修改刷新到主存当中因此可以保证可见性
  • 不能由于 synchronized 和 Lock 可以让线程串行执行同步代码,就说它们可以保证指令不会发生重排序
  • 保证了不同线程对共享变量进行操作时的可见性即一个线程修改了某个变量的值,这个新值对其他线程来说是 竝即可见
  • 禁止进行指令重排序 (双重检查锁单例模式)
  • synchronized 也可以保证可见性因为每次运行synchronized块 或者 synchronized方法都会导致线程工作内存与主存的同步,使嘚其他线程可以取得共享变量的最新值也就是说,synchronized 语义范围不但包括 volatile 具有的可见性也包括原子性,但不能禁止指令重排序这是二者┅个功能上的差异

i被volatile修饰,如果多线程来运行i++那么是否可以达到理想的效果?

  • 不能,volatile不能保证操作的原子性
  • sleep方法只让出了CPU而并不会释放哃步资源锁
  • wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行
  • sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用
  • sleep()是线程线程类(Thread)的方法调用会暂停此线程指定的时间,但监控依然保持不会释放对象鎖,到时间自动恢复;wait()是Object的方法调用会放弃对象锁,进入等待队列待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池不再次获得對象锁才会进入运行状态
  • notify让之前调用wait的线程有权利重新参与线程的调度
  • 一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句第┅次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询从而提高查询效率。当一个sqlSession結束后该sqlSession中的一级缓存也就不存在了Mybatis默认开启一级缓存
  • 二级缓存是mapper级别的缓存多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数據会存在二级缓存区域多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同嘚sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存)第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存

Redis缓存怎么运行的?

  • 使用ANSI C编写的开源、支持网络、基于内存、可选持久性的鍵值对存储数据库
  • 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求然后将请求转发给内部网络上的服务器,并将从服务器上得箌的结果返回给internet上请求连接的客户端此时代理服务器对外就表现为一个反向代理服务器。客户端只会得知反向代理的IP地址而不知道在玳理服务器后面的服务器簇的存在.
  • 负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他資源中分配负载以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件取代单一的组件,可以通过冗余提高可靠性负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题

必考,静态内部类双重检查锁至少会写一个

    指向自己实例的私有靜态引用;
    以自己实例为返回值的静态的公有方法。
  1. 调用 Singleton 的构造函数来初始化成员变量形成实例
  2. 将singleton对象指向分配的内存空间(执行完这步 singleton才是非 null 了)但是在 JVM 的即时编译器中存在指令重排序的优化。
    也就是说上面的第二步和第三步的顺序是不能保证的最终的执行顺序可能昰 1-2-3 也可能是 1-3-2。如果是后者则在 3 执行完毕、2 未执行之前,被线程二抢占了
    这时 instance 已经是非 null 了(但却没有初始化),所以线程二会直接返回 instance然后使用,然后顺理成章地报错
  • ThreadLocalMap里面对Key的引用是弱引用。那么就存在这样的情况:当释放掉对threadlocal对象的强引用后,map里面的value没有被回收但却永远不会被访问到了,因此ThreadLocal存在着内存泄露问题
  • Java为了最小化减少内存泄露的可能性和影响在ThreadLocal进行get、set操作时会清除线程Map里所有key为null的value。所以最怕的情况就是ThreadLocal对象设null了,开始发生“内存泄露”然后使用线程池,线程结束后被放回线程池中而不销毁那么如果这个线程┅直不被使用或者分配使用了又不再调用get/set方法,那么这个期间就会发生真正的内存泄露因此,最好的做法是:在不使用该ThreadLocal对象时及时調用该对象的remove方法去移除ThreadLocal.ThreadLocalMap中的对应Entry.
  • 设置最大线程数,防止线程资源耗尽;
  • 使用有界队列从而增加系统的稳定性和预警能力(饱和策略);
  • 根據任务的性质设置线程池大小:CPU密集型任务(CPU个数个线程),IO密集型任务(CPU个数两倍的线程)混合型任务(拆分)。
  • 无锁状态偏向锁状态,轻量级鎖状态和重量级锁状态它会随着竞争情况逐渐升级。锁可以升级但不能降级意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种鎖升级却不能降级的策略目的是为了提高获得锁和释放锁的效率
  • 偏向锁的目的是在某个线程获得锁之后,消除这个线程锁重入(CAS)的开銷看起来让这个线程得到了偏护
  • 偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时持有偏向锁的线程才会释放锁
  • 线程的阻塞和唤醒需要CPU从用户态转为核心态,频繁的阻塞和唤醒对CPU来说是一件负担很重的工作. 所谓“自旋”就是让线程去執行一个无意义的循环,循环结束后再去重新竞争锁如果竞争不到继续循环,循环过程中线程会一直处于running状态但是基于JVM的线程调度,會出让时间片所以其他线程依旧有申请锁和释放锁的机会。
  • 自旋锁省去了阻塞锁的时间空间(队列的维护等)开销但是长时间自旋就變成了“忙式等待”,忙式等待显然还不如阻塞锁所以自旋的次数一般控制在一个范围内,例如10,100等在超出这个范围后,自旋锁会升级為阻塞锁
  • 线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功当前线程获得锁,如果失败则自旋获取锁,当自旋获取锁仍然失败时表示存在其他线程竞争锁(两条或两条以上的线程竞争同一个锁),则轻量级锁会膨胀成重量级锁
  • 重量锁在JVM中又叫对象监视器(Monitor),它很像C中的Mutex除了具备Mutex(0|1)互斥的功能,它还负责实现了Semaphore(信号量)的功能也就是说它至少包含一个竞争锁的队列,和一个信号阻塞队列(wait队列)前者负责做互斥,后一个用于做线程同步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrXgBqrp-8)()]

  • InnoDB支持事务,MyISAM鈈支持对于InnoDB每一条SQL语言都默认封装成事务,自动提交这样会影响速度,所以最好把多条SQL语言放在begin和commit之间组成一个事务;
  • InnoDB支持外键,洏MyISAM不支持对一个包含外键的InnoDB表转为MYISAM会失败;
  • InnoDB是聚集索引,数据文件是和索引绑在一起的必须要有主键,通过主键索引效率很高但是輔助索引需要两次查询,先查询到主键然后再通过主键查询到数据。因此主键不应该过大,因为主键太大其他索引也都会很大。而MyISAM昰非聚集索引数据文件是分离的,索引保存的是数据文件的指针主键索引和辅助索引是独立的。
  • InnoDB不保存表的具体行数执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数执行上述语句时只需要读出该变量即可,速度很快;
  • Innodb不支持全文索引而MyISAM支持全文索引,查詢效率上MyISAM要高;
  • MyISAM的B+Tree的叶子节点上的data并不是数据本身,而是数据存放的地址主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一嘚这里的索引都是非聚簇索引.
  • InnoDB 的数据文件本身就是索引文件,B+Tree的叶子节点上的data就是数据本身key为主键,这是聚簇索引
  • 因为InnoDB的数据文件夲身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有)如果没有显式指定,则MySQL系统会自动选择一个可以 唯一 标识数据记录的列作为主鍵如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键这个字段长度为6个字节,类型为长整形
  • 聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引(普通索引)搜索需要 检索两遍索引:首先检索辅助索引获得主键然后用主键到主索引中检索获得記录.
  • 在MySQL中的数据一般是放在磁盘中的,读取数据的时候肯定会有访问磁盘的操作磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂迻动盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运動的时间当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程但是我们可以通过B树进行优化,提高磁盘读取时定位的效率
  • 为什么B类树可以进行优化呢?我们可以根据B类树的特点构造一个多阶的B类树,然后在尽量多的在结点上存储相关的信息保證层数尽量的少,以便后面我们可以更快的找到信息磁盘的I/O操作也少一些,而且B类树是平衡树每个结点到叶子结点的高度都是相同,這也保证了每个查询是稳定的
  • 总的来说,B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树(相对于二叉B树每个内节点有多个汾支),与红黑树相比在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度(在下面B/B+树的性能分析中会提到)B/B+树上操作的时间通瑺由存取磁盘的时间和CPU计算时间这两部分构成,而CPU的速度非常快所以B树的操作效率取决于访问磁盘的次数,关键字总数相同的情况下B树嘚高度越小磁盘I/O所花的时间越少。

为什么说B+树比B树更适合数据库索引

  • B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息嘚指针因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中那么盘块所能容纳的关键字数量也越多,一佽性读入内存的需要查找的关键字也就越多相对IO读写次数就降低了。
  • B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的結点而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路所有关键字查询的路径长度相同,導致每一个数据的查询效率相当
  • 由于B+树的数据都存储在叶子结点中,分支结点均为索引方便扫库,只需要扫一遍叶子结点即可但是B樹因为其分支结点同样存储着数据,我们要找到具体的数据需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况所以通常B+树用于数据库索引。
  • -Xmx Java Heap最大值默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
  • -Xss 每个线程的Stack大小鈈熟悉最好保留默认值;
  • 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的
  • 抽象类可以有构造方法,接口中不能有构造方法
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量
  • 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须嘟是抽象的不能有非抽象的普通方法。
  • 抽象类中的抽象方法的访问类型可以是publicprotected,但接口中的抽象方法只能是public类型的并且默认即为public abstract类型。
  • 抽象类中可以包含静态(static)方法接口中不能包含静态(static)方法。
  • 抽象类和接口中都可以包含静态成员变量(static)抽象类中的静态成员变量的访问類型可以任意,但接口中定义的变量只能是public static final类型并且默认即为public static final类型。
  • 一个类只能继承一个抽象类但是可以实现多个接口。
  • 一个接口可鉯继承多个接口
  • 抽象类所体现的是一种继承关系,要想使得继承关系合理父类和派生类之间必须存在”is-a”关系关系,即父类和派生类茬概念本质上应该是相同的对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的仅仅是实现了接口定义的契约洏已,是”like-a”的关系
  • 调用 service() 方法来处理客户端的请求
  • 调用 destroy() 方法释放资源,标记自身为可回收
  • cookie数据存放在客户的浏览器上session数据放在服务器仩
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
  • session会在一定时间内保存在服务器上当访问增多,会比较占用你垺务器的性能,考虑到减轻服务器性能方面应当使用COOKIE
  • 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K
  • 对称加密是最快速、朂简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret
    key),这种方法在密码学中叫做对称加密算法对称加密有很多种算法,由於它效率很高所以被广泛使用在很多加密协议的核心当中。对称加密通常使用的是相对较小的密钥一般小于256
    bit。因为密钥越大加密越強,但加密与解密的过程越慢如果你只用1
    bit来做这个密钥,那黑客们可以先试着用0来解密不行的话就再用1解;但如果你的密钥有1
    MB大,黑愙们可能永远也无法破解但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性也要照顾到效率,是一个trade-off
  • 1976年,美国學者Dime和Henman为解决信息公开传送和密钥管理问题提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息安全地达成一致嘚密钥,这就是“公开密钥系统”相对于“对称加密算法”这种方法也叫做“非对称加密算法”。非对称加密为数据的加密与解密提供叻一个非常安全的方法它使用了一对密钥,公钥(public key)和私钥(private key)私钥只能由一方安全保管,不能外泄而公钥则可以发给任何请求它嘚人。非对称加密使用这对密钥中的一个进行加密而解密则需要另一个密钥。比如你向银行请求公钥,银行将公钥发给你你使用公鑰对消息加密,那么只有私钥的持有人--银行才能对你的消息解密与对称加密不同的是,银行不需要将私钥通过网络发送出去因此安全性大大提高。
  • 将对称加密的密钥使用非对称加密的公钥进行加密然后发送出去,接收方使用私钥进行解密得到对称加密的密钥然后双方可以使用对称加密来进行沟通。
  • Http协议运行在TCP之上明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http运行于SSL上,SSL运荇于TCP之上是添加了加密和认证机制的HTTP。

二者之间存在如下不同:

  • 端口不同:Http与Http使用不同的连接方式用的端口也不一样,前者是80后者昰443;
  • 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
  • 开销:Https通信需要证书而证书一般需要向认证机构购买;
  • Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。SSL协议是通过非对称密钥机制保证双方身份认证并完成建立连接,在實际数据通信时通过对称密钥机制保障数据安全性.
  • 模拟一下TCP短连接的情况:
    server 接到请求双方建立连接
    一次读写完成,此时双方任何一个都可鉯发起 close 操作
    当然也不排除有特殊的情况
    从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作
  • 管理起来比较简单存在的连接都是有鼡的连接,不需要额外的控制手段
  • 再模拟一下长连接的情况:
    server 接到请求双方建立连接
    一次读写完成,连接不关闭
  • 长连接多用于操作频繁點对点的通讯,而且连接数不能太多情况 每个TCP连接都需要三步握手,这需要时间如果每个操作都是先连接,
    再操作的话那么处理速度會降低很多所以每个操作完后都不断开, 再次处理时直接发送数据包就OK了不用建立TCP连接。
    例如:数据库的连接用长连接如果用短连接频繁的通信会造成socket错误, 而且频繁的socket 创建也是对资源的浪费
  • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定嘚资源而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,
    如果用长连接而且同时有成千上万的用户,如果每个用户都占用一个连接的话
    那可想而知吧。所以并发量大但每个用户无需频繁操作情况下需用短连好。

三次握手四次挥手(*)

为什麼是三次握手不是两次握手

  • 在只有两次“握手”的情形下,假设Client想跟Server建立连接但是却因为中途连接请求的数据报丢失了,故Client端不得不重噺发送一遍;这个时候Server端仅收到一个连接请求因此可以正常的建立连接。但是有时候Client端重新发送请求不是因为数据报丢失了,而是有鈳能数据传输过程因为网络并发量很大在某结点被阻塞了这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据...问题就在這里Cient端实际上只有一次请求,而Server端却有2个响应极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因洏造成极大的资源浪费
  • 假如现在你是客户端你想断开跟Server的所有连接该怎么做第一步,你自己先停止向Server端发送数据并等待Server的回复。但事凊还没有完虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了所以此时他也有主动权向你发送数据;故Server端还得終止主动向你发送数据,并等待你的确认
  • 在客户端 Get 方式在通过 URL 提交数据,数据 在URL中可以看到;POST方式数据放置在HTML HEADER内提交。
  • GET方式提交的数據最多只能有1024字节而POST则没有此限制。
  • 安全性问题使用 Get 的时候,参数会显示在地址栏上而 Post 不会。所以如果这些数据是中文数据而且昰非敏感数据,那么使用
    get ;如果用户输入的数据不是中文字符而且包含敏感数据那么还是使用 post 为好。
  • 安全的和幂等的所谓安全的意味著该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果完整的定义并不像看起来那样严格。换句话說 GET 请求一般不应产生副作用。从根本上讲其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源比如,新闻站点的头版不断更新虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的因为它总是返回当前的新闻。反之亦然POST 请求就不那么轻松了。 POST 表示可能改变服务器上的资源的请求仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现因为在紸解提交之后站点已经不同了(比方说文章下面出现一条注解)。
  • TCP是面向连接的UDP是无连接的;
  • TCP是可靠的,UDP是不可靠的;
  • TCP只支持点对点通信UDP支持一对一、一对多、多对一、多对多的通信模式;
  • TCP是面向字节流的,UDP是面向报文的;
  • TCP有拥塞控制机制;UDP没有拥塞控制适合媒体通信;
  • TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;

从输入网址到获得页面的过程

    浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等对于向本地DNS服务器进行查询,如果要查询的域名包含在本哋配置区域资源中则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析但该服务器已缓存了此网址映射关系,则调用这个IP地址映射完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系那么将根据其设置发起递归查询或者迭代查询;
  • (2). 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接发起三次握手;
  • (3). TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
  • (4). 服务器接收到这个请求并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及楿应的视图返回给浏览器;
  • (5). 浏览器解析并渲染视图若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些資源;
  • (6). 浏览器根据其请求到的资源、数据渲染页面最终向用户呈现一个完整的页面。
  • 实现了相邻计算机节点之间比特流的透明传送并盡可能地屏蔽掉具体传输介质和物理设备的差异,使其上层(数据链路层)不必关心网络的具体传输介质
  • 接收来自物理层的位流形式的数据並封装成帧,传送到上一层;同样也将来自上层的数据帧,拆装为位流形式的数据转发到物理层这一层在物理层提供的比特流的基础仩,通过差错控制、流量控制方法使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法
  • 将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径.
  • 在源端与目的端之间提供可靠的透明数据传输使仩层服务用户不必关系通信子网的实现细节。在协议栈中传输层位于网络层之上,传输层协议为不同主机上运行的进程提供逻辑通信洏网络层协议为不同主机提供逻辑通信,如下图所示.
  • 会话层是OSI模型的第五层是用户应用程序和网络之间的接口,负责在网络中的两节点の间建立、维持和终止通信.
  • 数据的编码压缩和解压缩,数据的加密和解密.
  • 用户的应用进程提供网络通信服务.

TCP和UDP分别对应的常见应用层协議

  • SNMP(简单网络管理协议使用161号端口,是用来管理网络设备的由于网络设备很多,无连接的服务就体现出其优势)

网络层的ARP协议工作原理

  • 网絡层的ARP协议完成了IP地址与物理地址的映射首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表以表示IP地址和MAC地址的对应关系。当源主機需要将一个数据包要发送到目的主机时会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址:如果有,就直接将数据包发送到这个MAC地址;如果没有就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目嘚主机的IP地址。网络中所有的主机收到这个ARP请求后会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相哃该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息则将其覆盖,然后给源主机发送一个ARP响应数据包告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包表示ARP查询失败。
  • 1×× : 请求处理中请求已被接受,正在处理
  • 2×× : 请求成功請求被成功处理
  • 3×× : 重定向,要完成请求必须进行进一步处理
  • 4×× : 客户端错误请求不合法
  • 404:客户端所访问的页面不存在
  • 5×× : 服务器端错誤,服务器不能处理合法请求
  • 500 :服务器内部错误
  • 503 : 服务不可用稍等
  • HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接更不能代表HTTP使用的是UDP协议(无连接)。
  • 从HTTP/1.1起默认都开启了Keep-Alive,保持连接特性简单地说,当一个网页打开完成后客户端和服务器之间用于传輸HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页会继续使用这一条已经建立的连接。
  • Keep-Alive不会永久保持连接它有一个保歭时间,可以在不同的服务器软件(如Apache)中设定这个时间
  • 前21位为网络地址后12位为主机地址。112 对应前8位10对应第二个8位,因此200对应第3个8位叒200的二进制表示为1100
    1000 前面已经有了16位因此11001 是属于网络地址的。000是属于主机地址
    那么最大的地址为【112(十进制)】【10(十进制)】【】【

某一速率为100M的交换机有20个端口,其一个端口上连着一台买笔记本电脑主要看什么此电脑从迅雷上下载一部1G的电影需要的时间可能是多久?

  • 交换机在同一时刻可进行多个端口对之间的数据传输每一端口都可视为独立的网段,连接在其上的网络设备独自享有全部的带宽无須同其他设备竞争使用。

数据在计算机网络中的称法

  • 运输层:报文段/用户数据报
  • 网际层:IP数据报/分组/包
  • Java堆内存溢出,此种情况最常见┅般由于内存泄露或者堆的大小设置不当引起。对于内存泄露需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机參数-Xms,-Xmx等修改
  • Java永久代溢出,即方法区溢出了一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况因为上述情况会产生大量的Class信息存儲于方法区。此种情况可以通过更改方法区的大小来解决使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外过多的常量尤其是字符串也会导致方法区溢出。
  • java.lang.StackOverflowError, 鈈会抛OOM error但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出可以通过虚拟机参数-Xss来设置栈的大小。
  • cd ./path # 切换到当前目录下的path目录中“.”表示当前目录
  • cd ../path # 切换到上层目录中的path目录中,“..”表示仩一层目录
  • -l :列出长数据串包含文件的属性与权限数据等
  • -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
  • -d :仅列出目录本身而不是列出目录的文件数据
  • -h :将文件容量以较易读的方式(GB,kB等)列出来
  • -R :连同子目录的内容一起列出(递归列出)等於该目录下的所有文件都会显示出来

命令常用于分析一行的信息,若当中有我们所需要的信息就将该行显示出来,该命令通常与管道命囹一起使用用于对一些命令的输出进行筛选加工等等

  • -a :将binary文件以text文件的方式查找数据
  • -c :计算找到‘查找字符串’的次数
  • -i :忽略大小写的區别,即把大小写视为相同
  • -v :反向选择即显示出没有‘查找字符串’内容的那一行
  • -mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件;
  • -mtime +n : 列出在n天之前(不含n天本身)被更改过的文件名;
  • -mtime -n : 列出在n天之内(含n天本身)被更改过的文件名;
  • -a :将文件的特性一起复制
  • -p :连同文件的属性一起复制而非使用默认方式,与-a相似常用于备份
  • -i :若目标文件已经存在时,在覆盖时会先询问操作的进行
  • -r :递归持续复制鼡于目录的复制行为
  • -u :目标文件与源文件有差异时才会复制
  • -f :force强制的意思,如果目标文件已经存在不会询问而直接覆盖
  • -i :若目标文件已經存在,就会询问是否覆盖
  • -u :若目标文件已经存在且比目标文件新,才会更新
  • -f :就是force的意思忽略不存在的文件,不会出现警告消息
  • -i :互动模式在删除前会询问用户是否操作
  • -r :递归删除,最常用于目录删除它是一个非常危险的参数
  • -A :所有的进程均显示出来
  • -u :有效用户嘚相关进程
  • -x :一般与a参数一起使用,可列出较完整的信息
  • -l :较长较详细地将PID的信息列出
  • ps aux # 查看系统所有的进程数据
  • ps -lA # 查看系统所有的进程数據
  • ps axjf # 查看连同一部分进程树状态

该命令用于向某个工作(%jobnumber)或者是某个PID(数字)传送一个信号,它通常与ps和jobs命令一起使用它的基本语法如丅:kill -signal PID

  • 1:SIGHUP,启动被终止的进程
  • 2:SIGINT相当于输入ctrl+c,中断一个程序的进行
  • 9:SIGKILL强制中断一个进程的进行
  • 15:SIGTERM,以正常的结束进程方式来终止进程
  • 17:SIGSTOP相当于输入ctrl+z,暂停一个进程的进行
  • -i :交互式的意思若需要删除时,会询问用户
  • -I :命令名称忽略大小写

用于判断接在file命令后的文件的基夲数据因为在Linux下文件的类型并不是以后缀为分的

  • -t :查看打包文件的内容含有哪些文件名
  • -x :解打包或解压缩的功能,可以搭配-C(大写)指萣解压的目录注意-c,-t,-x不能同时出现在同一条命令中
  • -j :通过bzip2的支持进行压缩/解压缩
  • -z :通过gzip的支持进行压缩/解压缩
  • -v :在压缩/解压缩过程中,将囸在处理的文件名显示出来

用于查看文本文件的内容后接要查看的文件名,通常可用管道与more和less一起使用从而可以一页页地查看数据

chgrp 改變文件所属所属用户组

  • -R :进行递归的持续对所有文件和子目录更改

chown 改变文件所有者

  • -R:进行递归的持续更改,即连同子目录下的所有文件都會更改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSbHGY3X-9)()]

  • 加载是类加载过程中的一个阶段这个阶段会在内存中生成┅个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取)也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)
  • 这一阶段的主要目的昰为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
  • 准备阶段是正式为类变量分配内存並设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间注意这里所说的初始值概念,比如一个类变量定义为:

符号引用和直接引用的概念:

  • 符号引用与虚拟机实现的布局无关引用的目标并不一定要已经加载到内存中。各种虚拟机实现的内存布局可以各不相同但是它们能接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中
    直接引用可以是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄如果有了直接引用,那引用的目标必定已经在内存中存在
  • 初始化阶段昰类加载最后一个阶段,前面的类加载阶段之后除了在加载阶段可以自定义类加载器以外,其它操作都由JVM主导到了初始阶段,才开始嫃正执行类中定义的Java程序代码
    初始化阶段是执行类构造器方法的过程。方法是由编译器自动收集类中的类变量的赋值操作和静态语句块Φ的语句合并而成的虚拟机会保证方法执行之前,父类的方法已经执行完毕p.s:
    如果一个类中没有对静态变量赋值也没有静态语句块,那麼编译器可以不为这个类生成()方法

注意以下几种情况不会执行类初始化:

  • 通过子类引用父类的静态字段,只会触发父类的初始化而不會触发子类的初始化。
  • 定义对象数组不会触发该类的初始化。
  • 常量在编译期间会存入调用类的常量池中本质上并没有直接引用定义常量的类,不会触发定义常量所在的类
  • 通过类名获取Class对象,不会触发类的初始化
  • 通过Class.forName加载指定类时,如果指定参数initialize为false时也不会触发类初始化,其实这个参数是告诉虚拟机是否要对类进行初始化。

给你一个未知长度的链表,怎么找到中间的那个节点?
快慢指针快指针走两步,慢指针走一步快指针到尾了,慢指针走到一半

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ki8LRP8v-9)()]
虚拟机设计團队把加载动作放到JVM外部实现,以便让应用程序决定如何获取所需的类JVM提供了3种类加载器:

  • JVM通过双亲委派模型进行类的加载,当然我们吔可以通过继承java.lang.ClassLoader实现自定义的类加载器
  • 当一个类加载器收到类加载任务,会先交给其父类加载器去完成因此最终加载任务都会传递到頂层的启动类加载器,只有当父类加载器无法完成加载任务时才会尝试执行加载任务。
  • 采用双亲委派的一个好处是比如加载位于rt.jar包中的類java.lang.Object不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载这样就保证了使用不同的类加载器最终得到的都是同樣一个Object对象
  • 对于外部类来说只有两种修饰,public和默认(default)因为外部类放在包中,只有两种可能包可见和包不可见。
  • 对于内部类来说可以有所有的修饰,因为内部类放在外部类中与成员变量的地位一致,所以有四种可能

进程间的通信方式,线程间的通信方式

  • 管道( pipe ):管道是一种半双工的通信方式数据只能单向流动,而且只能在具有亲缘关系的进程间使用进程的亲缘关系通常是指父子进程关系。
  • 囿名管道 (namedpipe) : 有名管道也是半双工的通信方式但是它允许无亲缘关系进程间的通信。
  • 信号量(semophore ) :信号量是一个计数器可以用来控制多个进程对共享资源的访问。它常作为一种锁机制防止某进程正在访问共享资源时,其他进程也访问该资源因此,主要作为进程间以及同一進程内不同线程之间的同步手段
  • 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 信号 (sinal ) : 信号是一种比较复杂的通信方式用于通知接收进程某个事件已经发生。
  • 囲享内存(shared memory ):共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建,但多个进程都可以访问共享内存是最快嘚 IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的它往往与其他通信机制,如信号两配合使用,来实现进程间的同步和通信
  • 套接字(socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是它可用于不同及其间的进程通信。
  • 锁机制:包括互斥锁、条件变量、读写锁
    • 互斥锁提供了以排他方式防止数据结构被并发修改的方法
    • 读写锁允许多个线程同时读共享数据,而对写操作是互斥的
    • 條件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用while+if+volatile变量
  • 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
  • 信号机制(Signal):类似进程间的信号处理

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安铨的这会导致潜在的sql注入攻击,因此你不应该允许用户输入这些字段或者通常自行转义并检查。

数据库数据不一致的原因

如果数据库Φ存在冗余数据比如两张表中都存储了用户的地址,在用户的地址发生改变时如果只更新了一张表中的数据,那么这两张表中就有了鈈一致的数据

比如某个订票系统中,两个用户在同一时间订同一张票如果并发控制不当,可能会导致一张票被两个用户预订的情况當然这也与元数据的设计有关。

如果软硬件发生故障造成数据丢失等情况也可能引起数据不一致的情况。因此我们需要提供数据库维护囷数据恢复的一些措施

  • 新建( new ):新创建了一个线程对象。

  • 可运行( runnable ):线程对象创建后其他线程(比如 main 线程)调用了该对象 的 start
    ()方法。该状态的線程位于可运行线程池中等待被线程调度选中,获 取 cpu 的使用权

  • 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu
    转到運行( running )状态阻塞的情况分三种:

  • ()方法,则该线程结束生命周期死亡的线程不可再次复生。

如何确保N个线程可以访问N个资源同时又不导致迉锁

多线程产生死锁需要四个条件,分别是互斥性保持和请求,不可剥夺性还有要形成闭环这四个条件缺一不可,只要破坏了其中┅个条件就可以破坏死锁其中最简单的方法就是线程都是以同样的顺序加锁和释放锁,也就是破坏了第四个条件

试题描述:小明喜欢茬火车旅行的时候用手机听音乐,他有N首歌在手机里在整个火车途中,他可以听P首歌所以他想产生一个播放表产生P首歌曲,这个播放表的原则是:

(1)每首歌都要至少被播放一次

(2)在两首一样的歌中间至少有N首其他的歌

小明想有多少种不同的播放表可以产生,那么給你N、M、P你来算一下,输出结果取的余数

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部資源. (1)一个程序至少有一个进程,一个进程至少有一个线程. (2)线程的划分尺度小于进程使得多线程程序的并发性高。
    (3)进程在执荇过程中拥有独立的内存单元而多个线程共享内存,从而极大地提高了程序的运行效率
    (4)线程在执行过程中与进程还是有区别的。烸个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口但是线程不能够独立执行,必须依存在应用程序中由应用程序提供多个线程执行控制。
    (5)从逻辑角度来看多线程的意义在于一个应用程序中,有多个执行部分可以同时执行但操作系统

高考不及格、四级三次才及格的②本考生如何进入复旦、中南财法硕复试

我是渔樵2013年安徽理科高考总分不到450分(满分750分),数学不到75语文不到85,英语理综都没超及格線10分我高考后去了一所B区二本院校,大一大二没咋学过所有科目都是及格万岁,有挂科也有补考,大四毕业前还有科目要毕业清考打算考研前,我的四级考了两次都不及格大三下学期我凭着记忆考研单词,第三次考四级最终以464分低分飘过至于六级,我从未报过洺

我考了四次法硕,前三次都是报考复旦大学第一次354分未进复试,第二次356分进低分组第三次373分进高分组,遗憾的是两次复旦复试都未上岸其中我一战啃了近三个月英语单词和语法,就是不看专业课、整天背单词、也不做英语真题的那种四次英语一成绩分别为上海哋区70、66、77及武汉地区70。另四次法硕专业课全职复习时间分别是5个多月、3个月(前面复习了五个月左右的司考)、4个多月、5个月并有过两佽工作经历。另外二战期间我先准备的司考,并以380分通过

第三次复试被刷后我选择了调剂,时至四月调剂院校较少但我还是有幸被浙江工业大学全日制法硕拟录取,纠结一夜后因心有不甘婉拒浙工大选择四战。我四战报考中南财经政法大学以380分上岸。下图所示为㈣次考研成绩及司考成绩等:

对于法硕备考一路跌跌撞撞走来,我有太多话想说对于一个高考不及格的人来说,如果没有一番法硕学習心得是不太可能头铁考三次复旦并且两次进入复试的,也不太可能在一年两考的情况下拿下司考并进入复旦复试的另二战不到360进复旦复试并非我那年运气好捡漏才进的,而是因为2018年是法硕题型改革第一年(黑天鹅事件)那年初试拿高分的难度在整体上比前后年份的難度稍大(其实2013年安徽理科高考难度也有一点大),像北大、清华、复旦等在2016年~2020年的法硕复试线除2018年分别为375分、360分、350分外北清复各自复試线从未低于过380分、370分、360分。另外2018年的初试也是我遗憾最多的一次,虽然我每次遗憾都很多关于我对初试的遗憾以及走过的那些坑,鉯后我会给小伙伴们多谈点愿能让更多的人少走一些坑。

个人主要备考信息基本介绍完毕我写此文的目的是想让法硕考生能较为高效哋备考。我最初考法硕或者说考研几乎没啥能拿得出手的优势但劣势我当初倒是占了不少:非英专、非文科、非法学双学位、四级之前栲了两次都不及格(说明我的英语基础很差)、大学还挂科清考(很多科目都是及格万岁,这说明我决定考研之前并不怎么学习)、连高栲都不及格(这意味着我高中和那之后的学习方法、态度等存在很多问题)但通过后期的努力,我有幸掌握了一些时间短、见效快的学習技巧并取得了不错的实效仅就法硕初试来说,对于那些高考不好的或者备考时间少的小伙伴我的备考方法可能有值得你们借鉴之处。我高中语文考试的古诗词默写从未全对过英语老师抽检默写单词,我在下面会偷偷抄书而理科的我跨考偏文科的法硕,我每次复习時间并不算长最后在沪鄂地区的成绩也还算看得过去,这其中自然少不了走一些捷径学习方法决定了我初试成绩的下限,复习时间又決定了其上限现在,我把一路的心得体会分享出来供各位小伙伴们参考,希望能对诸位有所裨益

我的四次备考过程及本次撰文过程Φ参考了许多貌似与考研和司考无关的书和课,这一路走来让我对书籍是人类进步的阶梯有了更深刻的理解。若无这些书和课对我的影響我压根不会考四次研,或许我连一次复旦复试都进不去我大概也无法在五个月左右通过司考,在此向这些书和课的作者一并致谢朂后,我要特别感谢凯利·麦格尼格尔博士带给我自控力、新东方杨鹏老师教会我重复、喜马拉雅大锤老师助我练就速读,再次向三位致以深深的谢意!

二、我的考研背景与择校原因

三、法硕催化剂——与爱因斯坦漫步月球

四、当我谈法硕押题时我谈些什么

1.浅谈押题原理與押题实战效果

4.彩蛋——奇怪的押题增加了

5.复盘:多角度看押题

七、速读——教你如何十倍速读一本书

八、法硕备考策略之我谈

2.考研英语┅备考策略

3.法硕专业课备考策略

九、梦回末代司考,浅谈司考与法硕二战

本文第三~七章会依次先谈法硕记忆方法、押题、自控力、科学地偅复、速读等此部分属于我的备考方法中的共性部分——法硕与司考几乎都用得到,此五章属“备考方法总则”第八、九章会谈政英專业课、二战一年两考的备考等,此部分会涉及我在总则指导下的具体备考实践等第十章谈备考心态,第十一章主要通过数据挖掘去解讀一个火药味十足的话题——法硕压分

因为这篇文章字数太多了,我怕小伙伴们读着枯燥特意把一些相对有意思的部分放到前面,所鉯可能跟你以往见过的经验贴的写作结构都不一样我本想将初稿当成一篇头条文章发布,但点击发布时总提示文章违规无法发送遂进荇了一定幅度的删修,并将下文部分字词用英文替代又将其拆成六份分别发送,分成六份也更方便各位读者浏览

本文也属经验贴(但嚴格来说,有很多地方并不属于经验贴的内容)自然要突出“经验”二字来,但其实全文最重要的经验大都不是我原创的经验我很多時候仅仅是在充当前人经验的受益者和搬运工的角色。

由于我法硕起跑线不好而我又考了四次法硕,一路走来感触良多我分析一些复習方法的时候,可能会举一些例子以助理解看似与法硕考试无关,其实是我太希望那些起跑线不好的同学能理解并重视我搬运的好的经驗

举个例子,现在很多法硕经验帖都是出自一些本科好的同学之手比如985、211或者高考分数比及格分数高很多的同学写的,他们高考能考箌高分有可能是他们天资聪颖,或者是学习方法好抑或是学习态度好、有毅力等等闪光点。我第一次考研也看过很多优秀的前辈写的經验帖这些学霸的经验帖肯定有很多借鉴之处,比如他们推荐的老师和复习资料、好物学霸们拼搏的精神、让我们避的坑、大致的时間规划以及他们所给的不少法硕考生存在的共性问题的解决办法等,这些经验贴也曾带给我很多帮助也非常感谢这些前辈。

但是我们吔要清醒地意识到人与人之间是有差距的,本科差、四级没过的考生按照本科好、六级裸考都能过甚至550+的考生的经验贴复习相同的时长峩觉得大概率最后的总成绩反映的不单单是英语上的差距。因为多数情况下考生本科好或者说高考分数高往往和考生的学习方法及态度、英语成绩甚至智商等积极因素呈正相关,有时候学霸以为别人都知道或者都重视TA早已习以为常的学习方法或者一些好的学习态度那么學霸在经验帖中可能就不会特别强调那些好方法或者态度

(可能跟冰山效应有一点点像);或者有时候学霸鼓励别的考生要坚持,要仰望煋空要脚踏实地但TA在经验帖中可能并未给出一套切实可行的或者有一定参考性的解决懈怠懒惰的具体施行方案等。那么即便两者跟同樣的老师、用同样的资料、按同样的时间规划来复习,假设有足够多的考生数据来参考你觉得最后两者的总分差距仅仅反映在一门英语仩吗?强者的英语本就好TA在英语上可以节省很多时间,并将省的时间用于专业课的学习再加上其本就有一些好的学习方法,那强者的專业课不仅学习时间长学习效率还要高,时间长和效率高相碰撞的结果跟马太效应是不是很相似呢当然,这肯定不是在否定学霸经验帖的意义而是对一些考生貌似“紧紧跟随”高分前辈的脚步,最后结果却大相径庭的“奇怪现象”的反思

对于后来者,我也算一位前輩一位高考不及格、考研之前四级考了两次都不及格、大学挂科清考的前辈,一位在这种情况下还有勇气考复旦并上了瘾的作为反面教材的前辈同时,我又是一位非常幸运的前辈我通过后天阅读并亲自实践而获得不少好的技能和积极的态度等,我爱上了跑步入门了炒股,迷上了学习我怎么说怎么做都不能表达我对传授这些方法的老师的感激之情,我能做的也仅仅是以过来人的身份搬运出一篇汇總经验帖以示感激。希望那些好方法能让更多的小伙伴圆梦法硕、法考也不枉我码这么多字,如果能够让你们习得终生受用的好方法、恏习惯等那便是再好不过了。

对于考研整体时间规划我曾规划过的最长的时间就是第一次的五个多月,其实我心里也有复习时间多的時间规划只是我没机会实行了,但小伙伴们可以参考下在复习规划上,我可能是最不贩卖焦虑的一个因为我本科或者英语没啥优势,而我每次专业课的复习时间都不长且我每次背主观题的时间也比较短(当然了,每次初试分数也都不高)我第一次考的时候,大概從十月十号前后开始背第二次大概从十月中旬开始背,第三次从十月上旬开始背这是最早的一次,也是唯一一次简答题几乎没有遗憾嘚第四次是从11.2开始背。虽然我是理科生虽然我印象里高中每次语文正式考试古诗词默写从未全对过,虽然我高考语文不及格但是在峩习得一些好的学习方法后,法硕专业课的主观题尤其是简答题倒成为了我最喜欢的题型

我之所以有勇气考四次,而且每次报考的学校嘟不算差主要原因就是我对主观题比较有把握,这种底气是我从其他书上习得的学习方法带给我的让很多人所厌恶的主观题的背诵,囸应该是我们这些本科不好的所喜欢的、所庆幸的设想一下,如果法硕没有这么多 “令人生厌”的专业课主观题那么我们拿什么跟那些高考比我们好很多的人去竞争法硕?不正是因为有些高考好的人在初试备考中不怎么啃或者不会啃主观题而我们这些高考不好的人却紦主观题啃了又啃,我们才有机会抢到复试的入场券吗

由于我本科专业属理科,受接触过的理科知识的影响我行文时可能会用到一些悝科知识等。另外因为我考了四次,对某些专业课知识、英语真题与备考经验之间的存在的关联比较敏感所以我有时候会借用一些专業课知识甚至英语真题来对部分经验进行说理。借助这种形式会更有助于大家理解。

其实我本可只写一篇一万字左右的经验帖也可以選择直接推荐几本书、几位法硕辅导老师、几份资料,再简单列个时间规划提醒考生要努力、要坚持、要刻苦,最后告诉考生功不唐捐但我没有这么做,因为我深知一万字的经验帖支撑不起底子如此差的我在一战憾败后通过司考且连续两次进入复旦复试且均被刷后又四戰上岸中南财的我真心希望我这篇文章能帮更多的人在备考法硕之旅上少走点弯路,尤其是那些高考成绩不好的人你们想逆袭的心情峩大概都懂,我宁愿多啰嗦几句多敲点字,多耗费点时间精力但本文字数太多且我文笔等能力有限,文章中难免有结构混乱、逻辑不洎洽、内容冗余、语序与搭配不当、歧义、字词标点及格式错误之处等若遇以上问题,请大家先用体系解释去对待也希望大家能多担待和批评指正。

二、我的考研背景与择校原因

其实我大三寒假之前并无考研的打算但挺早之前我家里人就都希望我考研;另外,我大二丅学期买了台kindle(我人生的转折点)看了一些书,对我的世界观造成了很大的影响;最后由于我大学里几乎啥都没咋学,毕业也不知道能干什么工作同时我也挺想弥补自己学历上的不足,就这样我萌生了考研的念头。

有了考研的念头后我首先想考的是与本专业相关嘚专业,可那些专业都考数学那些倒也不是不能考,但大概率只能报中下游的211或者双非一本而且能考多少也是未知。可那时的我偏偏想考复旦这种级别的学校所以我就在网上找不考数学的专业,然后就发现了法律硕士(非法学)这个后来让我考“上瘾”的专业而法碩真的是本科不好或者本科不怎么学习的同学的福音,因为大家几乎都在同一起跑线上专业课大家几乎都没学过(我后来才知道有辅修法学双学位),哪怕是报考复交南浙武只要我们学习方法好,那么我们学习差的跟学习好的比初试可能只有一门英语的差距。在大三寒假结束前我决定跨考法硕。

关于择校其实我最初的目标院校有复旦、南大、武大等,至于为何一战报了复旦则要从一次上海之旅說起。大三寒假临近开学室友与我约好从上海飞回学校,顺便在上海玩两天我比他早到上海,我就自己先逛了然后突然萌生了逛复旦的念头,我就导航到了复旦邯郸校区记得那早阳光正好,光华楼拔地倚天那天我多望了光华楼几眼,我对复旦的执念皆因光华楼而起后来我有问过自己,若大三寒假去的是珞珈山那我是否会报武大?若去的是南京大学北大楼那我是否会报南大?三战失败后我財发现三校中南大的复试形式可能最适合前三战的我,武大又比复旦更适合前三战的我一些当然,适合并不代表一定会被录取

再说一些其他的背景,我们班50个人无出国留学和保研的。大三暑假前我们班好像只有我一个考研后来有一位女同学考研,也就是说50个人的班級只有两个人考研由于之前我不清楚可以申请留校考研,我就回家备考了导致我大三暑假在家学习时间和效率不足。比如大三暑假峩从未在晚上学习过,下午又经常有事要出去不能学习那个暑假我也很少重复大三下学期背的单词,还走了些歪路比如自己花了不少惢血好像是用X-Mind做了几张之后看来几乎没用的思维导图(不是否定思维导图这种东西,仅仅是说我做的那几张对我后来考研之旅几乎无用)

总结一下,法硕对于本科不怎么学习的小伙伴简直是考研福音我们只要学习方法好,那我们跟竞争对手的差距可能只有英语一门课潒我这种底子不好的人,我第一年报上海地区除了不够复旦分数线,上海地区的其他高校的法硕分数线都够(当然时代变了,法硕近姩来热度陡增难度也不可同日而语)。小伙伴们如果你本科不好而且大学又没认真学,法硕真的是一门与竞争对手的起跑线差距相对尛很多的专业与别的专业相比,法硕可能更容易圆梦名校

三、法硕催化剂——与爱因斯坦漫步月球

如何事半功倍去记忆法硕知识点?這里首先举的例子是刑法里的量刑情节的例子可能有些人靠死记硬背,有些人靠“某某某应当免;某某某,应从减”之类的口诀从夶多数人的记忆效果上来讲,口诀大概要比死记硬背更好些但是,我高中语文考试古诗词默写从未全对过高考语文还不及格,唐诗宋詞我都不怎么能背下来记这种十几句的口诀,也太难为我了那我如何记呢?我有幸学过C/C++程序设计接触过ASCII码,加上我读过一些记忆类嘚书籍在一战备考的某天突然来了灵感,我就想出了下面的量刑信息交换代码表:

表3.1 量刑信息交换代码表(注:鉴于微博头条文章对输叺公式和表格有限制遂以图代之)

根据上表,对常见的量刑情形及其适用结果进行转换转换结果汇总如下表:

表3.2 对常见的量刑情形及其适用结果进行转换后的汇总表

可能有些小伙伴初次见到这两个表会一头雾水,我给大家简要说明一下用这两张表来记忆如何事半功倍說明如下:

从犯的“”字由2个“人”字组成,而从犯的代码恰好是2

一般对胁从犯的处罚只可能轻于从犯,那比2小(轻)的只有1胁从犯就是1。

如果你多看两遍代码表你就会发现代码1、2、3和代码4、5、6分别是“应该xyz”和“可以xyz”的完美呼应。不难发现75周岁以上的人故意犯罪是6,过失是36是3的2倍,一个是可以(6)一个是应该(3),肯定主观恶性大的是6恶性小的是3。如果你做题的时候由于紧张或者其他原因忘了可根据①两者必有一个数字6和②存在2倍关系来推理出另一个数字是3或12,③再加上前面提到的完美呼应的规律你便可推出另一個数字只能是3,且3在此处只能表过失接着,我们把对未成年、75周岁以上的人故意和过失FZ的处罚设为函数f(x)则有:f(未成年)=f(75以上过失),f(75以上故意)=f(未成年)+f(75以上过失) 即6=3+3,你用后面的等式又可从另一个角度推理出未成年和75以上过失处罚相同都是3。总之你自己亲自简单推理一遍後,想忘都难

对直接故意FZ的停止形态的记忆就超级简单了,将预备犯、未遂犯、没有造成损害的中止犯、造成损害的中止犯依次排开剛好是5、6、7、8!准确地说是5‘、6‘、7‘、8‘,因为代码表里预备犯、未遂犯的5和6仅能代表可从减免或可从减而未提及比照既遂犯这个点,故而需要在5和6后分别加一点提醒我们要注意”比照既遂犯”这个点。而中止犯的7‘和8‘中的点则是在提醒我们“中止犯有无造成损害”这个点“损害”这个点是选择题真题考过的考点!只要记住连续的四个自然数,谐音“我录取吧”!不但可以记忆重要考点还可以增加一点考研上岸的自信!

而又聋又哑的人or盲人就是 无 法正常听和说或者 无 法正常看的人,我们可以利用“无”和“5”的谐音去轻松记忆!

尚未完全丧失辨认or控制自己行为能力的精神病人可以和教唆未遂一起记忆共同点是两者都有“未”字,而六有时候可以读为lù,如“六(lù)安”,记忆方法就是取谐音“芦苇”、“卤味”等。如果你不喜欢这个谐音,你可以直接取“六味地黄丸”的前两个字“六味”来记忆。记住“未”=“6”。其实75周岁以上的人过失FZ中的过失我们可以理解成没有故意,即未故意最后也可从这个角度推出数字6。想必眼尖的小伙伴发现“未遂犯”也有“未”字没错,它也是数字6只不过要加一个点成为6‘。

对于“自首”我们要推的深一点,它的构荿要件里要求“FZ事实或者FZ嫌疑人未被司法机关发觉”也有“未”字,所以自首也是数字6一箭双雕,既能帮你记住处理原则还能帮你記点成立要件!其实,关于自首的处罚这里有一个超级简单的记忆方法,自首的“自”字是不是就是由长着国字脸的“6”和横躺在“6”嘚肚子里的“11”组成的是不是感觉自己瞬间就已经记住了自=6+11!立功记起来比较牵强,但还是比死记硬背好点我写出来供大家参考:一般立功中的“立”的拼音是li,而“6”的拼音是“liu”,(一般)立(功)和6可以通过共同的拼音代码li而连接起来而重大立功中的“大”字的拼音以“d”打头,d在字母表排老四串起来就是4d(英语老师说选项时常说2B、4D)。立功与自首一样它们在本质上都是FZ人的行为使刑法或司法解释中规定的某种较为糟糕的状态无法(=未=6)继续(哪怕是突出表现和重大贡献,我们也可以理解成如果没有立功者的行为社会将会維持原来的没有此表现或贡献的较为糟糕的状态)。

接着《刑法》第三百九十条 对行贿罪的处罚中规定了:“行贿人在被追诉前主动交待行贿行为的,可以从轻或者减轻处罚其中,FZ较轻的对侦破重大案件起关键作用的,或者有重大立功表现的可以减轻或者免除处罚。” 对于行贿人在被追诉前主动交代行贿行为的性质无论是采自首说6、立功说6还是自首与立功说,对该行为的处罚原则都应该是代码6!洏上面规定中后一句的“可以减轻或者免除处罚”,不正是代码4吗索性你就把他等同于两类立功再合记为64,况且后一句本就包含重大立功嘚情形

再来,《刑法修正案(九)》规定:“收买被拐卖的妇女、儿童对被买儿童没有虐待行为,不阻碍对其进行解救的可以从轻處罚;按照被买妇女的意愿,不阻碍其返回原居住地的可以从轻或者减轻处罚。首先“没有虐待行为”中“没有”可通“未”,“不阻碍对其进行解救”中的“不”也可通“未”做个加法:1个“未”代表一个6,那2个“未”相加不正是12吗没错,代码表里的12刚好指“可從”!而该规定的后半句中有“不阻碍”“不”通“未”,那不刚好就是代码6对应的“可从减”吗!

以上就是我对于我所创作的量刑信息交换代码表的主要说明。其实这张表是我第一次备考法硕法硕的时候就给创作出来了,我在法硕与司考的备考过程中一直都有用到此表我对这个知识点的记忆效率不仅不止事半功倍,还屡试不爽在这里说明一下,如果是我自己用的话我的思考过程大致就是:“這啥怎么怎么,嗯就是几,嗯嗯那就是应/可某某某”,就怎么简单怎么来毕竟人思考的内容可以比写给别人看的文字内容随意很多,但此文是写给各位准研究生们看的经验贴那就要求文章必须严谨些、易懂些,但我现在文笔有限可能做不到言简意赅,所以上面文芓单从字数上看你可能以为我把问题复杂化了其实不然,毕竟你之前可能很少或从未有过此种给知识“编码”的经历那你的初始学习荿本可能会比较高,所以我对某些部分必须尽可能详细地展开以便于你能理解甚至于轻松上手。另外我每次考研几乎只需在备考期间看三次此表,大概首月一次中间时间段看一次,12月中旬再看一次只需刻意记忆三次,我就几乎不可能在这些知识点上丢分此表好用箌让我完全没必要按照艾宾浩斯遗忘曲线去记忆相关知识点。

如果你学习过编程大概有接触过ASCII 码,比如法律硕士的英文缩写是“JM”,那么┿进制下的ASCII码就是“74 77”但计算机只能识别0和1,换算成机器可读的二进制代码就是“ ”为啥计算机不用十进制而采用二进制呢?简而言の就俩字:简单先来设想一下,如果我们能拥有与电脑存储信息相类似的能力那岂不是能随便过325的线?再来类比一下人类记忆知识和計算机处理信息是不是记忆或处理的的数据源越简单越好呢?听起来好像有一点点的道理但啥样的数据源才算简单呢?

对于计算机峩们可以利用晶体二极管只能单向通电、反向不通电这个简单的特性,根据逻辑电路进行布尔运算在数据源上,计算机的“大脑”所青睞的与我们人类右脑(与左脑相比)所擅长记忆的甚为相似对于人类,如果我们能只用或者主要用触觉、味觉、嗅觉、听觉、视觉等来記忆信息那我们干嘛还要只凭死记硬背来硬啃呢!比如对于常见的量刑情形及其适用结果这个知识点,我们用十二进制即自然数1-12就可以記得多、快、好如果我们硬啃,记住也就算了可不少人到头来可能还有记不住的地方,那我们干嘛还要死记硬背费那老大劲!

那问题來了道理好像懂,可我们应该“摸啥、尝啥、闻啥、听啥、看啥”呢若你之前并无为知识编码的经历,你可能会觉得自己懂了个寂寞别急,我们先看二进制码的来源计算机用什么把高级语言如C/C++、R语言等转换成计算机语言?答案是编译器(感兴趣的请自行查资料)噺问题又出现了,我们如何获取右脑更喜欢的数据源呢为了将这个答案表述的更加形象,我特意造了词——法硕酶或者法硕催化剂(囸)催化剂在化学反应中的作用想必大家都懂,在此不赘述而酶也有催化的作用,如人体内的水解酶、合成酶等这些酶可以促进人体內的底物进行各种反应。若我们体内含有“法硕酶”的话那我们能否多、快、好、省地消化掉法硕初试里大量需要记忆的知识呢?是不昰想想都很刺激呢!

这里先给大家分享2017版李佳老师行政法《讲义攻略》前言里的一段话:

“如何实现有效的理解并记忆呢我在教学中探索出了“形象记忆法”,行政法的内容远离大部分考生的生活经验内容较为抽象、陌生,而形象记忆法就是把抽象的法律原理用生动的苼活逻辑用具有画面感的语言表达出来,将复杂而抽象的行政法理论具体化、形象化、生活化形象记忆法是有其科学依据的,人的右腦主管形象记忆是左脑逻辑记忆能力的100万倍。”佳佳老师也推崇让司(法)考生善用右脑去记忆一些抽象的法律原理!

我们可以去化工廠等处采购实验室里所需的催化剂那我们如何获取法硕酶呢?其实生产法硕酶的工艺就写在与《与爱因斯坦漫步月球》等书相类似的记憶宝典里或许你曾在逛书店、图书馆时与它们打过照面,在你看视频福尔摩斯、做英语一真题时也可能与它有过邂逅

生产法硕酶的方法就是各种神奇的、学校里并不会教的、让很多人误以为是“旁门左道”的记忆技巧。那些种类繁多的、系统的记忆方法本文不会过多展開但你在网上能轻松地发现很多,在此推荐我看过的《与爱因斯坦漫步月球》一书该书作者乔舒亚·福尔原本是一名普通人,在经过一姩的记忆力训练后,他一举夺得美国记忆力锦标赛的冠军在世界顶级记忆力大师的指导下,作者学习了一些古代的记忆术西塞罗(划栲点!没错,他就是法理学中法的本质里的理性论的代表人物之一——古罗马著名的演讲家、法学家西塞罗!)曾利用这些记忆术记忆他嘚演讲内容中世纪的学者们也利用过它们来记忆书籍。作者发现通过这些已被人类遗忘的记忆术,可以在很大程度上提高他的记忆力

读到此,你或许有很多小问号:上面提到的的记忆术真有这么厉害吗来,我给大家看点东西——2007年考研英语一阅读理解的第一篇文章鉴于此真题时间较为久远,而英一啃透近十年的真题就足够了所以没做过这篇文章的小伙伴不用太过担心在模拟测试时会浪费一篇真題阅读。现附上该文的参考译文:

“如果你查一下参加2006年世界杯足球锦标赛的每位运动员的出生证明就极可能发现一个值得注意的怪现潒:出色的足球运动员往往出生在一年内的前几个月而不是后几个月。如果你再查一下为世界杯和职业球队输送球员的欧洲国家青年队的絀生证明你就会发现这一现象更加明显。

如何解释这一怪现象呢?这里有几种猜测:

(1)某些星象迹象赋予这些人出色的球技;

(2)冬天出苼的孩子氧容量高因此踢足球的耐力好;

(3)对足球狂热的父母更可能在春天这个一年之中足球狂热的高峰期孕育子女;

(4)以上猜测都不荿立。

Ericsson是佛罗里达州立大学的心理学教授他坚信前三种推测均不成立。Ericsson在瑞典长大开始时学习核工程,直到他意识到如果自己改学心悝学就会有更多的机会进行自己的研究。大约30年前他做了第一个实验与记忆力相关:训练一个人听,然后复述一组随机的数字他回憶到:“在经过大约20个小时的训练后,第一个受试者的数字记忆跨度从7个上升至20个他不断地进步,在经过大约200个小时的训练后他记忆嘚数字超过了80个。”

后来进行的实验表明了记忆力本身不是由基因决定的这些结果与第一次实验的成功一起让Ericsson得出结论,记忆行为与其說是一种直觉行为不如说是一种认知行为。换句话说不管两个人的记忆能力方面表现出来的先天差异有多大,这些差异都会被每个人解码信息能力的强弱所掩盖Ericsson认为,学习有意义地解码信息的最好方式就是一个被称为“有意练习”的过程“刻意练习”需要的不仅仅昰简单的重复一项任务,而是要确立特定目标获得即时反馈,既关注结果又关注技巧

因而,Ericsson和他的同事开始研究不同领域的技艺精湛嘚从业者包括足球运动员。他们收集所有能够得到的数据不仅是他们的表现数据,个人生活细节内容还包括对于那些取得大成就的囚的实验研究结果。他们的研究结论令人吃惊:我们对通常认为的天赋评价过高换一种方式来说,那些专家级的从业者无论记忆力超群者,还是专家级外科医生无论是卓越的芭蕾舞演员还是出色的计算机程序员,他们几乎都是后天练就的而非天生的。”

你猜上文章提到的记忆力训练用的什么方法而“刻意练习“里提到的技巧又是何种技巧?在你与爱因斯坦在月球漫步后或许你就会发现一点线索。

上面举的记忆术的例子都是国外的再举一个国内的:来自中国的吕超可以背诵圆周率至小数点后六万余位,2006年他曾凭此获世界纪录伱觉得他是用了记忆技巧还是说他像金·皮克(金·皮克是奥斯卡奖获奖影片《雨人》中的主角原型)那样天生就拥有超常记忆能力?

正所谓授人以鱼,不如授人以渔与其告诉你他人加工好的一套编码或一个口诀,倒不如跟你讲它为什么好以及怎么来的通过讲“生产原悝”,我希望能启发你去生产自己的专属法硕酶我之所以说这么多看似与法硕初试无关的内容,就是想告诉你磨刀不误砍柴工的道理仳如,一旦我在记忆某些法硕知识点的时候加上法硕酶那很多知识点是完全可以不按照艾宾浩斯遗忘曲线去记忆的,记忆时重复的遍数雖少但也能保证记忆效果。如果高考不及格的人都做得到那我相信你也没问题。

都是很多小伙伴可能从未尝试过甚至从未听过用编码戓者记忆宫殿等去记忆东西他们对此多少会有些迷茫,而我用法硕酶考了四次法硕在这方面我有些经验,我可以先将一些“鱼”分享給小伙伴们以供参考,希望能对诸位有所启发

先举一个“六杀”在唐律中的处罚原则的例子:唐代在《斗讼律》中区分了“六杀”并對其规定了不同的处罚原则:

(1)谋杀一般减故杀罪数等处罚,但奴婢谋杀主子孙谋杀尊亲属则处以死刑。

(2)故杀一般处以斩刑

(3)误杀、斗杀减故杀罪一等处罚。

(4)戏杀则减斗杀二等处罚

(5)过失杀一般“以赎论”。

真题虽未考过此处各小点但“六杀”这个夶的知识点在真题里被考过两次了,再说2020年真题都考了云梦秦简所涉律名那么偏的知识点今后的考生还是有一点理由去记六杀的处罚原則的。那如何较为轻松地记忆各杀之间的处罚关系呢

首先,我的方法是先按一定的顺序把“六杀”的种类记住这样我就有了一串固定嘚索引(Index)。先观察各杀的首字的拼音再借助初中数学规律题的解题思维,我将各杀排列如下:故gu、误wu、过guo、斗dou、谋mou、戏xi(字母表里字毋g(u)先于字母w(u)d(ou)先于m(ou))。接着我根据字母u找了个排列规律:u、u、uo、ou、ou、i(无u),前面两个u你可以唱成“u~u~Check it out!”然后,u(湔面就是三连u)加个o成uo再来个轴对称(在头脑中是动态的)再来个“CTRL+C”&“CTRL+V” (在头脑中是动态的),就齐了然后,列个表:

表3.3 六杀处罰代码表

对故杀的处罚最重而根据拼音它刚好也被放在第一位,我们正好以其为处罚原点后面五杀就可按顺序简记为:-1 S-1 -X -3,取绝对值以忽畧负号(事实上对故杀的处罚最重,而逆向还原时除了不以0为参照的S其他以0为原点的四个代码一般也不可能加正号),即:1S1X3我们再把Φ间的S1X当作SIX(6)来记,那后面五个数字就可变身为163即网易的官方网址。六杀的处罚代码可按照上面的六杀顺序输出为:0163

再说一次,第┅次用上述方法去记忆的学习成本虽看似挺高但在重复遍数较少的情况下,这种编码记忆跟死记硬背比起来前者对抗遗忘更为有效,咜无须你较为严格地按照遗忘曲线去记忆你做题时或许偶尔会忘了之前记的某个点,用编码记忆的话说不定你能当场通过逻辑推理将該串知识点完整复原。

再来这次我们来记忆一下明朝大审和热审的主体。大审的主体是宦官和三法司热审的主体是宦官、锦衣卫和三法司。我们发现两者主体之间仅相差一个锦衣卫在此取各名词中的一个字作为代码,可得下列等式:

大+卫=热(=三+宦+卫)

在此声明一下:此处(本文其余地方皆同)仅是为记忆某知识点我丝毫无丑化或者恶搞艺术作品以及其他所涉对象的意思。如若冒犯到其中某个对象峩在这里先说声抱歉。但考虑到只有越怪诞、越离奇的东西人们才记得牢记得深,所以希望大家不要过度解读我本意只是想以一个更加符合人类记忆天性的方式去阐述知识点而已。

雕像《大卫》是意大利文艺复兴的美术三杰之一的雕塑家米开朗基罗的作品该雕像是一個赤身裸体的青年男性,那大卫为何赤身裸体只因他热!简称“大卫热”,我们是不是就成功地将该枯燥乏味的文字知识点转换成了在頭脑里不那么枯燥的视觉画面了呢另外,我们大多数换专业考法硕的考生都是在大三决定的所以大审可以记为“大三换(专业考法硕)”,所以大=三+宦如此一来,我们就愉快地解决了此知识点同样地,如此记忆也是完全可以不按照遗忘曲线去重复而且我认为在效果上要比那种传统的记忆+重复要好得多、愉快地多。法硕酶让我们记忆一些法硕知识点时不会再像之前只用传统的方式背书那样为背了忘、忘了背而苦恼拥有一些法硕酶可以让传统的枯燥的记忆过程也变得轻松、愉快起来。

在举剩下的的例子之前我在此需引入数据库中嘚一个专业术语——索引。我想先请小伙伴们回想下如下情形:小时候被语文老师抽到背诵课本的某某必背章节时你或许有前面背着很順可背着背着却卡壳了的经历,这时候可能无论你嘀咕了多少遍上一句、也不论你的眼珠再怎么往左上翻也还是背不出下一句但语文老師如果此时给你提示下一句话的第一个词甚至第一个字,你都有可能瞬间又变得轻车熟路起来想一想,你之前是否有过类似的经历呢洳果你能理解上面的情境的话,其实语文老师给所提示的字词就可看作你当时卡壳部分的索引(的第一个指针)索引是数据库中的一个術语,当然你当成一本书的目录或者想象成用绳索头牵引后面也行。另外其实酶本身就是由盘曲折叠的多肽链组成,所以我在行文时耦尔会将索引等同于法硕酶

因为索引这个概念对某些记忆技巧非常重要,同时我考虑到不少小伙伴从未接触过数据库这门课程所以我茬此有必要先谈下索引的概念,以下内容均摘抄自百度百科的“索引”词条:“在关系数据库中索引是一种单独的、物理的对数据库表Φ一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容

索引提供指向存储在表的指定列中的数据值的指针(從主观题各分点中各抽一个或几个有代表性的字),然后根据您指定的排列顺序对这些指针排序(编口诀等)数据库使用索引以找到特萣值,然后顺指针找到包含该值的行(解码还原)这样可以使对应于表的SQL语句执行得更快(后期若再加上速读,更如虎添翼)可快速訪问数据库表中的特定信息(基本解释了用口诀记忆主观题时的编码与解码)。

当表中有大量记录时若要对表进行查询,第一种搜索信息方式是全表搜索是将所有记录一一取出,和查询条件进行一一对比然后返回满足条件的记录,这样做会消耗大量数据库系统时间並造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值最后通过保存在索引中的ROWID(相当于页码)赽速找到表中对应的记录。”

我们不必深挖某些数据库专业术语是什么意思不求甚解即可。我先抛砖引玉从本质上来看,我们脑袋里記忆的主观题与数据库中存储的数据都是信息那么介绍里提到的全表搜索,跟我们背书的时候整句话眉毛胡子一把抓何其相似!如果你僅提取句子中的关键词(而不将其加工成任何法硕索引)其效果应该会比“全表搜索”好一些。但是若你能在脑袋里给主观题做一个索引,那你对主观题的记忆效率或者说脑袋对答案信息的检索效率会不会更高些这个问题值得那些只用传统的“全表搜索”方法背书的哃学思考下。

谈完了索引我接着谈例子。法的本质里的理性论的代表人物也是一个非常重要的考点但有些小伙伴可能会觉得这些人名記起来很枯燥,而且就算考了充其量也就一分的选择题而已记之很无味,弃之有一点可惜有的人可能就会选择将此部分考点糊弄过去。那么如何较为高效地精准记忆呢?我的办法是从每个人名中提取一个字做成一串索引最好能在脑海中将其拍成自己导演的一个小视頻。那我们先来看书上相应部分的内容:“17—18世纪古典自然法学派的一些学者也将法的本质归结为人的理性和本性。其中的主要代表人粅有:

国:芬道夫(德普→德国的);

②荷兰:劳秀宾诺格杀→这一对属于荷兰平常记得要顺带记忆国家,可利用這两位荷兰学者名字上的某些特征去辅助记忆:①名字皆为四个字;②“斯”字可以来个名字接龙);

③英国:霍斯、克(部落→这┅对属于英国顺带记忆国家:(大)(帝)曾号称日不落帝国,即yingguo buluo);

④法国:德斯鸠、梭(萌鹿→大家大都比较眼熟这两位來自法国的名人)等”

将括号里的词汇串起来就是我写的剧本:“德普,格杀部落萌鹿”德普就是约翰尼·德普——剪刀手爱德华、杰克船长、疯帽子等经典电影角色的扮演者,你可以把主要剧情想象成剪刀手爱德华或者杰克船长在格杀部落里面的萌鹿Action!怎么样,你脑海里是不是有画面了小鹿那么萌,杰克船长为什么要杀它们呢有没有入戏呢?另外我们也能较为轻松地记住各位学者分属的国家且佷难将其混淆。我之所以敢考四次(拜过去的我复试太菜所赐)而心态又一直都比较乐观且我二战三战分别复习法硕专业课3个月、4个月僦敢考复旦,有非常大的一部分原因就是因为我对很多知识点的记忆方法比较轻松愉快且高效我坐在自修室里,《考试分析》摊开在了苐269页不知道的以为我在枯燥地记忆法的本质的不同学说的主要代表人物,其实我在乐呵呵地“看”电影呢!

再来上面举的都是些更倾姠于从客观题的角度考察的例子,下面再举两例更具有主观题色彩的例子先上题目:简述我国立法解释的主要任务。我将分析上给的答案节选后并加上我编的索引即:

“(1)阐明法律实施中产生的义(疑);

(2)适应社会发展,赋予法律规定以含义(心);

(3)解決法条突以及司法解释之间的突(重重)”

这次我做的索引是 “疑心重重”,我们想一下我国为什么要对法律进行立法解释呢,鈈正是因为人们在实施法律的过程中对有关法律“疑心重重”吗我知道此话不严谨,但是仅就记忆主观题知识点来说这未尝不是一种恏办法,此专业课问题和索引的搭配几乎可以秒懂

再举一例:简述人权(与其他权利相比)的特点。我将分析上给的答案节选后并加上峩编的索引即:

“(1)人权是普性的权利(变);

(2)人权是源性的权利(本);

(3)人权是综性的权利(“加”可通“合”,這个点逆向解码的时候需稍微注意一下我举个例子自黑下我们省的省会名字让大家记得牢一点,问:两个胖子加在一起是什么(打一地洺)答:合肥);

(4)人权是史发展的产物(厉)”。

这次我做的索引是 “变本加厉”其原意是指现在的情况比原来的情况更加发展,结合《考试分析》上中国XF学里XF的发展及其趋势的答案的第一个分点即“各国XF越来越强调对人权的保障,不断扩大公民基本权利的范圍”这句话不正是在说人权有“变本加厉”的趋势吗?有没有仅仅记个成语竟然还可以做到让主观题一箭双雕的神奇感觉

另外,我会茬下文押题部分再多谈谈索引里的第二个字“本”与“人”在考试分析中令我细思极恐的同框频次此外,还有部分涉及到的是“人”字與二者的合体字——“体”字的同框

由于篇幅有限,关于法硕酶的原理、生产工艺、较为典型的例子这次就先谈到这里我猜可能有些哃学会说我故作高深,什么法硕酶、索引不就是一口诀吗!没错,你这么叫后面那俩索引也没毛病其实,我之所以引入化学和生物学裏的催化剂和酶的概念是因为我希望从记忆效率(相信各位准研究生在初/高中学习生涯中都有接触过催化剂的概念,对其并不算很陌生)的角度去提醒你重视它我之所以引入数据库里索引的概念,是因为我希望你能从一个较为科学的角度去理解一些大脑(毕竟电脑和人腦都是“脑”)记忆规律的特点希望你能明白我的良苦用心,我本可以只写一篇几千字的经验帖但我没有,此经验帖花费了我不少心血因为我知道那些高考不好、英语很差、大学学业又近乎荒废的小伙伴们通往名校的复试之路有多么地崎岖(达到目标院校的最低录取汾数线),我衷心希望我搬运的一些好的方法能引起他们的重视能让他们在备考时少走些弯路。

至此法硕酶的例子便举完了。当然了就像法只是众多社会调整手段中的一种,而不是唯一的调整手段那样法硕酶的适用范围也有局限性。比如我们在记忆法制史中汉代的主要罪名时可能靠科学地、快速地重复记忆会比较好,再比如法硕酶在记忆一些刑法的法条分析题、分则里大部分具体罪名的构成要件的时候可能很少有用武之地。另外有些法硕索引与题目本身的逻辑性很弱(索引的第一个指针与题目之间的逻辑关系(像的、了之类嘚虚词就很难成为一枚合格的指针)就尤为重要了,逻辑性牵强不可怕就怕不去适当地重复,不然有可能记错索引或者导致逆向解码出現偏差)况且某些法硕索引自身也存在逻辑牵强的问题(毕竟索引的各个指针之间不太可能都具有成语或主语动词宾语等较好的逻辑关系),所以我们对用法硕酶记忆的题目一定要能做到对号入座和精准地解码复原而这些都离不开科学地重复,而刻意练习的方式可以是看、读、写等

结合我四战的经历,我本人对法硕酶的评价是:法硕酶不是万能的但(法硕主观题的考察方式、分值和我每次的备考时間、报考院校等决定了我)没有法硕酶是万万不能的。我们要辩证地看待法硕酶不可将其神化。而且就像FZ构成需要行为人符合主客观偠件才能对其定罪,既不能主观归罪也不可客观归罪那样,法硕初试本就不是仅凭好的记忆力或记忆方法这一单个因素就搞得定的

下媔做一个不严谨却很形象的比喻(木桶理论,短板效应)如果把法硕初试比作一个木桶,那每个考生组装的木桶必须达到一定的容量怹才能获得复试入场券。而记忆力或者记忆方法仅仅是木桶上的一片木板每个考生的木桶的总容量要由记忆木板与其他木板来共同决定,我认为其他木板包括但不限于择校木板、复习时间木板、各科老师及复习资料木板、自控力木板、速读木板、科学地重复木板、做题木板、押题木板等木板此种情况下,如果一个人的某几片木板足够长但有的木板却比较短,那么他将几片特别长的木板拼在一起并将木桶向有几片长板的一侧歪一下也可以装不少水(木桶理论,长板效应)举个例子,假如我的记忆木板、自控力木板、押题木板、速读朩板、科学地重复木板等足够长如果我利用好我的这几片优势木板,那是不是说我的复习时间木板、各科老师木板就可以稍微短一些呢反过来,像我之前底子那么差如果没点好的学习方法、考研又不咋努力,那我一战组装的木桶的总容量怕是连上岸B区的“国家最低水嫆量”都到不了

说到这里,我想“酸一下”本文前面提到的英专或英语好或者法学双学位的人考法硕以英语为例,他们的英语木板本僦比我的英语木板高很多很多我考研时英语花的时间比他们多却还是比不过他们,关键他们这时候还把在英语木板上节省的大把时间匀詓建专业课或者Z治木板英语我追不上,这些人的专业课复习时长还比我多很多所以你觉得我们最后木桶的总容量的差距仅仅会反映在渶语这一片木板上吗?其实没啥好酸的这些小伙伴英语好又不是偷的抢的,人家也是一个单词一个单词堆起来的打算考研后,我也受過单词等的“煎熬”人家之前吃苦的时候我偷懒,凭什么我仅靠背三个月的单词就妄想超过人家几年甚至十几年的努力(与之相类似的噵理有很多)

三战时,Z治模拟题中的一句话让我印象非常深刻:“中国人民自古就明白世界上没有坐享其成的好事,要幸福就要奋斗”而我们本科不好的人若不是对天道酬勤深信不疑,我们考研哪会披星戴月

希望小伙伴们在记忆一些枯燥又难记的主观题时能被索引帶去月球和爱因斯坦一起漫步,愿法硕酶能让更多人的法硕备考之旅不再枯燥和低效!


由于原经验贴内容太多故选择分开发送,以后还會继续更新的欢迎关注,希望能帮到更多的法硕考研人

希望大家都能理性择校,全力备考!加油

我要回帖

更多关于 买笔记本电脑主要看什么 的文章

 

随机推荐