面试--基础

继承,封装,多态?

封装:是对象和类概念的主要特性,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承:子类继承父类,它就可以使用父类的所有功能,并在无需编写父类的情况下对这些功能进行扩展。

多态:多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。Fu f=new Zi();  多态的三个条件:一、要有继承;二、要有重写;三、父类引用指向子类对象  

==和equals的区别?

==:如果比较的对象是基本数据类型,则比较的是数值是否一致;如果比较的是引用数据类型,则比较的是对象的地址值是否一致。

equals()方法不能用于比较基本数据类型的对象用于比较对象的时候返回值取决于重写实现。

对于String类 Date类 File类等 可重写equals() 方法用于比较对象的属性内容是否一致。

final,finally,finalize的区别?

final用于声明属性,方法,类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理结构语句的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等.JVM不保证此方法总被调用。

补充:try -catch语句块中存在return语句,finally会不会执行。

不管有没有出现异常,或者try-catch中有return时,finally仍然会执行,先执行try-catch里面return之前(包括return 语句中的表达式计算),再执行finally块,

finally中最好不要有return,否则会提前退出,返回值不是try或catch中保存的返回值。

int 和integer有什么区别?

int是java提供的8种原始数据类型之一。java为每个原始数据类型提供了封装类,Integer就是java为int提供的封装类。

int的默认值为0,Integer的默认值为null,是引用类型,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,

 ①、无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。

 ②、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。

 ③、两个都是new出来的,则为false。

 ④、int和integer(new或非new)比较,都为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。

数据库索引原理?

数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询或更新数据库表中数据。索引的实现通常使用BTree及其变种B+Tree

为什么使用索引?

数据库查询是数据库最主要的功能之一。而当数据量越来越大的时候,查询花费的时间会随之增长。索引可以加速数据的查询。因为索引是有序排列的,可以大大减少了存储引擎需要扫描的数据量 

举个例子来说,假设我们有一个数据库表EpUser,这个表分别有三个字段:name,age,address。假设表中有1000条记录。

假如没有使用索引,当我们查询名为“James”的雇员的时候,即调用:select name,age,address from Employee where name = ‘James‘;

此时数据库不得不在Employee表中对这1000条记录一条一条的进行判断name字段是否为“James”。这也就是所谓的全表扫描。

如果在EpUser表上的name字段上创建索引,在我们查询时,会通过索引去查询名为“James”的雇员,这时查找名为“James”的记录时会快很多,因为该索引已经按照字母顺序排列,名字首字母为“J”的雇员都是排列在一起的。通过该索引,能获取到表中对应的记录。

为什么使用B-Tree索引?

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,因此索引查找过程会产生IO消耗,

相对于内存存取,IO存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。

换句话说就是索引的结构组织要尽量减少查找过程中磁盘的存取次数。

SQL优化方法?

(1)负向条件查询不能使用索引,可以优化为in查询

    select from user where status != 0  (not in /not exist都不好);

    select from user where status in(2,3);

(2)如果业务大部分是单条查询,使用Hash索引性能更好

         因为B-tree索引的时间复杂度是O(log(n)) 而Hash索引的时间复杂度是O(1)

         select from user where login_name=?

(3)单列索引不存null值,复合索引不存全为null的值,如果列可以为null,可能会得到不符合预期的结果集。

          select  from user where name!=‘kun‘

         如果name允许为null,索引不存null值,结果集中不会有这些记录,因此请使用not null 约束以及默认值。

(4)遵循符合索引最左前缀原则。最左前缀不是指SQL语句where顺序要和复合索引顺序一致

(5)使用枚举而不是字符串

(6)如果明确知道只有一条返回结果,limit 1能够提高效率

(7)不要使用select * 查询,只返回需要的列

(8)使用单表查询时,相同字段尽量不要用or,因为可能导致索引失效,用UNION代替。

          select  * from user where name=‘手机‘ or name =‘电脑‘(反面教材)

(9)索引不宜过多,根据实际情况决定,尽量不要超过10个。

(1) 表关联查询时务必遵循小表驱动大表原则

(2)分表,可根据业务字段尾数中的个位或十位或百位做表名达到分表的目的

(3)分库,可根据业务字段尾数中的个位或十位或百位做库名达到分库的目的

(4)表分区,类似于硬盘分区,可以将某个时间段的数据放在分区里,加快查询速度,可以配合分表+表分区结合使用

(5)使用非前导模糊查询

(6)在数据区分度大的字段上使用索引,一般能过滤80%的数据时就可以使用索引

(7)在属性上进行计算不能命中索引

神器EXPLAIN语句

explain显示了mysql如何使用索引来处理select语句及连接表。可以帮助选择更好的索引和写出更优化的查询语句

使用方法:在select语句前面加上explain就行

explain语句输出结果中各属性简介

table:显示这一行的数据是关于哪张表的

type:这是重要的列,显示连接使用了何种类型,从最好到最差的连接类型为const,eq_reg,ref,range,indexhe和all

possible_Keys:可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从where语句中选择一个合适的语句

key:实际引用的索引。如果为null,则没有使用索引。很少的情况下,mysql会选择优化不足的索引。

这种情况下,可以在select语句中使用use index(indexname)来强制使用一个索引或者用ignore index(indexname)来强制mysql忽略索引。

key_len:使用索引的长度。在不损失精确性的情况下,长度越短越好。

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:mysql认为必须检查的用来返回请求数据的行数

extra:关于mysql如何解析查询的额外信息

 

== ??????????? equals() ?
????????????
??????????? == ? equals() ??????????????
??? == ?? true?? equals() ???? true ?? false ??????
???????????????????????? == ? equals() ?
???????

相关推荐