基础语法与面向对象

简介: classDiagramclass Collection {<<interface>>}class List {<<interface>>}class Set {<<interface>>}class Map {<<interface>>entrySet()*keySet()*values()*}Collection <|-- ListCollection <|-- SetList <|.. ArrayListList <|.. LinkedListList <|.. VectorSet <|.. HashSetMap <|.. HashMapMap <|..

异常的重要继承关系如图所示,其中

Throwable 是其它异常类型的顶层父类

Error 表示无法恢复的错误,例如 OutOfMemoryError 内存溢出、StackOverflowError 栈溢出等

这类异常即使捕捉住,通常也无法让程序恢复正常运行

Exception 表示可恢复的错误,处理方式有两种

一是自己处理,用 catch 语句捕捉后,可以进行一些补救(如记录日志、恢复初始状态等)

二是用 throw 语句将异常继续抛给上一层调用者,由调用者去处理

Exception 有特殊的子类异常 RuntimeException,它与 Exception 的不同之处在于

Exception 被称之为检查异常,意思是必须在语法层面对异常进行处理,要么 try-catch,要么 throws

RuntimeException 和它的子类被称为非检查异常(也可以翻译为字面意思:运行时异常),在语法层面对这类异常并不要求强制处理,不加 try-catch 和 throws 编译时也不会提示错误

常见的非检查异常有

空指针异常

算术异常(例如整数除零)

数组索引越界异常

类型转换异常

...重载是对象的方法之间,它们方法名相同,但方法的参数列表不同

重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同

重载在编译阶段,由编译器根据传递给方法的参数来区分方法,例如

而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法,例如

有没有发生重写,可以使用 @Override 来检查
括号内的说明是为了严谨,自己知道就行,回答时不必说出,这样比较简洁

个人觉得,在回答方法重载时,不必去细说什么参数的类型、个数、顺序,就说参数列表不同就完了

个人觉得,重点在于点出:重载是编译时由编译器来区分方法,而重写是运行时由解释器来区分方法

语法细节,问了再说,不问不必说

重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符

重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常

重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类
1.2 == 与 equals 的区别
异常的重要继承关系如图所示,其中

Throwable 是其它异常类型的顶层父类

Error 表示无法恢复的错误,例如 OutOfMemoryError 内存溢出、StackOverflowError 栈溢出等

这类异常即使捕捉住,通常也无法让程序恢复正常运行

Exception 表示可恢复的错误,处理方式有两种

一是自己处理,用 catch 语句捕捉后,可以进行一些补救(如记录日志、恢复初始状态等)

二是用 throw 语句将异常继续抛给上一层调用者,由调用者去处理

Exception 有特殊的子类异常 RuntimeException,它与 Exception 的不同之处在于

Exception 被称之为检查异常,意思是必须在语法层面对异常进行处理,要么 try-catch,要么 throws

RuntimeException 和它的子类被称为非检查异常(也可以翻译为字面意思:运行时异常),在语法层面对这类异常并不要求强制处理,不加 try-catch 和 throws 编译时也不会提示错误

常见的非检查异常有

空指针异常

算术异常(例如整数除零)

数组索引越界异常

类型转换异常

...

2、集合类
2.1 你知道的数据结构有哪些
线性结构

动态数组:相对于普通数组可以扩容

java 中 ArrayList 就属于动态数组

数组的特点是其中元素是连续存储的

链表:由多个节点链在一起

java 中的 LinkedList 就属于链表

链表的特点是其中元素是不连续存储的,每次需要根据当前节点,才能找到相邻节点

栈:符合 First In Last Out(先进后出)规则

java 中的 LinkedList 可以充当栈

它的 push 方法向栈顶添加元素

它的 pop 方法从栈顶移除元素

它的 peek 方法从栈顶获取元素(不移除)

队列:符合 First In First Out(先进先出)规则

java 中 LinkedList 也可以充当队列

它的 offer 方法用来向队列尾部添加元素(入队)

它的 poll 方法用来从队列头部移除元素(出队)
非线性结构

优先级队列:在队列基础上增加了优先级,队列会根据优先级调整元素顺序,保证优先级高的元素先出队

java 中 PriorityQueue 可以作为优先级队列

它底层用大顶堆或小顶堆来实现

它适用于实现排行榜、任务调度等编码

它特别适合于流式数据的处理,利用它能够大大节省内存

