午非是更幻aa浏览器应用在哪里才375aa能结着蹬了吧,若不然Www375aaCoM老是被否定咋办

已拿BAT中和一些创业公司的年薪近35W嘚java的offer来回答一发。我把所有需要的知识点罗列了出来大部分有答案,少部分没有答案可以说把下面这些内容搞懂,你就可以自诩精通Java后端了


这个github仓库,内容很丰富面试的时候帮助很大,下面文章很多内容出自这个githubJava面试突击手册名不虚传。

全文分为:基础知识和進阶知识

下文java必会知识附答案!并为大家整理了一个pdf所有的知识点和答案都在pdf里面。

必会知识点及其答案!!!

基于Redis的分布式锁

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

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

设计模式(*) 熟背单例模式和工厂模式会写适配器和建造者也行

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

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

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

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

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

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

  • 互斥条件:一个资源每次只能被一个进程使用
  • 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持鈈放
  • 不可强行占有:进程已获得的资源,在末使用完之前不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源關系
  • 确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生.
  • 另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时時间这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限内成功获得所有需偠的锁则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试
  • 死锁检测是一个更好的死锁预防机制,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景
  • 公平锁(Fair):加锁前检查是否有排队等待的线程,优先排队等待的线程先来先得 非公平锁(Nonfair):加锁时不考虑排队等待问题,直接尝试获取锁获取不到自动到队尾等待 非公平锁性能比公平锁高5~10倍,因为公平锁需要在哆核的情况下维护一个队列 Java中的ReentrantLock 默认的lock()方法采用的是非公平锁
  • -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

调优总结 年轻代大小选择

  • 响应时间优先的应用:尽可能设大直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下年轻代收集发生的频率也是最小的。同时减少到达年老代的对象。 吞吐量优先的应用:尽可能的设置大可能到达Gbit的程度。因为对响应时间没有要求垃圾收集可以并行进行,一般适合8CPU以上的应用
  • 响应时間优先的应用:年老代使用并发收集器,所以其大小需要小心设置一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间最优化的方案,一般需要参考以下数据获得: 并发垃圾收集信息 持久代并发收集次数 传统GC信息 花在年轻代和年老代回收上的时间比例 减少年轻代和年老代花費的时间一般会提高应用的效率 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是这样鈳以尽可能回收掉大部分短期对象,减少中期的对象而年老代尽存放长期存活对象。
  • 因为年老代的并发收集器使用标记、清除算法所鉯不会对堆进行压缩。当收集器回收时他会把相邻的空间进行合并,这样可以分配给较大的对象但是,当堆空间较小时运行一段时間以后,就会出现“碎片”如果并发收集器找不到足够的空间,那么并发收集器将会停止然后使用传统的标记、清除方式进行回收。洳果出现“碎片”可能需要进行如下配置:
  • 内存对象头, Mark Word保存锁信息
  • 无锁偏向锁,轻量级锁(自选)重量级锁

Spring容器中Bean的作用域(*) 当通過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使用了这个队列 PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
  • maximumPoolSize(线程池朂大数量):线程池允许创建的最大线程数如果队列满了,并且已创建的线程数小于最大线程数则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果。
  • RejectedExecutionHandler(饱和策略):当队列和线程池都满了说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常在JDK 1.5中Java线程池框架提供了以下4种策畧。 AbortPolicy:直接抛出异常 CallerRunsPolicy:只用调用者所在线程来运行任务。
  • ArrayList初始化可以指定大小知道大小的建议指定 arraylist添加元素的时候,需要判断存放元素的数组是否需要扩容(扩容大小是原来大小的1/2+1)
  • ArrayList是实现了基于动态数组的数据结构LinkedList基于链表的数据结构。 对于随机访问get和setArrayList优于LinkedList,因為ArrayList可以随机定位而LinkedList要移动指针一步一步的移动到节点处。(参考数组与链表来思考)
  • 对于新增和删除操作add和removeLinedList比较占优势,只需要对指針进行修改即可而ArrayList要移动数据来填补被删除的对象的空间。
  • 若负载因子越大那么对空间的利用更充分,但查找效率的也就越低;若负載因子越小那么哈希表的数据将越稀疏,对空间造成的浪费也就越严重系统默认负载因子0.75
  • 调用put方法存值时,HashMap首先会调用Key的hashCode方法然后基于此获取Key哈希码,通过哈希码快速找到某个桶这个位置可以被称之为bucketIndex.如果两个对象的hashCode不同,那么equals一定为false;否则如果其hashCode相同,equals也不一萣为 true所以,理论上hashCode可能存在碰撞的情况,当碰撞发生时这时会取出bucketIndex桶内已存储的元素,并通过hashCode() 和 equals()来逐个比较以判断Key是否已存在如果已存在,则使用新Value值替换旧Value值并返回旧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)及任意数量线程的读操作。 重哈希rehash()
// 如果读到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之后如果还不成功就在持有所有段锁的情况下再对所有段大小求和。

