计算机基础(Java,Python,数据库)高频面试题总结 持续更新中… … Java篇 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。 2. == 和 equals 的区别是什么? ==:对于基本数据类型,==比较的是值,对于引用数据类型,比较的是引用。 equals:本质上是==,但很多引用类型对这个函数进行了重写,变成了值比较。 3. Java数据类型 基本数据类型:数值型,字符型,布尔型 引用数据类型:类(如String,Date,Integer Long Boolean Byte),接口(如list,map,set),数组
4. final 在 java 中有什么作用? final 修饰的类叫最终类,该类不能被继承。final 修饰的方法不能被重写。final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。 5. java 中操作字符串都有哪些类?它们之间有什么区别? 操作字符串的类有:String、StringBuffer、StringBuilder。 String 和 StringBuffer、StringBuilder 的区别:String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。 StringBuffer 和 StringBuilder 最大的区别在于:StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。 线程安全:String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。 对于三者使用的总结:操作少量的数据: 适用 String单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer 6. 接口和抽象类的区别是什么(常问)? 抽象类:包含抽象方法的类→抽象类(反之不成立,也就是说抽象类不一定包含抽象方法,可以不包含,也可以包含非抽象方法)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。抽象类不能用来创建对象;如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。接口接口中可以含有变量和方法。变量会被隐式地指定为public static final变量(并且只能是public static final变量),而方法会被隐式地指定为public abstract方法且只能是public abstract方法是对行为的抽象两者的区别 语法层面的区别:抽象类可以提供成员方法的实现细节(可以包含非抽象方法),而接口中只能存在public abstract 方法;抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;一个类只能继承一个抽象类,而一个类却可以实现多个接口。 设计层面的区别:抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。(也就是说,抽象类可以添加新方法,不改变子类,而接口改动,所有实现了这个接口的类都要改动)深入理解Java的接口和抽象类 – Matrix海子 – 博客园 7. 重写和重载区别 先了解下方法签名的定义,方法签名指的是方法名+参数列表 重载要求方法签名必须不同。重写则要求方法签名必须相同。 重载:发生在同一个类中方法名必须相同,参数类型不同、个数不同、顺序不同方法返回值和访问修饰符可以不同 重写:发生在父类和子类的继承关系中方法名、参数列表必须相同返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类父类方法访问修饰符为 private 则子类就不能重写该方法 8. Java面向对象三大特性 封装:对象属性私有化,同时提供一些方法,可以被外界用来访问内部属性。隐藏实现细节,代码模块化。 继承:使用已存在的类的定义作为基础建立新类,可以添加属性和方法。代码重用,节省开发时间。 多态:Java中有两种形式可以实现多态,继承(多个子类重写父类方法)和接口(实现接口,覆盖方法)接口重用。 9. 线程和进程 进程是操作系统分配资源的最小单位,线程是程序执行(CPU调度)最小单位 一个进程可以包含多个线程,这些线程共享进程的资源。 10. Java集合概览 https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/images/Java-Collections.jpeg
为什么这么糊。。。
11. 说说 List,Set,Map 三者的区别? list(对付顺序的好帮手):存储的素有序,可重复 set(注重独一无二):存储的素无序,不可重复 map(用key来搜索的专家):使用键值对(key-value)存储,key是无序,不可重复的,value是无序可重复的。每个键最多映射到一个值。 12. Array和ArrayList区别 Array:容量固定但高效。 ArrayList:容量可动态变化,但效率低。 13. HashMap 和 HashSet 区别
14. HashMap 和 HashTable 的区别 线程安全:HashMap是非synchronized,而Hashtable是synchronized,HashMap 是非线程安全的,HashTable 是线程安全的。 效率:HashMap效率更高 对null key和null value的支持:HashMap可以存储null的key和值,HashTable 不允许有 null 键和 null 值。 初始容量大小和每次扩充容量大小的不同 : ① 创建时如果不指定容量初始值,Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小(HashMap 中的方法保证,下面给出了源代码)。也就是说 HashMap 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。 15. 解决Hash冲突的方法 开放定址法(再散列法):对冲突的key值再次hash。再哈希法:同时构建多个哈希函数,冲突的key使用其他函数拉链法(HashMap的冲突处理方式):将所有哈希值冲突的素构成一个单链表(同义词链)建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的素,一律填入溢出表。 16. 什么是死锁 两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,这些永远在互相等待的进程称为死锁进程。 Python篇 1. Python的垃圾回收机制(garbage collection) 引用计数/标记-清除/分代回收 引用计数:在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数器(ob_refcnt)。引用计数为0时就会被删除。 标记-清除:为了解决循环引用的问题。 分代回收:基于一个简单的思想(存在越久的对象越不可能是垃圾)。这样在执行标记-清除算法时可以有效减小遍历的对象数,从而提高垃圾回收的速度。 2. Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)(常问) 赋值:复制引用,没有开辟新的内存空间浅拷贝: 形式:切片操作,工厂函数,copy模块中的copy函数。 如: lst = [1,2,3,[4,5]] 切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst] 工厂函数:lst1 = list(lst) copy函数:lst1 = copy.copy(lst) 分为两种情况:(可以理解为只拷贝了嵌套结构中的一层) 不可变对象的浅拷贝:等同于赋值 可变对象的浅拷贝包含复杂子对象:改变复杂子对象的值会影响复制后的值不包含复杂子对象:改变原始值对复制后的值无影响深拷贝: 形式:copy模块中的deepcopy函数 划分一块新的内存空间。拷贝了对象的所有素,包括多层嵌套的素。深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。 3. *args 和 kwargs的用法 定义函数: 可变位置参数(非键值对,可变数量参数)。 多个关键词参数(键值对,可变数量参数)。 如果你想在函数里同时使用所有这三种参数, 顺序是这样的: some_func(fargs, *args, kwargs) 小结: 一个星(*):表示接收的参数作为组来处理 两个星():表示接收的参数作为字典来处理 *args表示任何多个无名参数,它是一个tuple;kwargs表示关键字参数,它是一个dict。并且同时使用*args和kwargs时,必须*args参数列要在kwargs前,像foo(a=1, b=’2′, c=3, a’, 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg” 4. Python数据类型
MySQL篇 1. MySQL的体系结构图 Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的
2. 深入了解MySQL索引 对索引的理解 索引是一个排序的列表,列表中存储着索引的值,和包含了这个值的记录所在的物理地址。 索引优缺点优点:提高查找效率,加快分组和排序缺点:索引本身也是表,会占用空间;索引的创建和维护需要时间成本;构建索引会降低数据库修改的效率,因为在修改数据库时也要修改索引表 索引分类 1)从存储结构上来分(常问)Btree索引(B+tree,B-tree)哈希索引full-index 全文索引RTree 2)从应用层次上来分普通索引:一个索引只包含单个列,一张表可以有多个单列索引唯一索引:索引列的值必须唯一,允许有空值复合索引:一个索引包含多个列 3)从表记录的排列顺序和索引的排列顺序是否一致来分(常问)聚集索引:索引和数据一起存放非聚集索引:索引和数据分开存放使用非聚集索引时需要拿到叶子节点上的主键,再去表中查找想要的数据(回表) 数据库的存储引擎 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。 MySQL提供了多种存储引擎。 常用的有:MyISAM存储引擎(无法处理事务)InnoDB是一个健壮的事务型存储引擎Memory
索引实现原理 1)哈希索引 只有memory(内存)存储引擎支持哈希索引。哈希索引计算索引列的hashCode,在hashCode对应的位置存记录的物理地址。 因为使用散列算法,所以访问速度快 因为一个值只能对应一个hashCode,且是散列的分布形式,因此哈希索引不支持范围查找和排序。 2)全文索引 仅可用于MyISAM和InnoDB。在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。 3)BTree索引和B+Tree索引(重点) BTree是平衡搜索多叉树,下图是一个三阶的B-Tree
B+Tree索引:是B-Tree的变种B+Tree中的非叶子结点不存储数据,只存储键值;B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址;B+Tree的每个非叶子节点由n个键值key和n个指针point组成;
B+Tree对比B-Tree的优点: 1、磁盘读写代价更低 2、查询速度更稳定 带顺序索引的B+TREE 添加了指向相邻叶节点的指针,形成了带有顺序访问指针的B+Tree。提高区间查找的效率。
索引类型梳理(重点) (1)主键索引和二级索引 主键索引:数据表的主键列使用的就是主键索引。 二级索引(辅助索引):二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。唯一索引,普通索引,前缀索引,全文索引等索引属于二级索引。
(2)聚集索引和非聚集索引 MySQL中最常见的两种存储引擎分别是MyISAM(非聚集)和InnoDB(聚集),分别实现了非聚集索引和聚集索引。 聚集索引即索引结构和数据一起存放的索引。主键索引属于聚集索引。对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。 优缺点:优点(查询速度快),缺点(依赖于有序数据,更新代价大) 非聚集索引即索引结构和数据分开存放的索引。二级索引属于非聚集索引。MYISAM引擎, 该表的索引(B+树)的每个叶子非叶子节点存储索引, 叶子节点存储索引和索引对应数据的指针。 非聚集索引的叶子节点并不一定存放数据的指针, 因为二级索引的叶子节点就存放的是主键,根据主键再回表查数据。 优缺点:优点(更新代价小),缺点(依赖于有序数据,可能需要二次查询,即回表)
3. 数据库事务的四大特性:ACID (1)原子性(Atomicity)事务包含的所有操作要么全部成功,要么全部失败回滚。 (2)一致性(Consistency)事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 (3)隔离性(Isolation)多个并发事务之间要相互隔离。 (4)持久性(Durability)一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 4. 数据库隔离级别 并行事务的四大问题: (1)更新丢失:和别的事务读到相同的东西,各自写,自己的写被覆盖了。(谁写的快谁的更新就丢失了) (2)脏读:读到别的事务未提交的数据。(万一回滚,数据就是脏的无效的了) (3)不可重复读:两次读之间有别的事务修改。# 不可重复读针对单行,更新操作 (4)幻读:两次读之间有别的事务增删。# 可重复读针对多行,删减操作 对应隔离级别 (1)READ UNCOMMITTED:读未提交,不处理。 (2)READ COMMITTED:读已提交,只读提交的数据,无脏读; (3)REPEATABLE READ:可重复读,加行锁,两次读之间不会有修改,无脏读无重复读;(MySQL默认隔离级别) (4)SERIALIZABLE: 串行化,加表锁,全部串行,无所有问题。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/86405.html