JAVA面试题第五天

今天是第五天。
1.数据库隔离级别有那些,各自的含义是什么,MYSQL默认的隔离级别是什么。
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话未提交事务修改的数据。
提交读(Read Committed):(只能读取到已经提交的数据,)oracle等多数据库默认都是该级别。
可重复读(Reapeated Read):可重复读。就是在开始读取数据(事务开启)时,不再允许修改操作,InnoDB默认级别。SQL标准中,该隔离级别消除了不可重复读,但是还存在幻读。
串行读(serializable):完全串行化的读,每次读都需要获得表级别共享锁,读写相互会阻塞。
MYSQL默认是RepeatedRead级别。

2.MYSQL有哪些存储引擎,各自优缺点。
MyISAM:拥有较高的插入,查询速度,但不支持事物。
InnoDB:5.5版本后Mysql的默认数据库,事物型数据库的首选引擎,支持ACID事物,支持行及锁定。
Menmory:所有的数据都置于内存之中,更新插入查询的效率都极快,但是会占用和数据量成正比的内存空间,会在Mysql关闭时丢失数据。
Merge:将一定数量的MyISAN表联合而成一个整体,在超大规模存储数据时很有用。
archive:非常适合存储大量的独立的作为历史记录的数据。高效的插入效率,但是读取效率低。
federated:将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用。
Cluster/NDB
CSV:
BlackHole:
3.高并发下,如何安全的修改同一行数据。
使用悲观锁吗,也可以在缓存队列中锁定主键。

4.乐观锁和悲观锁是什么,INNODB的行级锁有两种,解释其含义。
行级锁分为共享所和排他锁,共享锁又称为读锁,排他锁又称为写锁。
http://www.jianshu.com/p/f40ec03fd0e8

5.数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁。
产生死锁的主要原因:
(1)系统资源不足。
(2)资源分配不当。
(3)进程运行推进的顺序不当。
产生死锁的四个必要条件:
互斥条件:一个资源一次只能被一个进程使用。
不剥夺条件:一个进程在使用完该资源时不能剥夺该资源。
请求与保持条件:一个进程在请求资源的同时对已持有的资源保持不放。
循环等待条件:若干进程形成首位相接的循环等待资源的关系。
上面四个是必要条件,有一个不满足则不会发生死锁。
解决死锁的两个方法:
重启数据库。
杀掉抢夺资源的进程。

6.MYsql的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。
索引是通过复杂的算法,提高数据的查询性能的手段。从磁盘io到内存io的转变。
普通索引,主键,唯一,单列/多列索引建索引的几大原则。
1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配知道遇到范围查询(>、<、between、like)就停止匹配,比如a=1and b=2 and c>3 and d=4,如果建立(a、b、c、d)顺序的索引,d是用不到索引的,如果建立(a、b、c、d)的索引都可以用到,(a、b、d)的顺序可以任意调整。
2.=和in可以乱序,比如a=1 and b=2 and c=3建立(a,b,c)索引可以是任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。
3.尽量选择区分度高的列作为索引区,区分度的公式是count(distinct col)/count(*),表示字段不不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前的区分度是0吗,这个值是很难确定的,一般需要join的字段我们都要求0.1以上,即平均1条扫描10条记录。
4.索引不能参与运算。
5.尽量扩展索引,不要建立新的索引。

7.聚集索引与非聚集索引的区别
聚簇就是索引和记录紧密在一起
非聚簇索引就是索引文件和记录文件分开存放,索引的叶子页只保存了主键值,要定位记录还需要去查找相应的数据块。

8.ACID是什么
A,atomic,原子性,事物的提交要么全部成功,要么全部失败。
B, consistent,一致性。事物开始及结束后,数据的一致性约束没有被破坏。
I,isolation,隔离性,并发事物之间互不影响,互不干扰。
D,durability,持久性,已经提交的事物对数据库的更新必须永久保存。

9.Mysql怎么优化table scan的(看着有些奇怪)
避免在where子句中对字段进行is null判断。
应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
避免在where子句中使用or来连接条件
in 和 not in也要慎用。
like查询
使用NUM=@num这种参数
where子句中对字段进行表达式操作num/2==XX
在where子句中对字段进行函数操作

10.简述你所知道的linux
是主流的服务器操作系统,java应用的部署环境有很多为linux。linux只有一个根目录root,使用命令的方式进行操作。

11.什么是JAVA虚拟机?为什么JAVA被称作平台无关的语言
JAVA虚拟机是个能够执行java字节码的虚拟机进程,Java源文件被编译成能被JAVA虚拟机执行的字节码文件。JAVA虚拟机让java成为与平台无关的语言,因为它知道硬件平台的特性。