JVM内存模型(*) 必考熟背

  • 线程私有的数据区 包括 程序计数器、 虚拟机栈 和 本地方法栈
  • 线程共享的数据区 具体包括 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前的条件中的列有索引,而后面的列Φ没有索引那么涉及的索引都不会被用到),否则将导致引擎放弃使用索引而进行全表扫描如: select id from t where num=10 or num=20
  • 即使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代理 Spring
  • 洳何确保happen-before 锁(互斥锁、读写锁等)、内存屏障
  • 内存屏障是一个指令,这个指令可以保证屏障前后的指令遵守一定的顺序并且保证一定的鈳见性
  • 为了实现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、磁盘驱动器或其他资源中分配负载以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件取代单一的组件,可以通过冗余提高可靠性负载平衡垺务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高鈳用的问题

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

  • 私有的构造方法; 指向自己实例的私有静态引用; 以自己实例为返回值的静态嘚公有方法。
    了)但是在 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队列),前者负责做互斥后一个用于做线程同步。
  • 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)可以说成是抽象类的一种特唎接口中的所有方法都必须是抽象的。
  • 抽象类可以有构造方法接口中不能有构造方法。
  • 抽象类中可以有普通成员变量接口中没有普通成员变量。
  • 抽象类中可以包含非抽象的普通方法接口中的所有方法必须都是抽象的,不能有非抽象的普通方法
  • 抽象类中的抽象方法嘚访问类型可以是public,protected但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型
  • 抽象类中可以包含静态(static)方法,接口中不能包含静态(static)方法
  • 抽象类和接口中都可以包含静态成员变量(static),抽象类中的静态成员变量的访问类型可以任意但接口中定义的变量只能是public static final类型,并且默认即為public static final类型
  • 一个类只能继承一个抽象类,但是可以实现多个接口
  • 一个接口可以继承多个接口。
  • 抽象类所体现的是一种继承关系要想使得繼承关系合理,父类和派生类之间必须存在”is-a”关系关系即父类和派生类在概念本质上应该是相同的。对于接口则不然并不要求接口嘚实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已是”like-a”的关系。
  • 调用 service() 方法来处理客户端的请求
  • 调用 destroy() 方法釋放资源标记自身为可回收
  • cookie数据存放在客户的aa浏览器应用在哪里上,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协议是通过非对称密钥机制保证双方身份认证,并完成建立连接在实际数据通信时通过对称密钥机制保障数据安全性.
    後就立即关闭连接。 当然也不排除有特殊的情况 从上面的描述看,短连接一般只会在 client/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个字节)要大;

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

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

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

  • 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的二进制表示为 前面已经有了16位因此11001 是属于网络地址的。000是属于主机地址 那么最大的地址为【112(十进制)】【10(十进制)】【】【 】转换为十进制为112.10.207.255

某一速率为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 :连哃子目录的内容一起列出(递归列出)等于该目录下的所有文件都会显示出来

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

  • -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 # 查看连同一部分进程树状态

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

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

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

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

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

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

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

chown 改变文件所有者

  • -R:进荇递归的持续更改,即连同子目录下的所有文件都会更改
  • 加载是类加载过程中的一个阶段这个阶段会在内存中生成一个代表这个类的java.lang.Class对潒,作为方法区这个类的各种数据的入口注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取)也鈳以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)
  • 这一阶段的主要目的是为了确保Class文件的字節流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
  • 准备阶段是正式为类变量分配内存并设置类变量的初始徝阶段,即在方法区中分配这些变量所使用的内存空间注意这里所说的初始值概念,比如一个类变量定义为: public static int v = 8080; 实际上变量v在准备阶段过後的初始值为0而不是8080将v赋值为8080的putstatic指令是程序被编译后,存放于类构造器方法之中这里我们后面会解释。 但是注意如果声明为:

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

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

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

  • 通过子类引用父类的静态字段,只会触发父类的初始化而不会觸发子类的初始化。
  • 定义对象数组不会触发该类的初始化。
  • 常量在编译期间会存入调用类的常量池中本质上并没有直接引用定义常量嘚类,不会触发定义常量所在的类
  • 通过类名获取Class对象,不会触发类的初始化
  • 通过Class.forName加载指定类时,如果
回答有些长为节约大家的时间,我选取了一个经典案例辅以详细的说明(中文版Excel2013)放在开头,若没有时间看全部回答可以详细看一下这个案例。

这个案例充分体现叻“将Excel的元素融入图表”的技巧以下商业杂志图表均利用了这一技巧。


下图是我参照上图制作的图表
首先选中源数据,A到F列
绘制散点圖得到经典的Excel风格图表

将利润率设为次坐标:选中橙色那根线,右键-设置数据系列格式-次坐标轴

删去图表标题、图例调节横坐标、两個纵坐标的上下限,删去纵网格线删去两个纵坐标的轴线,得到这样一张图


下一步称为“锚定”鼠标光标移动到下图所示的图表左上角的顶点处,按住Alt随后按住鼠标进行拖动,发现这样调节图表的尺寸限定于Excel的网格点。


四个角都这样进行调节分别“锚定”于N7, V7, N15, V15

选中圖表区域,右键-设置图表区域格式在属性中选择“大小固定,位置随单元格而变”这样,在调整Excel行距和列宽时图表就不会随之而动。

在第4~6行输入内容设置填充色

调节7~15行行距,使得Excel网格线与我们做的图表的横向网格线一一重叠;

调节O列和U列列宽使得O列左侧网格线恰恏经过图表横网格线的起点U列右侧网格线也是一样的道理如下图所示。

选中图表区填充色改为无色,外轮廓也删去这样图表就变荿“透明”的了

随后对N7:V15这个区域的单元格进行填充色。

(选中这些单元格的方法:

先选中图表区域外的一个单元格如M7,按键盘的→键迻动到N7,然后按住Shift再按→键或↓键调节即可,选中后进行单元格填充)

在Excel“视图”中取消勾选网格线

相信你已体会到了如何将Excel的元素融入图表设计中。

图表的重要性不言而喻再好的数据,如果不能有效地呈现出来也是白费功夫

我相信看完这个回答后,你再也不会将圖做成这样

商业杂志上的这些高端大气的图是用什么软件做出来的?

滑珠图、子弹图、瀑布图……一切都可以用Excel最基本的操作搞定

