第一章 Java基础

简介: 第一章 Java基础

1、基础语法与面向对象
1.1 重载与重写的区别
● 重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
● 重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
● 重载在编译阶段,由编译器根据传递给方法的参数来区分方法,例如
● 而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法,例如
● 有没有发生重写,可以使用 @Override 来检查
MyObject obj = ...
obj.test(123); // 应该是调用 test(int x) 这个方法
obj.test("abc"); // 应该是调用 test(String x) 这个方法
Super obj = ...
obj.test(); // 到底是调用父类,还是子类的 test 方法,必须检查引用对象的实际类型才能确定
P.S.
● 括号内的说明是为了严谨,自己知道就行,回答时不必说出,这样比较简洁
● 个人觉得,在回答方法重载时,不必去细说什么参数的类型、个数、顺序,就说参数列表不同就完了
● 个人觉得,重点在于点出:重载是编译时由编译器来区分方法,而重写是运行时由解释器来区分方法
● 语法细节,问了再说,不问不必说
○ 重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符
○ 重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常
○ 重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类
1.2 == 与 equals 的区别
● 对于基本类型,== 是比较两边的值是否相同
● 对于引用类型,== 是比较两边的引用地址是否相同,用来判断是否引用着同一对象
● equals 要看实现
○ Object.equals(Object other) 的内部实现就是 ==,即判断当前对象和 other 是否引用着同一对象
○ 比如 String,它的内部实现就是去比较两个字符串中每个字符是否相同,比较的是内容
○ 比如 ArrayList,它的内部实现就是去比较两个集合中每个元素是否 equals,比较的也是内容

1.3 String,StringBuilder 和 StringBuffer 的区别
● 它们都可以用来表示字符串对象
● String 表示的字符串是不可变的,而后两者表示的字符串是内容可变的(可以增、删、改字符串里的内容)
● StringBuilder 不是线程安全的,StringBuffer 是线程安全的,而 String 也算是线程安全的
适用场景
● 大部分场景下使用 String 就足够了
● 如果有大量字符串拼接的需求,建议用后两者,此时
○ 此字符串对象需要被多线程同时访问,用 StringBuffer 保证安全
○ 此字符串对象只在线程内被使用,用 StringBuilder 足够了
另外针对 String 类是 final 修饰会提一些问题,把握下面几点
● 本质是因为 String 要设计成不可变的,final 只是条件之一
● 不可变的好处有很多:线程安全、可以缓存等

1.4 说说 Java 中的异常

异常的重要继承关系如图所示,其中
● 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

相关文章
|
4月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
470 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
4月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
652 0
|
4月前
|
Java 数据格式 微服务
SpringBoot使用汇总
SpringBoot使用汇总
104 0
SpringBoot使用汇总
|
4月前
|
敏捷开发 Dubbo Java
需求开发人日评估
敏捷开发中,工时评估是关键环节,常用“人日”衡量任务工作量。本文介绍人日概念及评估方法,涵盖开发、自测、联调、测试、发布各阶段周期参考,并提供常见需求的人日示例,助力团队更科学地制定计划。
196 0
|
4月前
|
JSON Java 数据库
第08课:Spring Boot中的全局异常处理
第08课:Spring Boot中的全局异常处理
585 0
|
4月前
|
存储 算法 安全
第一章 Java基础
第一章 Java基础
|
4月前
|
缓存 Java 数据库
第五章 Spring框架
第五章 Spring框架
|
4月前
|
安全 Java Linux
第一章 Java基础
第一章 Java基础
|
4月前
|
缓存 安全 Java
第五章 Spring框架
第五章 Spring框架
|
4月前
|
机器学习/深度学习 搜索推荐 算法
第二章 基础算法
第二章 基础算法
下一篇
开通oss服务