1、java中==和equals和hashCode的区别
java中数据类型可分为两种,引用数据类型和基本数据类型,基本数据类型使用‘==’比较的是数值,引用数据类型使用的是对象在内存中存放的地址,因为对象是存放在堆中,而栈中存放的是对象的引用,所以引用数据类型比较的就是栈中值进行比较(integer 127和128比较,当127的时候integer会进行缓存,而128的时候将会重新new),而equals是可以进行重写的,假如没有重写equals调用的就是objects的equals方法,和==是相同的,比较的是对象在栈中引用的对象地址,如果重写了这就根据你自定义的方法进行比较,hashcode是一个数值,每个对象通过hash算法得出的一个hashcode值,说到hashcode就得说下hashmap,hashmap数据存储是通过hash表进行存储的也就是数组整合链表的数据格式(因为数组查询快,修改慢,而链表修改快查询慢),当map进行put元素时候,map计算key值得hashcode值,然后定位到hash表中的位置,查找这个位置是否有值如果有值,如果没值就直接存放,如果有值就进行比较equals,如果equals比较返回为true,就不需要保存对象,如果不相同则需要加入链表中
每个map添加的都是entry类,Entry类里面有一个next属性,作用是指向下一个Entry。打个比方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起
2、什么是内部类?内部类的作用
把一个类定义到另外一个类的内部,在类里面的这个类就叫内部类,由于内部类对外部类的所有内容都是可访问的,内部类的作用为了实现多继承的效果,因为java是单继承,而内部类可以很好地解决单继承问题
3、泛型通配符extends与super的区别
extends T>限定参数类型的上界:参数类型必须是T或T的子类型
super T> 限定参数类型的下界:参数类型必须是T或T的超类型
4、final,finally,finalize的区别
final定义的类不可以被继承,final成员变量表示常量,只能赋值一次不能修改,而finalize是虚拟机在进行垃圾回收的时候,可以进行一次自救所调用的方法,当jvm进行gc的时候会判断这个对象是否有必要执行finalize,如果有必要则会把对象放到一个F-queue队列中,然后将会由一个jvm建立的优先级比较低的finalize线程去执行它,但是并不会等到他执行结束(因为怕finalize方法死循环阻塞等),如果第二次标记这个对象需要进行回收,那么finalize将无法再次拯救。
5、jdk自带的几种线程池是什么,有什么区别
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
6、数据库的MYISAM和innodb存储引擎(msql5.1x版本默认不会安装innodb)
(1)如果对整表进行count(*),由于在存储过程中,MyISAM会对表的行数进行存储,从而读取较快,但是InnoDB会逐行扫描统计,从而费时较多。如果加上where限定则两种方式都要逐行扫描。
(2)MyISAM支持全文索引,InnoDB5.6之前不支持全文索引。在数据量并发大的情况下,使用全文索引会导致小量请求占用大量数据库资源,所以在高并发的业务下,全文索引并不索引。
(3)MyISAM不支持事务,InnoDB支持事务(保持数据一致性)
事务提供了commit、rollback、崩溃修复的能力,能很好的处理系统异常崩溃的情况,并保护文件免损伤,但事务也非常耗费性能,通常建议对一致性要求较高的业务使用复杂事务。MyISAM可以通过表锁来实现类似于事务的行为,但对性能影响较大。
(4)MyISAM不支持外键,InnoDB支持外键
在高并发的情况下,建议有应用程序保证完整性,而不使用外键
(5)MyISAM只支持表锁,InnoDB可以支持行锁。所以,在数据量大,高并发的状况下,InnoDB的性能较优。不命中索引,InnoDB也不能使用行锁
7、数据库几种索引的区别
数据库索引,聚集索引(主键索引)、普通索引、唯一索引以及全文索引(FULLTEXT INDEX)等索引。
8、深拷贝和浅拷贝
浅拷贝复制对象的基本数据类型,当进行复制拷贝时只是进行值得复制传递,对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的在栈中的内存地址复制一份给新的对象,不会为属性新开辟空间,指向同一个实例。
深拷贝的场景是当一个对象他的成员变量也是一个对象的时候,他进行拷贝的时候是把成员变对象的属性也进行拷贝,把对引用指向的对象进行拷贝,浅拷贝中是对象引用类型的引用地址进行拷贝,而深拷贝是对引用类型的对象进行拷贝。
9、静态代理、动态代理、cglib代理
静态代理:一个代理类只能对一个业务接口的实现类进行包装,如果有多个业务接口的话就要定义很多实现类和代理类才行。而且,如果代理类对业务方法的预处理、调用后操作都是一样的(比如:调用前输出提示、调用后自动关闭连接),则多个代理类就会有很多重复代码。
jdk动态代理:需要类必须要实现接口,同时必须要代理类必须继承InvocationHandler,如果实现类中有接口中没有的方法那将不能进行调用。
cglib动态代理:必须继承MethodInterceptor,cglib是针对类来实现代理的,原理是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理。因为采用的是继承,所以不能对final修饰的类进行代理
10、oracle的逻辑结构、物理结构、内存结构
逻辑结构
数据块 最小的存储单元,是操作系统块大小的整数倍。
区由连续的数据块组成。用于保存特定数据类型的数据,区不可跨越多个数据文件。
段是由多个区组成,用于保存特定的数据库对象。段能不能跨越多个数据文件
(1) 数据段
数据段也称为表段,它包含数据并且与表和簇相关。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
(2) 索引段
包含了用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
(3) 回滚段
oracle回滚段的理解:
当一个事务开启(DML会自动开启事务)时,系统会自动为之分配回滚段。当修改表中数据的时候,
该数据修改前的值(即前影像)会存放在回滚段中,
当用户回滚(rollback)事务时,oracle将利用回滚段中的数据前影像来将修改的数据
恢复到原来的值。提交事务之后,系统会自动释放相应回滚段的数据。
问:当前会话为什么查到的都是最新的数据?
答:未提交的数据称为脏数据,脏数据都是保存在内存中的,而且只对于该会话有效。
问:新开始一个会话(session),为啥查不到未提交的数据?
答:由于事务的隔离性
(4) 临时段
它是Oracle在运行过程中自行创建的段。当一个SQL语句需要临时工作区时,由Oracle建立临时段。一旦语句执行完毕,临时段将自动消除。
(5) LOB段
如果表中含有CLOB和BLOB等大型对象类型数据时,系统将创建LOB段以存储相应的大型对象数据。LOB独立于保存表中其他数据的数据段。
表空间 Oracle数据库是由若干个表空间(tablespace)构成的。任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个数据文件,即表空间是由一个或多个数据文件构成的,一个数据文件只可以属于一个表空间。表空间相当于操作系统中的文件夹,这是Oracle数据库逻辑结构与物理文件之间的一个映射。所以数据库的存储空间在物理上表现为数据文件,在逻辑上表现为表空间。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。
查询表空间信息最常用sql:
select * Fromuser_tablespaces;
select *from dba_tablespaces;
(1) 系统表空间
系统表空间(system tablespace)是每个Oracle数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。
系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。
(2) SYSAUX表空间
SYSAUX表空间是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle 数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷。
(3) 临时表空间
相对于其他表空间而言,临时表空间(temp tablespace)主要用于存储Oracle数据库运行期间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。
(4) 撤销表空间
也叫UNDO表空间。用于保存Oracle数据库撤销信息,即保存用户回滚段的表空间。除了回滚段,在撤销表空间中不能创建任何其他类型的段,因此,用户不能再撤销表空间中创建数据库对象
11、drop、truncate、 delete区别
最基本:
drop直接删掉表。
truncate删除表中数据,再插入时自增长id又从1开始。
delete删除表中数据,可以加where字句。
(1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
(3) 一般而言,drop > truncate > delete
(4) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view
(5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
(6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(7) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 trigger,执行的时候将被触发。
(8) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚。
(9) 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
(10) Truncate table 表名 速度快,而且效率高,因为:?truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
12、索引种类
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
ps.
索引合并,使用多个单列索引组合搜索
覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
13、Hash索引和B+ Tree索引
B+ Tree索引和Hash索引区别 哈希索引适合等值查询,但是无法进行范围查询 哈希索引没办法利用索引完成排序 哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题(InnoDB引擎,默认的是B+tree)
存储数据不同类型:InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值
14、聚簇索引和非聚簇索引
索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引
15、覆盖索引
覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。 如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from covering_index_sample where key1 = ‘keytest’;的时候,就可以通过覆盖索引查询,无需回表。
16、联合索引最左前缀匹配
在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则 (select * from table where key1=1 会用到索引) (select * from table where key2=1 不会用到索引)因不满足最左前缀匹配规则索引的顺序必须(key1)、(key1,key2)和(key1,key2,key3),详情可见 https://blog.csdn.net/zzx125/article/details/79678770
17、什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢(我也曾被问过,还以为是什么情况下索引sql语句的使用会使索引失效。。。)
查询优化器 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。 在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。 优化过程大致如下: 1、根据搜索条件,找出所有可能使用的索引 2、计算全表扫描的代价 3、计算使用不同索引执行查询的代价 4、对比各种执行方案的代价,找出成本最低的那一个,不使用索引的情况(或许和聚簇索引和非聚簇索引有关需要进行回表查询有关)