面试题整理 持续更新中

1、 java的三大特征是什么?

封装:通过私有化,将类中的函数、属性进行隐藏,只保留一些对外的方法与外界进行交互,用户不必知道具体的实现。例如:bean的封装

继承:继承是从已有的类中派生出新的类, 新的类能吸收已有类的数据属性和行为,并能扩展新的能力,被继承的类叫父类(parent class)或超类(superclass), 继承父类的类叫子类(subclass)或派生类(derivedclass)。 因此, 子类是父类的一个专门用途的版本, 它继承了父类中定义的所有实例变量和方法, 并且增加了独特的元素 。

方法的重写:

方法重写是在继承关系下,子类拥有与父类方法名、参数(个数、顺序、 类型)、 返回值类型完全相同,访问修饰符只能扩大或相等,不可缩小,但实现过程与父类不同的方法。方法重写也是多态的一种变现形式。

重写必须满足以下几个条件:

  1. 在子类中可以根据需要对从基类中继承来的方法进行重写

  2. 重写的方法和被重写的方法必须具有相同方法名称、 参数列表和返回类型;

  3. 重写方法不能使用比被重写的方法更严格的访问权限*。*

多态: 是指一个方法可以有多种实现版本,即“一种定义, 多种实现”。 利用多态可以设计和实现可扩展的系统, 只要新类也在继承层次中。 新的类对程序的通用部分只需进行很少的修改, 或不做修改。 类的多态性表现为方法的多态性,方法的多态性主要有方法的重载和方法的覆盖。

重载:

方法重载(overload)是指在同一个类中的多个方法可以同名但参数列表必须不同。 重载表现为同一个类中方法的多态性。

2、 Java的引用类型有哪些?强引用在内存满了如何被回收?

强引用、软引用、弱引用、虚引用。

如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引用,如下:

显式地设置o为null,或超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。

3、 Arraylist是什么?和list有什么不同?

Arraylist是实现接口list的实现类,实现类list中的所有方法并加入了自己特有的方法,因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。

例如:List list = new ArrayList(); 这句创建了一个ArrayList实现类的对象后把它上溯到了List接口。此时它就是一个List对象了,它有些ArrayList类具有的,但是List接口没有的属性和方法,它就不能再用了。

4、 线程中start方法和run方法的区别

​ Start运行之后会重新启动一个新的线程去处理run里面的方法。

run启动则程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

当一个线程启动之后,不能重复调用start(),否则会报IllegalStateException异常。但是可以重复调用run()方法。

5、 线程运行的三个状态是什么?线程的生命周期?

三大状态:就绪、运行、阻塞

五大状态:创建、就绪、运行、阻塞、终止

生命周期:图结构如下, 对应五个状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBkIUt6u-1660051832986)(C:\Users\nilei\AppData\Roaming\Typora\typora-user-images\image-20220722090913848.png)]

6、 mysql的索引类型有哪些?

按字段特性分类为:主键索引、唯一索引、普通索引和全文索引。

按数据类型分类为**:B+tree索引、Hash索引、Full-text索引**

索引提高数据的读写速度,提高并发能力和抗压能力。索引相当于图书的目录,根据目录可以快速找到所需的内容

**主键索引:**唯一性索引

**唯一索引:**索引列的所有值只能出现一次,且必须唯一,值可以为空。

**普通索引:**普通的索引类型,值可以为空,没有唯一性的限制

**全文索引:**索引类型位fulltext,它可以在varchar、char、text类型的列上创建。可以通过alter table或create index命令创建。

B+tree****索引:非叶子节点上仅存储键值,不存储数据;数据记录均存储在叶子节点上,并且数据是按照顺序排列的。

a:图示如下(B+tree的优点):

**a.非叶子节点上可以存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树也就会变得更矮更胖。这样一来我们查找数据进行磁盘I/O的次数就会大大减少,数据查询的效率也会更快。

b. 所有数据记录都有序存储在叶子节点上,就会使得范围查找,排序查找,分组查找以及去重查找变得异常简单。

**c.**数据页之间、数据记录之间都是通过链表链接的,有了这个结构的支持就可以方便的在数据查询后进行升序或者降序操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFs2oF5r-1660051832987)(C:\Users\nilei\AppData\Roaming\Typora\typora-user-images\image-20220722090928494.png)]

B树(图示):B树每个节点都会存储数据和关键字,而且叶子节点没有任何关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WhLvSj8c-1660051832988)(C:\Users\nilei\AppData\Roaming\Typora\typora-user-images\image-20220722090945467.png)]

