面试笔记--数据库

#面试笔记

数据库

MySQL处理高并发,防止库存超卖

范式

  • 第一范式:数据库表的每一项都是不可分割的原子数据项,不能是集合。比如班级信息表里面不能有班级的学生。
  • 第二范式:在第一范式的基础上,所有属性完全依赖于主键,完全依赖就是不能取决于主键的一部分
  • 第三范式:在第二范式的基础上,消除传递依赖,比如学生表里有学生属于的班级编号,但不能有班级的名称,班级人数等班级信息,因为班级信息可有由班级编号通过班级表推出来,有传递依赖
    第一范式->第二范式->第三范式
    从左到右数据冗余越来越少,查询越来越复杂
    从右到左有数据冗余,但查询简单

事务

并发控制的单位,是用户定义的一个操作序列,要么全做,要么全不做,是不可分割的。

  1. 原子性
  2. 一致性:使数据库从一个一致性状态到另一个一致性状态
  3. 隔离性:一个事物的执行不被其他事务干扰
  4. 永久性:一个事务一旦提交,它对数据库的改变就是永久性的

数据库索引有几种类型

面试笔记--Java异常

#面试笔记

Java异常

Java异常结构

http://blog.csdn.net/hguisu/article/details/6155636
java异常

  • Throwable Throwable是 Java 语言中所有错误或异常的超类。 Throwable包含两个子类: Error 和 Exception 。它们通常用于指示发生了异常情况。 Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。
  • Exception Exception及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
  • RuntimeException RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 编译器不会检查RuntimeException异常。 例如,除数为零时,抛出ArithmeticException异常。RuntimeException是ArithmeticException的超类。当代码发生除数为零的情况时,倘若既”没有通过throws声明抛出ArithmeticException异常”,也”没有通过try…catch…处理该异常”,也能通过编译。这就是我们所d说的”编译器不会检查RuntimeException异常”! 如果代码会产生RuntimeException异常,则需要通过修改代码进行避免。 例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!
  • Error 和Exception一样, Error也是Throwable的子类。 它用于指示合理的应用程序不应该试图捕获的严重问题,大多数这样的错误都是异常条件。 和RuntimeException一样, 编译器也不会检查Error。

    Read More

面试笔记--JVM

#面试笔记

JVM

JVM内存分哪几个区,每个区的作用是什么?

Java虚拟机主要分为以下一个区:

  • Java堆
    java堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。Java堆可以细分为新生代和老年代。在细致分就是把新生代分为:Eden空间、From Survivor空间、To Survivor空间。
  • 方法区:
    1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载
    2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。
    3. 该区域是被线程共享的。
    4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。
  • 虚拟机栈:
    1. 虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。
    2. 虚拟机栈是线程私有的,它的生命周期与线程相同。
    3. 局部变量表里存储的是基本数据类型、returnAddress类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定
      4.操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索引来访问,而是压栈和出栈的方式
      5.每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。
  • 本地方法栈
    本地方法栈和虚拟机栈类似,只不过本地方法栈为Native方法服务。
  • 程序计数器
    内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个java虚拟机规范没有规定任何OOM情况的区域。

Read More

面试笔记--Java基础

#面试笔记

Java基础

什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。
Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。
Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

Read More

长沙游玩攻略

Day1

  • 黄兴路步行街
  • 坡子街
    • 李公庙糖油粑粑
    • 老长沙龙虾馆
    • 向群锅饺
    • 五娭毑臭豆腐
    • 杨裕兴
    • 火宫殿
  • 太平街
    • 贾谊故居(需要证件,周一闭关,AM 8:30~11:30 PM 13:00~16:30)
    • 黑色经典臭豆腐
    • 老长沙油炸社
    • 正哥肉串
  • 杜甫江阁
  • 化龙池酒吧街

生产者-消费者问题的多种 Java 实现方式

生产者-消费者问题的多种 Java 实现方式

生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。

解决生产者/消费者问题的方法可分为两类:

  1. 采用某种机制保护生产者和消费者之间的同步
    • 采用synchronized锁以及wait()/notify()方法实现
    • 采用Lock锁以及await()/signal()方法实现
    • BlockingQueue阻塞队列方法
    • Semaphore方法
  2. 在生产者和消费者之间建立一个管道。
    • PipedInputStream/PipedOutputStream

第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。
第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。

Read More

生产者-消费者问题的多种 Java 实现方式

生产者-消费者问题的多种 Java 实现方式

生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。

解决生产者/消费者问题的方法可分为两类:

  1. 采用某种机制保护生产者和消费者之间的同步
    • 采用synchronized锁以及wait()/notify()方法实现
    • 采用Lock锁以及await()/signal()方法实现
    • BlockingQueue阻塞队列方法
    • 信号量(Semaphore)方法
  2. 在生产者和消费者之间建立一个管道。
    • PipedInputStream/PipedOutputStream

第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。
第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。

Read More