Hash 表(哈希表,也叫散列表):由多对 key - value 组成,会根据 key 的 hash 码把它们分散存储在数组当中,其中 key 的 hash 码与数组索引相对应

java 中的 HashMap,Hashtable 都属于哈希表

它特别适用于实现数据的快速查找

红黑树:可以自平衡的二叉查找树,相对于线性结构来说,拥有更好的性能

java 中的 TreeMap 属于红黑树

跳表:多级链表结构,也能达到与红黑树同级的性能,且实现更为简单

java 中的 ConcurrentSkipListMap 用跳表结构实现

redis 中的 SortedSet 也是用跳表实现

B+ 树:可以自平衡的 N 叉查找树

关系型数据库的索引常用 B+ 树实现
P.S.

以上数据结构不必全部掌握,根据自己实际情况,捡熟悉的回答即可

以上仅是这些数据结构的简述,关于它们的详细讲解,请参考黑马《数据结构与算法》课程:

上篇 https://www.bilibili.com/video/BV1Lv4y1e7HL

下篇 https://www.bilibili.com/video/BV1rv4y1H7o6

相关文章
|
1天前
|
存储 Serverless
哈希冲突
哈希冲突可通过优化哈希函数或采用冲突解决策略应对。开放寻址法通过线性、二次探查或双散列寻找空位,但易导致聚集,影响效率;链表法则在冲突位置构建链表,避免抢占,更适应动态数据,是常用方案之一。
|
1天前
|
NoSQL 索引
SSTable 的分层管理设计
SSTable分层管理通过将文件按层级组织,逐层合并,控制每层容量上限,减少多路归并规模,避免全量重叠,提升查询效率与系统性能,是LevelDB高效读写的核心设计。
|
1天前
|
存储 负载均衡 搜索推荐
大规模检索系统
本讲介绍大规模检索系统如何通过分布式技术加速检索。通过索引拆分,将倒排索引分散到多台服务器内存中,减少单机数据规模和磁盘访问,从而提升单次查询效率。结合分发服务器与负载均衡,实现高吞吐、低延迟的分布式检索架构。
|
1天前
|
存储 自然语言处理 分布式计算
索引构建
搜索引擎如何为万亿网页构建索引?通过分治与多路归并,将文档拆分为小集合,在内存中生成倒排索引后写入磁盘,再合并多个有序临时文件,最终生成全局倒排文件。词典可加载至内存或用B+树管理,实现高效检索。该过程类似MapReduce,支持分布式扩展。
|
1天前
|
存储 搜索推荐 索引
跳表法加速倒排索引
跳表、哈希表与位图法可加速倒排索引。跳表通过多层链表实现快速跳转,将归并查找时间降至O(log n);哈希表适用于小集合查大集合,查询可达O(1);位图则利用位运算高效求交集,适合短posting list场景,显著提升检索效率。
|
1天前
|
存储 算法 搜索推荐
数组的检索效率
二分查找通过将有序数组不断折半,每次比较中间值与目标值,缩小搜索范围至一半,实现O(log n)高效检索,显著优于遍历的O(n),适用于大规模有序数据查询。
|
1天前
|
存储 API 索引
数据结构的存储方式
数据结构底层存储只有数组和链表两种,其他如栈、队列、树、图等均为其衍生。数组支持随机访问但扩容困难,链表灵活增删但无法随机访问。所有数据结构的操作本质为“增删查改”,遍历方式分为线性迭代与非线性递归。理解二者差异,是掌握各类高级数据结构的基础。(238字)
|
1天前
|
存储 Java API
数组(顺序存储)基本原理
本章讲解数组的底层原理,区分静态与动态数组。通过静态数组实现动态数组的增删查改,揭示随机访问O(1)的成因与连续内存的利弊,助你理解数据结构本质。
|
1天前
|
存储 缓存 NoSQL
查找对应的 SSTable 文件
通过分层结构与二分查找快速定位SSTable,结合BloomFilter过滤和索引区加速查询。利用table cache与block cache缓存机制,减少磁盘IO,提升检索效率。整个过程高效有序,适用于大规模数据检索场景。(238字)
|
1天前
|
存储 定位技术 索引
空间检索(下)
本文探讨“查找最近的加油站”与“查找附近的人”的本质区别,前者需动态调整查询范围以获取最近K个结果。通过GeoHash编码实现高效空间检索,提出逐步扩大查询范围的策略,并利用其一维排序特性,采用统一索引结构支持多级范围查询,在减少查询次数的同时降低存储开销,提升检索效率。