B+树与B树对比:

1. **B+树的磁盘读写代价更低 。**B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说I/O读写次数也就降低了。

2. **B+树的查询效率更加稳定。**由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

3. **B+树更有利于对数据库的扫描。**B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题,而B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,所以对于数据库中频繁使用的range query,B+树有着更高的性能。

7、 为什么添加索引之后查询速度变快?

传统的查询方式为遍历查询,而索引查询则是通过btree算法生成一个索引文件,查询数据库时,找到索引文件进行遍历(折半查找),找到相应的键从而获取数据。

8、 在哪些列上使用索引?

a) 查询较频繁的字段应该创建索引

b) 唯一性太差的字段不适合创建索引,例如gender

c) 更新非常频繁的字段不适合索引

d) 不会出现在where子句的字段不该创建索引

总结如下:

a: 肯定在where条经常使用

b: 该字段的内容不是唯一的几个值

c: 字段内容不是频繁变化。

9、 MySql的引擎有哪些?

MySQL的体系结构:

**1、InnoDB 存储引擎。**InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的 MySQL 存储引擎。

特点:

(1) 支持自动增长列AUTO_INCREMENT。自动增长列的值不能为空,且值必须唯一。MySQL中规定自增列必须为主键。

(2) 支持外键,保证数据的完整性和正确性。外键所在表为子表,外键所依赖的表为父表。父表中被子表外键关联的字段必须为主键。

(3) DML操作遵循ACID(原子性、一致性、隔离性、持久性)模型,支持事务。

(4) 行级锁 ,提高并发访问性能。

行级锁和表级锁的区别

1、 表级锁,一般是指表结构共享锁,是不可对该表执行DDL操作,但对DML操作都不限制。 行级锁之前需要先加表结构共享锁。锁定整个表,限制对于其他用户对表的访问。

2、行级锁,一般是指排它锁,即被锁定行不可进行修改,删除,只可以被其他会话select。行级锁之前需要先加表结构共享锁。对目前被修改的行进行锁定,其它用户可访问被锁定的行以外的行。

2、 MyISAM 存储引擎

特点:

(1) 不支持事务,不支持外键
(2) 支持表锁,不支持行锁
(3) 占用空间小,访问速度快

3 、Memory 存储引擎

Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。

特点:

(1) 内存存放
(2) hash索引(默认)

10、MySql优化方向:

(1) 选择合适的字段属性

(2) 使用连接(JOIN)代替子查询

(3) 使用联合(UNION)来代替创建临时表

(4) 事务

(5) 锁定表

(6) 使用外键

(7) 使用索引

(8) 优化查询语句

11、 Mybatis的常见的使用${}的情况:

${} 使用之后不会带上单引号  而#{} 会自动加上单引号

1.当sql中表名是从参数中取的情况
2.order by排序语句中,因为order by 后边必须跟字段名,这个字段名不能带引号,如果带引号会被识别会字符串,而不是字段。

12、 union和union All的区别

对两个数据库进行操作
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

13、 异常和错误的区别

共同的基类时Throwable
异常是程序运行时会出现的各种状况,比如文件丢失等,影响了程序的正常运行,但不至于导致程序崩溃。
错误是java虚拟机抛出的,这类错误将导致程序无法正常运行。

14、线程的启动

继承Thread
	new Thred().start() // 即可启动

实现Runnable接口(启动方法:启动需要创建线程Runnable的实例,并把这个实例作为线程类的target)
	new Thread(new RunableImpl).start();

实现Callable(启动方法:)
	 CallThread callThread = new CallThread();
     FutureTask<String> futureTask = new FutureTask<>(callThread);
     Thread thread = new Thread(futureTask);
     
	该方式的优点;该接口方法为call()作为线程执行体(有返回值,抛出异常、Callable接受一个泛型,在call方法中返回这一类型的值。Runnable的run无返回值)