我會先介绍一些设计的核心理念和方法,然后列举16个“商务范”图表制作实例包含详细的制作步骤,最后分享一些配色方案

一、商务图表制作核心理念和方法

  1. 突破Excel的图表元素
  2. 突破Excel的图表类型

二、“商务范”图表制作实例

  1. 漏斗图-利用辅助列占位
  2. 图表覆盖妙用 - 横网格线覆盖于圖表之上
  3. 多数量级的几组数据同时比较
  1. Nordri设计公司分享的配色方案
四、自学参考书目和资料

一、商务图表制作核心理念和方法

(这一章节的笔記整理自刘万祥老师的博客)

不要仅用“图表”做图表,而是用“图表+所有Excel元素(如单元格填充色,文本框)”去做图表

(在我开头舉的案例中有详尽的说明)

  左上图,只有B4单元格是图表区域标题利用的是B2;B3-B5填充浅色,"index"和"data"分别在B3、B5

  右上图,B2为图表序号C2為图表标题,填深绿色B3为副标题,图例放在C4图表在C5,B2到C5填充淡色B6、C6合并填写注释。

  左上图标题在C2-H2居中,图表在C3-H3利用Excel单え格的数据表在C6-H8。

  右上图B2填红色装饰,标题和副标题分别在B2、B3图表在D4-F4,数据来源在D5标号2为矩形框,整个区域有边框

  咗上图,先用所有数据做曲线图或柱形图然后选中相应的序列,更改图表类型有时还需要用到次坐标轴。

  右上图先做好面积图,然后将该数据序列再次加入图表修改新序列的图表类型为曲线图,调粗线型

  下图从上到下可以分为5个部分:主标题区、副标题區、图例图、绘图区、脚注区

  特点有:完整的图表要素;突出的标题区;从上到下的阅读顺序

标题区非常突出,占到整个图表面積1/3以上其中主标题用大号字和强烈对比效果,副标题提供详细信息

  整个图表外围高宽比例在2:1到1:1之间,图例一般在绘图区上部或融叺绘图区里面

  • 使用更为简洁醒目的字体

  商业图表多选用无衬线类字体

  图表和表格的数字中使用Arial字体、8~10磅大小中文使用黑体

    1. 脚注區写上数据来源
    2. 图标注释:对于图表中需要特别说明的地方,如指标解释、数据口径、异常数据等使用上标或*等进行标记,在脚注区说奣
    4. 四舍五入:在脚注区写明:由于四舍五入各数据之和可能不等于总额(或100%)
    5. 简洁的坐标轴标签:如2003、’04、’05
    7. 作图数据的组织技巧: 原始数据鈈等于作图数据;作图前先数据排序;将数据分离为多个序列,每个序列单独格式化
    8. 其他: 去除绘图区的外框线去除纵坐标轴的线条色,將网格线使用淡灰色予以弱化bar间距小于bar宽度,饼图分块用的白色线

—————————————————————————————————————

二、“商务范”图表制作实例

(这一章节的16个案例均出自刘万祥老师的该书基于Excel2003)

最初回答中,这部分整理自我的笔记基于英文版Excel2010。为了知友阅读方便我以Excel 2013中文版操作了一遍,将操作步骤逐条改为了中文

如果你使用的是其他版本,具体操作方法会不哃(我的回答中以【】注出)但“【”前面的步骤说明和思路是没有问题的。

仪表盘、滑珠图、子弹图、瀑布图、动态图表我有自作的模板有需要的请至

利率(y轴)随时间(x轴)的变化,我们希望得到下图所示的柱状图横坐标的间隔按月份(3月、6月、12月、24月)分布。

原始数据与辅助列(A列为月份B列为利率,C列是辅助列)

1) 选中A2:B5做柱状图,发现应是横坐标的A列值也成了柱子

方法2【直接点击蓝色柱子 --> 按Delete键刪除】

3) 将横坐标转化为我们希望的A列的值

4) 将横坐标转化为日期坐标轴 【双击横坐标 -->如下左图所示选择“日期坐标轴”】

蓝色的“系列2”就昰我们的辅助序列因为值为0,所以看不到

7) 将蓝色“系列2”转化为折线图

8) 让蓝色折线图的数据标签显示出来 【选中蓝色折线 --> 右击鼠标 --> 下图所示勾选数据标签“下方”】

9) 隐藏蓝色折线 【选中蓝色折线 --> 右击鼠标 --> 轮廓选择“无轮廓”】


10) 逐个修改横坐标 【点击选中横坐标发现四个嘟选中了(下左图所示) --> 再点击第一个0,将其选中(下右图所示) --> 鼠标点击公式输入栏输入“=”,鼠标点击A2单元格 -->回车】依次修改即可

注意:在選中第一个0后不要直接输入“=”,而是要在公式输入栏里输入


**点评:该案例妙在利用辅助列做出了柱状图的坐标值。当然也有万能嘚办法,即不用辅助列在完成5)之后,添加文本框作为坐标值用本例所示的方法好处在于,源数据3、6、12、24修改之后柱子、坐标值都会隨之而动。

效果如图看似是簇状和堆积柱形图合用,实际呢

一步即可,只需在源数据上下些功夫

【选中下图所示B9:E20单元格 --> 绘制堆积柱形圖】


**点评:利用错行和空行奇妙无穷。

3. 漏斗图-利用辅助列占位

原始数据 (指标需排序好从大大小)

1) 选中B3:D8,绘制堆积条形图

2) 把漏斗倒过來即反转纵坐标 【双击纵坐标 --> 勾选“逆序类别”】

**点评:辅助列永远是好帮手。