12.JDK、JRE、JVM关系是什么?
JDK即为开发工具包,包含编写JAVA程序所必须的编译、运行等开发工具以及JRE。开发工具:用于编译java程序的javac命令,用于启动JVM运行java程序的java命令、用于生成文档的javadoc命令以及用于打包的jar命令等。
JRE即为java运行环境,提供运行环境,提供了java应用程序所必须的软件环境,包含有java虚拟机和丰富的系统类库。系统类库即java提前封装好的功能类,只需直接拿来用直接使用即可,可以大大的提高开发效率。
JVM即为java虚拟机,提供字节码文件(.class)的运行环境支持。简单来说,就是JDK包含JRE包含JVM。

13.JAVA支持的数据类型有哪些,什么是自动装箱和自动拆箱。
基本数据类型
整数型:byte,short,int,long
浮点型:double,float。
字符型:char
布尔类型:Boolean
String是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中世纪存储的是一个引用地址,实体在堆中。引用类型包括类。接口、数组等。String类还是final修饰的。包装类型是引用类型,自动装箱和拆箱就基本类型和引用类型的相互转换,包装类型的一个好处就是可以使用里面的方法。集合中如果想要存放基本类型,泛型的限定类型就只能是对应的包装类型。

14面向对象是什么
面向对象是一种思想,世间万物都可以看做是一个对象,这里只讨论面向对象编程。
JAVA是一个支持并发,基于类,面向对象的编程语言,面向对象软件开发的优点是:
代码开发模块化,有利于代码维护和修改。
代码复用性强。
增强了代码的可读性。
增强了代码的灵活性和可靠性。
面向对象的基本四大特性
抽象:提取现实世界中某事物的关键特性,为该事物构建模型的过程。对同一事物在不同的需求下,需要提取的特性可能不同。得到的抽象模型中一般包含属性和行为,这个抽象模型我们称之为类,对类实例化得到对象。
封装:封装可以使类具有独立性和隔离性;保证类的高内聚。只暴露给类外被或者子类必须的属性和操作。类封装的实现依赖类的修饰符(public、private、protected)
继承:对现有类的一种复用机制。一个类如果继承现有的类,则这个类将拥有被继承类的所有非私有特性,这里的继承包括:类的继承和接口的实现。
多态:多态是在继承的基础上实现的。多态的三个要素:继承、重写和父类引用指向子类对象。父类引用指向不同的子类对象时,调用相同的方法呈现出不同的行为,就是多态类特性。多态可以分成编译时多态和运行时多态。

15.请写出下面几个表达式的结果,答案可以用10进制或16进制书写
(1)0xaa|0x55 十六进制,或运算。
(2)15&240 10进制与运算
(3)10^12 异或运算相同取零,不同取一。
(4)-2>>1 带符号的右移,负数符号位补1,正数符号位补0
(5)-2>>>1 无符号的右,符号位补0。

16.&和&&的区别?
一个是逻辑与一个是短路与,要根据实际的情况去使用,比如:
if(usernamenull&&username"");

17.什么是值传递,什么是引用传递
值传递是对基本型变量而言,传递的是该变量的一 个副本,改变副本不影响原变量。
引用传递是对于对象型变量而言的,传递的是该对象地址的一个副本,并不是原对象本身。一般认为,java内的传递都是值传递,java实例对象的传递是引用传递。

18.是否可以在static环境中访问非static变量
static的变量是属于类的,在所有实例中相同,在类被虚拟机加载的时候,static的变量会初始化。当你的代码尝试不用实例去访问非static变量的时候,编译器会报错,因为这些变量还没有被创建出来,没有跟任何实例关联上。

19.JAVA中的方法覆盖和方法重载是什么意思?
JAVA中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表,返回类型。覆盖着可能不会限制它所覆盖的方法的访问。

20.java中什么是构造方法?什么是构造方法重载?什么是复制构造方法?
当新对象被创建的时候,构造方法会被调用,每一个类都有构造方法,在程序员没有给类提供构造方法情况下,java编译器会为这个类创建一个默认的构造方法。
java中构造方法重载和方法重载很相似。可以为一个类创造多个构造方法。每一个构造方法必须有自己唯一的参数列表。
JAVA 不支持复制构造方法。

21.JAVA支持多继承吗?
JAVA的类不支持多继承,但是JAVA的接口支持多继承,接口的作用是用来扩展对象的功能的。

22.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
通常我们定义一个基本类型的变量,对象的引用,调用方法的现场保存都是存放在栈空间的,而new和构造方法创建出来的对象是放在堆空间的。堆是垃圾收集器管理的主要区域,而现在垃圾收集器的主要是使用分带回收算法,所以堆空间被分为新生代和老年代,而新生代可以被分为Eden和survivor(to,form),方法区和堆都是线程共享的内存区域,用来存储被JVM加载的类信息,常量和静态变量,JIT编译器编译后的程序代码。栈操作起来是最快的但是比较小,通常大量对象都是放在堆空间里面的,堆和栈的大小可以通过调整JVM的启动参数来调整。如果栈空间用完了就会出现Stack Overflowerror,而堆和常量池空间用完以后会出现outofMemoryerror的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值