线程池创建
    //创建线程池
    ExecutorService executorService = new ThreadPoolExecutor(3, 10,
    50, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
    //创建
    Callable myCallable = new Callable() {
        @Override
        public String call() throws Exception {
            Thread.sleep(3000);
            System.out.println("call方法执行了");
            return "call方法返回值";
        }
    };
    Future future = executorService.submit(myCallable);

15、HashMap和HashTable的区别

1、初始容量不同 前者容量为16,后者容量为11
2、底层数据结构不同 1.7之前相同 jdk1.8之后map加入了红黑树
3、map运行键值为null,table不行
4、线程安全性的问题 后者加入了同步锁(整个hashmap对应一把锁) 但降低了执行效率 单线程下map更占优势 并发情况下考虑CurrentHashMap,加入同步锁 每个数组节点对应一把锁
5、扩容的机制:前者达到负载因子的3/4即容量翻倍,后置翻倍+1

16、HashMap的put流程

1、HashMap是懒惰创建数组的,首次使用才会创建数组
2、根据key计算索引
3、如果索引没有占用,则直接创建node占位返回
4、占用了的话
	1、如果是普通的节点,走链表的添加或者更新逻辑,如果链表的长度超过阈值,则树化
	2、走红黑树添加或更新逻辑
5、返回前检查容量是否超过阈值,一旦超过则扩容

17、StackOverFlowError原因(java基础的题目 涉及线程、堆栈空间)

每个线程都有自己的堆栈,每个堆栈都有多个堆栈帧,线程按照执行顺序将其执行的方法、数据类型、对象指针和返回值都存入了堆栈中占用堆栈的内存,一旦超过堆栈的容量JVM即抛出错误
例如:
	类里面调用自己的main方法,参数为new的字符串,执行一段时间即报错,堆栈内存错误。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eStcPbsx-1660051832989)(C:\Users\nilei\AppData\Roaming\Typora\typora-user-images\image-20220807150030791.png)]

18、String、StringBuffer、StringBuilder的区别

String
是一个不可变类,一旦创建,在这个对象内的字符序列即不可更改,直至对象被销毁
string a = 123;
a = 456;
下图为该代码的内存存储空间图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4QlRj9q7-1660051832990)(C:\Users\nilei\AppData\Roaming\Typora\typora-user-images\image-20220807151045370.png)]

根据图片可以看出,给a进行重新赋值时,内存中会重新创建一个实例来进行存储字符序列,原来的实例对象仍然存在,如果没有再次被引用,则会被gc回收
Stringbuilder和StringBuffer
两者都是字符序列可变的字符串,在内存中重新赋值是针对于原来的字符序列,不同的是StringBuffer是线程安全的,他的实现方法是在每个基础方法上添加同步锁,这也意味着效率降低

19、== 和 equals的区别

== 对于基本数据类型比较的是值,对于引用类型比较的是地址
equals:比较的是对象是否相等(在包装类中先进行类型的比较,再进行值的比较)

20、第二三范式的区别
第二范式要求所有的非主键与主键进行直接的关联,不能与主键的某一部分相关。即每一张表只能存一种数据
第三范式在二范式基础上要求所有非主键列之间不存在直接或间接的依赖关系
21、索引的优缺点

优点

​ 提高数据检索的速度,降低io成本

​ 降低对数据进行排序的成本,降低CPU的消耗

缺点

​ 占据磁盘空间

​ 降低更新的速度

22、B数的存储结构

以一棵最大度数(max-degree,指一个节点的子节点个数)为5(5阶)的 b-tree 为例(每个节点最多存储4个key,5个指针)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K7nrC1WL-1660051832991)(https://dhc.pythonanywhere.com/media/editor/B-Tree结构_20220316163813441163.png)]

动画插入演示地址:https://www.cs.usfca.edu/~galles/visualization/BTree.html

23、B+数存储结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rrcR7Wy0-1660051832991)(https://dhc.pythonanywhere.com/media/editor/B+Tree结构图_20220316170700591277.png)]

演示地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

与 B-Tree 的区别:

  • 所有的数据都会出现在叶子节点
  • 叶子节点形成一个单向链表

MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B+Tree,提高区间访问的性能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ik6r8YyG-1660051832992)(https://dhc.pythonanywhere.com/media/editor/结构图_20220316171730865611.png)]

24、索引相关

索引按结构分为聚集索引和二级索引

​ 存在主键则主键为聚集索引,无主键则第一个UNIQUE键为聚焦索引

二级索引叶子节点存储的数据为聚集索引的id值,聚焦索引的叶子节点存储的是指定行的所有数据

二级索引查询的过程

​ 在二级索引中查询出相应的id值,再往聚焦索引中查询对应的列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFjylK3I-1660051832993)(https://dhc.pythonanywhere.com/media/editor/原理图_20220318194454880073.png)]

反思:对于mysql数据库方面的一些细节操作、索引
对于JVM、Http、Tcp方面
Java基础(集合 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值