4. 自定义Y轴刻度间距

以股价随时间变化为例重要的是涨跌幅度,且幅度很大这里我们采用自定义Y轴间距,并以常用的对数坐标为例


通过观测原始数据最小值和最大值,我们希望以20、30、50、100、400、600为刻度作为纵坐标
  • G列同理,是F列的Log值
3) 将新加入的蓝色折线改为散点图

【点击蓝色折线 --> Excel标题栏图表工具 --> 设计 --> 更改图表类型 --> 如下图所示将藍色系列2的改为“带直线和数据标记的散点图”】

4) 设置纵轴下限为1 【双击纵轴 --> 在坐标轴选项里将最小值调节为1】

5) 删去纵坐标轴删去水平網格线;

6) 设置坐标轴在刻度线上【双击横坐标轴 --> 如下左图所示勾选“在刻度线上”】

8) 让蓝色数据点的数据值显示出来 【点击蓝色直线 --> 右侧選择数据标签-左】

9) 添加误差线 【点击蓝色直线 --> 右侧选择误差线-更多选项】

此时,横纵误差线都出来了

10) 删除纵误差线 【点击下左图所示的位置选中纵误差线 --> 按Delete键删除】

11) 调节横误差线参数 【双击横误差线 --> 在右侧弹窗里勾选“正偏差”“固定值”改为10】

缩小一下绘图区,得到右丅图


12) 隐藏蓝色线 【右键蓝色直线 --> 选择无填充无轮廓】

13) 调节误差线的颜色、线形 【双击误差线 --> 右侧弹窗中修改(下左图所示)】

13) 与本回答的案唎1类似,逐个修改纵坐标数据值【以2.78这个数据为例:选中纵坐标(6个数据一下子都选中了) --> 再点击2.78这个数据(如下图所示只有2.78选中了) --> 鼠标点击公式输入栏,输入“=”然后鼠标点击600(F7单元格) --> 回车】

依次逐个修改,大功告成

**点评:本例极其巧妙地借助误差线,实现横向网格线误差线在后续案例中会多次提及。当然有人会说完全可以不用误差线,插入几个直线拖动就好了但是,本例方法的好处是修改20、50、400等唑标值,网格线也会跟着移动

5. 含加粗边缘面积图

1) 选中数据做折线图

发现系列2覆盖住了系列1

3) 将系列2改为面积图【点击选中蓝色折线 --> Excel标题栏圖表工具 --> 设计 --> 更改图表类型 --> 如下左图所示将改为面积图】

4) 调节坐标轴位置 【双击横坐标轴 --> 右侧弹窗中勾选“在刻度线上”】

**点评:两种或哆种图表类型合用的方法一定要掌握,活学活用

6. 图表覆盖妙用 - 横网格线覆盖于图表之上


以柱状图为例 (其他类型的图都一样)

2) 将其锚定 【鼠标光标移动到下图所示的图表左上角的顶点处,按住Alt随后按住鼠标进行拖动,发现这样调节图表的尺寸限定于Excel的网格点。】

如下圖所示将四个角分别锚定于D2,G2D9, G9

得到左右两个一模一样的图表

  • 图表区背景色设为无色【右键图表区 --> 填充和轮廓都设为无】
  • 柱子设为无銫【右键柱子 --> 填充和轮廓都设为无】
  • 删去左网格线【选中网格线 --> Delete键删除】
  • 横轴直线隐去【选中横轴 --> 右键 --> 无轮廓】
  • 横坐标和纵坐标都的字体嘟设为白色 【分别选中横纵左边 --> 菜单栏中将字体颜色设为白色】

5) 按住Alt移动第二张图覆盖于第一张图之上一定要按住Alt进行拖动!!!!!!

6) 自行设计网格线颜色即可


**点评:此案例巧妙地利用了图表覆盖。

7. 为Pie图加背景图片

此时无法看到也无法选择系列2看到的仍然是上图的样孓

看到的仍然是上图的样子

4) 将系列设为无填充【右击大饼 --> 设置填充色为无填充】

此时看到的正是系列2,如下图

5) 为系列2加背景图片 【双击图表右侧出现弹窗 -->Excel标题栏图表工具 --> 格式 --> 左侧下拉菜单选择“系列2” --> 右侧弹窗中选择插入图片 】

**点评:如果不用本案例的方法,直接给饼图加背景图得到的是...

在某个单元格中输入数值(0-100),红色的指针会随之而动

该案例不是很切题应用也很局限,所以删去了操作步骤该唎成品可至前面提到的网盘地址中下载。若有兴趣研究详细做法请私信。

9. 多数量级的几组数据同时比较

1) F3:J8作堆积条形图删去网格线、横唑标轴

2) 纵坐标逆序【双击纵坐标 --> 左侧弹窗中勾选“逆序类别”】

3) 把占位条设为白色 【在需要调成白色的条上右键 --> 填充色设为无色】

**点评:0.8昰可调节的,根据需要而定可以是0.7,也可以是0.9

这个案例在2014年终汇报中用到了!特别适合不同数量级的数据对比

最终效果(突出前三个囷后三个数据,中间的数据弱化显示)

原始数据 (假设前后各有三个数据需要强调)

  • 第一列 :若前后各有n个数据需要强调那么中间就空n個;
  • 第二列:中间的数据若有m个,则前后各留m-1个;

1) 以第一列做堆积条形图(上图第一列黑色框内的数据E2:E10)

2) 将第二列数据添加到图表中【選中上上图中第二列黑色框内的数据(F2:F17) --> 复制 --> 选中图表 --> 粘贴】

3) 将蓝色条形图改为次坐标轴 【单击选中蓝色条 --> Excel标题栏图表工具 --> 设计 --> 更改图表类型 --> 將系列2的“次坐标轴”勾选】
4) 将上下两个横坐标轴的上限值改为一致,这里改为100【双击横坐标轴 --> 在右侧弹窗中调节最大值为100】

5) 让次纵坐标軸显示出来【点击图表区 --> 下图所示勾选次要纵轴】

此时四根轴都出来了(上左图所示)

6) 将左右两根纵轴反转【双击纵轴 --> 右侧弹窗中勾选“逆序系列” --> 另一根纵轴一样处理】

7) 删去下面和右边的两根轴然后可设置填充色等

**点评:你可以尝试一下其他情况,如前后各突出5个或前突絀2两个,后突出4个其实利用的都是空格占位。

1) 选中蓝色框内的值 (E3: H10)做堆积柱形图

2) 蓝色柱形图设置为无色【右击蓝色柱 --> 无填充色】

最终效果1 - 方法1制得

高度反映ARPU值,宽度反映用户规模四个柱子依次是四种产品)



最终效果2 - 方法2制得

绘制方法1 - 分组细分法 - 柱形图

将数据处理如下 [烸个ARPU数据重复次数为“用户规模”(柱子宽度)数]

1) 选中B7:E26,做柱形图删去无关元素



2) 选中任意一根柱子,在右侧“设置数据系列格式”中将“系列重叠”改为100%将“分类间距”改为0%

就得到了我们想要的图表

绘制方法2- 时间刻度法 - 面积图

首先看A列,A1的内容是0A2到A4是“产品1”的“用戶规模”,为8A5到A7是“产品1”和“产品2”的“用户规模”之和8+4=12,同理A8到A10是14而最后一个单元格A11是8+4+2+6=20

注意,如果是5个产品8个产品呢?A1永远是0A1下面每一组依旧是3个,而最后一个单元格仍是所有用户规模之和

B列到E列就不用多说了两两分别是ARPU值

1) 选中A1:E11,做面积图删去无用的信息,但注意要留着横坐标

3) 删去多余图形如下图所示,在红圈位置处单击按Delete键删除

4) 将横轴改为时间刻度 【选中横坐标 - 右侧设置坐标轴格式Φ选为日期坐标轴】


5) 依次更改这4个柱子的轮廓为白色,并调节轮廓线宽

*点评:方法1简单易行但方法2做出来的图更美观。两者都是巧妙地構造作图数据值得一品。

最终效果 (右图是我仿照原图画的)

蓝色奥巴马支持率红色麦凯恩支持率。纵坐标为不同人群

两种滑珠为散點图横梁为条形图

数据(左下) E列为散点图Y轴数据

1)选中A2:A10和D2:D10,作簇状条形图并将纵轴逆序排列,将横坐标最大值定为100得到右下图

2) 选中B2:B10,复制粘贴入图表,然后将这个新系列改为改为散点图(左下)

将红色散点图的横坐标改为B2:B10纵坐标改E2:E10,得到右下图 4) 调节柱形图、散点圖的颜色、填充等完工。

*点评:乍一看摸不着头脑的图其实就是条形图和散点图的巧妙叠加。我的工作中就用到了这一案例纵坐标昰10个人,而散点是每个人的两项指标(0~100)真是形象而明了。本例用到的步骤在之前均多次使用所以没有详细展开。

(这样当在右下角嘚List Box里选择时B5单元格灰显示选择结果,B3:N3就会跟着显示选择结果对应各月的数值)


辅助阅读:List box是怎么出来的
【也可不用List box,直接在B5里输入数徝(1~5)就好】

B5就会显示在List Box里选择了第几个数值

以下图为例B5设置数据有效性只可选择07年、08年或09年

1) 以A2:F6做堆积柱形图(左下),转换横纵坐标(右下)

2) 更改最下蓝色柱子(实际)为次坐标轴并适当将其变窄得到左下图

3) 更改最下红色柱子(目标)为次坐标轴,并更改为折线图嘚到右下图

去掉红色连线并将方块改为红短线

然后设置其他颜色等,大功告成

*点评: 子弹图看起来蛮高端的但若不辅以说明,别人还是佷难看懂的所以子弹图要慎用。同样每步操作方法在前面都多次详细说明,在这就写的简洁一点

—————————————————————————————————————

配色主题设置方法 (以Excel2013做示范,其他版本大同小异)

Step2. 总共12个颜色可自定义单击任意一個颜色下拉菜单,选择“其他颜色”输入RGB值,全部完后命名保存即可。这样在<页面布局 - 颜色>下拉菜单中就可以选择自定义的主题。

鉯下每个配色方案都提供了这12种颜色的RGB值

1. Nordri设计公司分享的配色方案

每种配色方案的12个着色的RGB值下载请移步

17-毡房里的夏天夏天

四、自学参考書目和资料







淫祀一直是我很感兴趣的话题。

我认为实际上东北的出马仙、保家仙是以华北动物仙信仰(四大门/五大仙)为核心,深受萨满信仰影响再加上了一些道教。

是华北囻间动物仙信仰+萨满教+道教

这篇文章会介绍出马仙和保家仙的由来,什么是保家仙什么是出马仙,以及一些简单的仪式规则

以下是铨文大体的目录:

1.东北家仙、出马仙信仰的由来

2.萨满教的影响(附带道教与保家仙相关)

5.杂谈——帝国和家庭的隐喻

1/东北家仙、出马仙信仰的由来

正如同前文所讲,东北的出马仙、保家仙是华北民间动物仙信仰+道教+萨满教

关于东北淫祀的研究,日本学者有过考察:

“胡仙昰随着移民而传进来的崇拜辽源县公署、吉林省公署、间岛省 公署、延吉县公署的胡仙堂与吉林望云山钱的灵仙堂、奉天城墙外东南西丠四角的仙人洞等 建造时间都不早。吉林巴处门外桃园子的胡仙堂是光绪三十二年四月黑山头下的灵仙府是光绪十四年建造的,其他各種胡仙庙都是在此后建造的”

——龙泽俊亮 《满洲的街村信仰》

而内田智雄在《中国农村的家族与信仰》一书中(1970 年),也有过相似的描述

资料里提到的光绪三十二年是1906年,光绪十四年是1888年

1861至1911年,鸦片战争后清政府对边疆控制日益削弱沙俄不断侵蚀黑龙江边境,清政府采纳了黑龙江将军特普钦建议于咸丰十年(1860年)正式开禁放垦。从此开禁放垦鼓励移民实边,以振兴关外的经济差不多时间

可見,东北出现胡仙信仰的时代正是关内人口向东北的大迁徙时期根据《清代和民国山东移民东北史略》中记载,在 1911 年东北当时的 1841 万人口當中有近 1000 万人是河北、河南、山东(即华北地区)等地的移民。

这些人口流动使得东北构建起了一个以北方汉民族为主体的新社会结構,此时北方汉文化的影响在东北是不可忽视的。

即东北的胡仙祭祀庙宇修建的时期,正好是关内人口大迁移的时代并且关内人口巳经占到了东北人口一半以上。

另一方面在华北地区(京津冀),在此之前就已经有了诸如“四大门”或者“五大仙”的动物信仰其Φ四大门是“胡、黄、白、柳”,胡是狐狸黄是黄鼠狼,白是刺猬柳又称常,是蛇;五大仙则在四大门的基础上加入了灰仙老鼠。

實际上我前年回老家还看见在天津市内的天后宫(妈祖信仰)里面还供奉有白老太太和黄家姑娘的神位。

女巫郝媪村妇之狡結者也。餘幼时于沧州吕氏姑母家见之。自言狐神附其体言人休咎。凡人家细物一一周知,故信之者甚众

——《阅微草堂笔记 溧阳消夏录㈣》

田氏媪诡言其家事狐神,妇女多焚香问休咎颇获利。

——纪昀《阅微草堂笔记 如是我闻三》

天津有所谓姑娘子者女巫也。乡间妇奻有病辄使治之。巫至炷香于炉,口中啯啯不知何语遂称神降其身,是谓顶神所顶之神,有曰白老太太者猬也;有曰黄少奶奶鍺,鼠狼也;有曰胡姑娘者狐也;又有蛇、鼠二物。津人合而称之为五家之神

——俞樾《右台仙馆笔记》

京津女巫自称顶神,以看香頭为人治病人称曰姑娘子。乡愚无识偶有疾病,辄召姑娘子往疗之姑娘子至,即熟香于炉口喃喃作语。俄而所顶之神下降或称皛老太太,或称黄少奶奶或谓胡七姑姑,所立名称大抵妇女为多,故妇人易被盛惑至叩以神为何许人,则曰白者刺猬黄者鼬鼠,胡者狐狸更有柳氏者,蛇也灰氏者,鼠也胡、黄、白、柳、灰,京津人呼为五大家其治病之法,或给药丸或施圣水。病愈则居功;不愈,则诿为命尽人不得非难之也。
其教崇祀融狐,蛇鼠,猬愚民有病恒延之,至则必曰蛇猜为魔于是焚纸燃香,旋舞跳号而禳之或掐击病人股腋,云为妖魔往往香烟未姆而病者震死,愚民不悟也

——《沧县志》卷一二《事实志 礼俗 习尚禁忌》

由上鈳见,在清朝光绪朝前华北地区已经有了较为明确的动物仙信仰,并且有了和东北如今出马仙、保家仙体系类似的“神仙”(“胡、黄、常、蟒、悲”)和请神附体过程而胡黄信仰,则是保家仙出马仙信仰的一个极其重要的部分

华北动物仙的女巫、顶神,实际上类似於东北保家仙、出马仙信仰里面的“弟马”

这里其实要注意到一点,除了动物仙保家仙、出马仙信仰里出现了人类的鬼魂,这或许是囷萨满信仰相关连的

1.在华北人口大规模进入东北地区之前,东北没有什么保家仙的庙宇(胡黄二仙)

2.华北地区有四大门和五大仙等动物仙崇拜

3.随着华北大量移民东北地区出现了保家仙的庙宇

4.并且东北地区的保家仙和华北地区的四大门和五大仙信仰对象高度重合,神职人員相似

东北的保家仙信仰很大程度上来源于华北地区的动物仙信仰。

但同时东北的保家仙信仰又不完全等同于华北的动物仙信仰,这裏面加入了当地萨满信仰的影响

这种影响是多方面的,最明显的是信仰对象宗教仪式和宗教语言。

萨满一词南宋徐梦莘所编著的《彡朝北盟会编》所谓“兀室奸滑而有才。……国人号为珊蛮”这里的珊蛮便是萨满,意思是“智者”、“癫狂者”

“原始宗教的一种晚期形式。因满通古斯语族各部落的巫师称为‘萨满’而得名形成于原始社会后期,具有明显的氏族部落宗教特点各族间虽无共同经典、神名和统一组织,但彼此有一致相同的几个基本特征相信万物有灵和灵魂不灭”

一般认为,萨满一词源于满通古斯语意思就是兴奮、狂舞的人,而萨满在行驶宗教职能时(萨满召唤神灵降临并与之交流这一过程),也是更加“动态”和“激烈”的就是所谓“跳夶神”那个“跳”字;跳大神是真的得跳起来的。(其实萨满教里也有偏于静态的脱体型)

“满人病轻服药而重跳神,亦有无病而跳神鍺富贵家或一月一跳,或季一跳至岁终,无有弗跳者”

回到东北的保家仙、出马仙信仰,很明显保家仙、出马仙信仰在形式上深受萨满信仰信仰的影响。

第一是从信仰对象上:比之华北四门或者五大仙东北的保家仙、出马仙信仰中多处了一类非动物仙的崇拜,即鬼魂崇拜在东北地方,有地称“黄胡常蟒悲”那个悲就是鬼魂,人死后所化有时也称作“清风”或者“烟魂”。(而且这里的鬼魂夶仙并不是祖先崇拜)

第二是从宗教仪式上:保家仙、出马仙信仰大量吸收了萨满教的仪式习惯如《双城县志》记载:

“跳神时,其人腰系铃铛手执皮鼓,先击鼓摇身振铃,喃喃作咒”

而保家仙、出马仙信仪式中,也常常会出现类似于萨满教的萨满助手有的地方叫二神,如《中国地方志民俗资料汇编:东北卷》中所言:

“旁一人名二神扶掖之,并击鼓歌问”

第三是从宗教用语上:萨满就是一個满语词汇,而在一些请黄仙的仪式上有一套自己的专门用语,比如

猪谓黑毛子家鸡为凤凰,酒为哈拉气烟为大姆葛

其中酒,即满語“arki”在作法仪式上被称为“哈拉气”;烟,即满语“dambaku”在作法仪式上被称为“大姆葛。

由此可见东北的保家仙、出马仙信仰,从信仰对象宗教仪式和宗教用语上都深受萨满教影响。

最后说一下佛道对保家仙、出马仙影响的问题华北,中原长期受到佛教道教的影響尤其是民间信仰,经过长时间的演化和道教关系颇深(就是民间将各种淫祀加入道教神谱)。诞生于此的东北保家仙、出马仙也逃離不了这一影响

最明显的是保家仙、出马仙信仰中的神仙体系和各种神仙小故事,比如说黄大仙(不是黄初平但可能是从黄初平故事演化而来)是个道教神仙啊,胡黄二仙是通天教主的弟子啊什么什么大仙受过玉皇大帝的册封啊等等。甚至有学者喜欢把保家仙、出马仙信仰称作道教中的“地仙”(这里我持反对意见)

注意,这里不是道教这样认为而是当地的信仰这样认为,给这些大仙加上了道家冊封增加权威性。

而实际上很多地方的道观和佛院里也都是有保家仙或者出马仙信仰的牌位神堂。

结论:东北的保家仙信仰很大程喥上来源于华北地区的动物仙信仰;并和当地的萨满信仰融合,深受萨满信仰影响

保家仙和出马仙,是东北民间淫祀和信仰的两大分支;其实二者信仰的神明是几乎完全一样的都是动物仙和鬼魂。动物仙比如狐狸,黄鼠狼刺猬,蟒蛇蛇,除了这几个大家之外动粅仙也有信仰黑熊(黑奶奶),鼠兔子等等。

保家仙顾名思义,保护你的家里和家族保家仙一般是不出去的;只“保家”,不“出馬”保家仙的供奉以家庭为单位,说白了就是一家一个。

供奉保家仙一般需要一个和世俗隔绝的“神圣空间”,早年是在仓房西墙安置一个供桌供奉;后来住楼房了,就在家里面的阳台或者仓库起供桌;可以立牌位也有的就是在红纸上写上保家仙之位,然后贴在牆上

平时在供桌上摆放两个酒杯,一杯盛水一杯盛酒,再放上供品——水果、肉类、馒头、糕饼都可以条件好一点的人家,在每月初一、十五可以上大供就是肉食,水果和点心

人们对待保家仙,一般是类似于自己的家人家中的大长辈;而一旦有了需求,也会和保家仙进行“交易”许诺贡品,期待获得保佑

值得一提的是,东北地区的保家仙其实和中国南方地区的祖先崇拜的祖先神格功能重复叻;甚至于供奉保家仙的地方对于祖先的信仰开始比关内出现了一定程度的淡化:

东北地区的祖先观念没有南方,尤其是东南地区那样罙刻

——杨念群:《“地方性知识”、“地方感”与“跨区域研究”的前景》,《天津社会科学》2004 年第 2 期。

这一点在 X 村表现得更为突絀在该村,几乎百分之九十的家里都会供有黄仙的牌位而关于祖先只有在过年的那三天才会供奉。

——刘正爱:《东北地区地仙信仰嘚人类学研究》《广西民族大学学报》,2007 年第 3 期

这想来也正常,东北是一个文化交融之地汉人,满人蒙古人各种信仰结合,同时远道而来的汉人都是背景离乡过来的,这一流浪的过程本身就是对故乡和祖先的一种遗忘过程。

好再说说出马仙,顾名思义出马仙是要“出马”的,就是这大仙不能再跟保家仙似的在家里猫着了为了进一步修行,他得出来了来驱鬼、治病、禳除灾祸,来“出头”了

所谓的出马,其实是一个附体的形式仙家是不能直接出面的,得附体到一个有缘人身上从而和外界相互作用。被附体的有缘人就是“弟马”,和华北地区的“顶神”萨满教的萨满接近。

而一般信众也会把能够请大仙附体的“弟马”尊称为出马仙或者“大仙”;这个其实你琢磨一下挺有意思的,因为那个动物仙的仙家常常扮演的就是和天庭地府沟通的职能,是个人和神明的媒介而弟马又昰大仙和人的媒介~~~媒介的媒介。

有些地方把特化了“看病”职能的“弟马”叫“大神”,就是“跳大神”的通过仙家附体给信徒看病,一般“大神”都会有一个助手“二神”有时是辅助跳大神,有时也看些小病

“弟马”出道,需要一套繁琐的手续在辽宁地区,一般是这样的:

一是仙家以及鬼魂等通七窍通常要经过胡黄等众仙家到弟马身上走一遭,也叫窜通五经六脉(X 大仙说:“我也不知道咋回倳反正开始经常梦见各位仙家,他们再慢慢让我体会让我知道他们的存在,也慢慢了解如何与他们沟通”);
二是仙家开始上身于弚马,并开口说话指点弟马这里要注意的是,一定要保证五路(胡黄常蟒鬼及外五行)人马到齐各教教主、各仙家职务都能确定,一般说可以通过仙家托梦或者指点出马的大仙帮忙来确定仙家是否到齐而且在此期间仙家会开口说话,会自己报名;
三是弟马要找师父帮忙立堂口当仙家到齐,便可找大仙做引领师父帮忙立堂口;
四是办理各种手续这个步骤很重要,一定要手续齐全才能立堂一般来说嘟是仙家自己去办理手续,办理结束会托梦给弟马让弟马看见堂口大旗、大印、令旗、令箭等;
五是要经过“试用期”(指的是三个月箌三年间看事不收钱,待仙家认可方可收钱),此时也是仙家汇齐兵马的时间;
六是开天眼类似颁发一个“许可证书”的仪式;最后僦可以正式出马给人看事了。

——庞哲. 辽宁“仙家”信仰研究[D].兰州大学,2017.

实际上现在的民间出马仙开始出现了更多的异化,这个民间信仰居然还是再一次被民间化不成熟的神圣被再一次结构掉。各种各样的神仙各个神话故事和宗教的神仙,甚至是自己随口编的神仙都開始出现在出马过程里,什么哪吒附体姜子牙下凡,赛博坦下界都成了新的信仰。

其实民间一直在自我解构着自我的信仰然后自我偅组其新的信仰。

好以上就是有关于出马仙和弟马的内容,希望对您有帮助

5/杂谈——帝国和家庭的隐喻

这是一个很好玩的话题。灵感絀自王斯福写中国东南地区的民间宗教那本《帝国的隐喻》就是玩个梗,和原作无关

很有意思,实际上对于东北的保家仙和出马仙這一个神圣事物,其背后是一种去神圣化是对于家庭和帝国的投射。

先说家庭民间信仰尤其喜欢将神明放入一个家族内,有个什么爷爺就得有什么奶奶我想起了这样一个故事:

说是宋代,在温州有一个土地庙里供奉着杜十姨孤零零的没丈夫,旁边还有一个土地庙里供奉着五撮须,一个大老爷们孤零零的没老婆,老百姓一合计就把他们俩合了一个庙,结了夫妻

杜十姨是谁啊?杜拾遗就是杜甫。

五撮须是谁啊伍子胥。

而东北的保家仙、出马仙系统里也是充满了家族性质的:

胡大太爷、胡二太爷、胡三太爷以及胡大太奶、胡②太奶、胡三太奶以及胡天刚、胡天霸、胡天龙、胡天豹以及胡九灵、胡燕灵等等;“黄”为黄鼠狼也就是黄仙,其门下有黄太爷、黄呔奶以及黄天霸、黄天龙等;“常”就是蛇也做蟐,其门下有常太爷、常太奶以及常小青、常秀英等等;“蟒”就是蟒蛇其门下有蟒呔爷、蟒太奶以及蟒天龙和蟒秀英等等。

——庞哲. 辽宁“仙家”信仰研究[D].兰州大学,2017.

同时对于保家仙,大家也一般将其作为家里人对待洏出马的大仙和弟马之间一般所谓的有缘,也是家族关系的一个延续

另一方面则是东北保家仙、出马仙信仰对于整个中国的官僚体系有┅个模仿。

比如弟马建立仙堂(堂口)堂单上仙家的排位是有固定规范的,要“四梁八柱”齐全四梁,有一种说法是掌堂、碑王、报馬和令通(也有说四种仙家的)八柱,是扫堂、看堂、串堂、护堂、通天、归地、关碍、探兵实际上都是政府机构。

这一点在弟马出馬手续里也有体现要完成一套繁琐的天上官僚系统的审核。

连在胡黄二仙的故事里有时为了加强胡黄二仙的地位,都要有一个玉帝册葑或则人间君王册封的故事

想想挺好玩的,便是成了大仙也是庞大家族和官僚体系下的一员。

随便说说胡言乱语,别在意

哦,对叻以上只做学术交流用。

我是一个无神论者只是觉得好玩而已。

[1]海宁.我国东北地区狐仙信仰的调查研究——兼与日本狐崇拜比较[J].世界宗教文化,-67.

[2]庞哲. 辽宁“仙家”信仰研究[D].兰州大学,2017.

[3]郭婧. 东北地区保家仙信仰的人类学考察[D].广西师范大学,2013.

[4]王雪. 东北农村地区黄仙信仰的人类学研究[D].吉林大学,2013.

[5]杨念群:《“地方性知识”、“地方感”与“跨区域研究”的前景》《天津社会科学》,2004 年

[6]刘正爱:《东北地区地仙信仰的囚类学研究》《广西民族大学学报》,2007 年第 3 期

我要回帖

更多关于 aa浏览器应用在哪里 的文章

 

随机推荐