先序: 学习编程语言要先学个轮廓,刚开始只用学核心的部分,一些细节、不常用的内容先放着,现用现查即可;把常用的东西弄熟练了在慢慢补充。
Java 是一种面向对象的编程语言,由 Sun Microsystems(现在的 Oracle)在 1995 年推出。Java 程序可以在任何支持 Java 虚拟机 (JVM) 的设备上运行。Java 的核心理念是“一次编写,到处运行”。
2.1 Java 程序结构
每个 Java 程序都由类 (class) 和方法 (method) 组成。以下是一个简单的 Java 程序示例:
- :定义一个名为 的公共类。
- :主方法,是程序的入口点。
- :打印一行文本到控制台。
2.2 注释
Java 支持三种类型的注释:
- 单行注释:使用
- 多行注释:使用
- 文档注释:使用
Java 的数据类型分为两大类:基本数据类型 (primitive types) 和引用数据类型 (reference types)。
3.1 基本数据类型
- 整型:, , ,
- 浮点型:,
- 字符型:
- 布尔型:
3.2 引用数据类型
引用数据类型包括类 (class), 接口 (interface), 数组 (array),以及枚举 (enum)。
Java 提供了丰富的运算符,包括:
- 算术运算符:, , , ,
- 赋值运算符:, , , , ,
- 比较运算符:, , , , ,
- 逻辑运算符:, ,
- 位运算符:, , , , , ,
5.1 条件语句
- if 语句:用于条件判断
- switch 语句:用于多分支选择
5.2 循环语句
- for 循环:用于固定次数的循环
- while 循环:用于条件控制的循环
- do-while 循环:至少执行一次的循环
5.3 常用遍历方法
在 Java 中,遍历数组和字符串是常见的操作。下面详细介绍几种常用的遍历方法。
1.1 使用 循环
传统的 循环是遍历数组的常见方法:
这里的 是数组的索引,通过 获取数组元素。
1.2 使用增强型 循环( 循环)
增强型 循环简化了数组的遍历,不需要使用索引:
这种方法直接获取数组中的每个元素,语法简洁。
2.1 使用 循环
字符串可以看作是字符数组,可以用 循环逐个字符地遍历:
方法返回字符串中第 个字符。
2.2 使用增强型 循环( 循环)
虽然增强型 循环不能直接用于 ,但可以将字符串转换为字符数组后进行遍历:
方法将字符串转换为字符数组,然后进行遍历。
2.3 使用
同样地,可以使用 来遍历字符串:
方法返回一个包含字符的 ,需要将 类型转换为 类型。
3.1 使用迭代器()
对于集合类(如 、 等),可以使用 进行遍历:
提供了 和 方法,用于顺序访问集合中的元素。
3.2 使用 方法
Java 8 引入的 方法可以直接用于遍历集合和 :
这种方法语法简洁,尤其适合使用 Lambda 表达式进行处理。
数组是相同数据类型的集合,可以存储固定大小的元素。
Java 的 Lambda 表达式是一种简化代码的功能,主要用于表示匿名函数。它是 Java 8 引入的特性,旨在提供一种更简洁的方式来创建实现了某个接口的对象,特别是对于函数式接口。函数式接口是只包含一个抽象方法的接口。
基本语法:
或者
- parameters: 这是 Lambda 表达式的输入参数,可以省略类型声明。
- ->: 这是 Lambda 运算符,将参数与表达式或语句块分隔开。
- expression: 这是一个单一的表达式,Lambda 表达式将其返回。
- statements: 如果 Lambda 表达式包含多个语句,则需要用 包括起来。
示例
-
无参数
这个 Lambda 表达式实现了 接口,它没有参数,并且打印出 "Hello, World!"。
-
一个参数
这个 Lambda 表达式实现了 接口,它接收一个参数并打印它。
-
多个参数
这个 Lambda 表达式实现了 接口,它接受两个参数并返回它们的和。
-
多个语句
这个 Lambda 表达式实现了 接口,包含多个语句,返回一个字符串。
面向对象编程 (OOP) 是 Java 的核心概念,以下是几个重要的面向对象概念:
7.1 接口
接口是一种抽象类型,定义了类必须实现的方法。接口中的所有方法默认都是抽象的(没有方法体),且所有字段默认都是 。
7.2 抽象类
抽象类是不能被实例化的类,可以包含抽象方法和具体方法。抽象方法必须在子类中实现。
7.3 继承
继承是指一个类(子类)继承另一个类(父类)的属性和方法。子类可以扩展或重写父类的方法。
7.4 多态
多态允许同一个接口在不同的实现中表现出不同的行为。它是通过方法重载和方法重写实现的。
Java 的 I/O 库提供了丰富的类和接口,用于文件操作、数据流操作、网络通信等。
类是 Java 5 引入的,用于从各种输入源读取数据,例如控制台输入、文件、字符串等。它提供了一系列方便的方法来解析基本类型和字符串。
下面给的示例代码都是从控制台获取输入
常用方法:
- : 读取一整行输入,返回一个字符串。
- : 读取一行字符串中的第一个,一般用这个读取char类型变量。
- : 读取一个整数。
- : 读取一个双精度浮点数。
- : 读取一个布尔值。
- : 检查是否有下一个输入。
- : 检查是否有下一行输入。
- : 关闭 Scanner。
类用于从字符输入流中读取文本,提供了缓冲功能以提高读取效率。它通常与 一起使用,从标准输入或文件读取数据。
使用 BufferedReader 从终端读取数据
示例代码:
常用方法:
- : 读取一整行输入,返回一个字符串。
- : 关闭 BufferedReader。
对比 Scanner 和 BufferedReader
相同点:
- 都可以用于从终端、文件等源读取输入。
- 都提供了读取整行输入的方法: 和 。
不同点:
-
功能:
- 提供了更多解析输入数据的方法,如 , 等,可以直接读取基本类型数据。
- 主要用于读取字符串,需要手动解析基本类型数据。
-
性能:
- 通常性能更高,因为它使用缓冲机制,适合读取大量文本数据。
- 在方便性上有优势,但性能可能稍逊色。
-
使用场景:
- 更适合处理交互式的终端输入,或者需要解析各种基本类型数据的场景。
- 更适合读取大量文本数据,或者需要更高效的输入操作的场景。
将数据输出到控制台。
1.
- 示例: 输出:
2.
- 示例:
- 输出:
3.
- 用法:
- 示例: 输出:
- 整数:
- : 十进制整数
- : 十六进制整数
- 浮点数:
- : 浮点数
- : 浮点数,保留两位小数
- 字符串:
- : 字符串
- 字符:
- : 单个字符
- 百分比:
- : 输出百分号
总结
- : 用于输出内容,不换行。
- : 用于输出内容并换行。
- : 用于格式化输出内容。
语句(通常被称为语句)是Java 7引入的一个特性,它简化了资源管理,特别是用于自动关闭实现了接口的资源,如、、等。语句保证在块执行完毕后,即使发生异常,资源也会被自动关闭。
当然!在Java中,语句用于处理异常。异常是程序运行过程中发生的错误或不预期的情况,块允许你捕获和处理这些异常,以避免程序崩溃并提供更好的用户体验。
语句的基本语法如下:
- 块: 包含可能会引发异常的代码。如果块中的代码引发了异常,异常会被块捕获。
- 块: 用于处理异常的代码。是你要捕获的异常类型,是异常对象,可以用来获取异常的详细信息。
在这个示例中,块中的代码试图执行一个除以零的操作,导致异常。块捕获这个异常,并输出错误消息。
你可以有多个块来处理不同类型的异常:
在这个示例中,异常被单独捕获,而其他任何类型的异常都可以被通用的捕获。
块用于执行清理代码,无论是否发生异常,它都会执行。通常用于关闭文件、释放资源等操作。
在这个示例中,无论块中是否发生异常,块中的代码都会执行。
Java 7引入了多重异常捕获(多异常捕获),你可以在一个块中捕获多种异常类型,并用分隔它们:
在块中,你可以选择重新抛出异常,以便在更高的层次处理它:
在这个示例中,异常在块中被捕获并重新抛出,允许调用方法的代码进一步处理异常。
语句在块执行完毕后,会自动调用每个资源的方法。即使在块中发生了异常,资源的方法也会被调用。因此,你不需要在块中显式地关闭资源,这样可以减少代码重复并提高代码的可读性。
语句的基本语法如下:
- : 实现了或接口的资源类型。
- : 在块中使用的资源对象。
- 块: 包含使用资源的代码。
- 块: 处理在块中可能发生的异常。
示例
使用 关闭文件
以下是一个使用读取文件内容的示例。实现了接口,因此可以被用于语句中:
在这个示例中,会在块执行完成后自动关闭,无需显式调用方法。
多个资源
你也可以在语句中管理多个资源,这些资源会按照声明的顺序关闭:
在这个示例中,和会在块执行完成后自动关闭。
自定义资源
如果你定义了一个自定义类,并希望它在中使用,那么这个类需要实现接口(或者接口)。例如:
在这个示例中,实现了接口,因此可以在中使用,并在块结束后自动关闭。
语句使得资源管理变得更加简单、安全,特别是当涉及到需要手动关闭的资源时。
1. 创建与初始化
- :创建一个空字符串。
- :创建一个新的字符串,内容为指定的 。
2. 字符串操作
- :连接指定字符串到当前字符串末尾。
- :从指定索引开始,返回子字符串。
- :返回从 到 之间的子字符串。
3. 查找与比较
- :返回指定子字符串第一次出现的索引。
- :返回指定子字符串最后一次出现的索引。
- :判断当前字符串是否包含指定字符序列。
- :比较两个字符串的内容是否相等。
- :忽略大小写比较两个字符串的内容是否相等。
- :按字典顺序比较两个字符串。
4. 替换与转换
- :替换字符串中的所有指定字符为新字符。
- :用正则表达式匹配并替换匹配的部分。
- :将字符串转换为小写。
- :将字符串转换为大写.
- :去除字符串首尾的空白字符。
5. 分割与连接
- :根据正则表达式分割字符串,返回字符串数组。
- :使用指定的分隔符连接多个字符序列。
6. 其他
- :返回指定索引处的字符。java的String不可以通过这样的方式访问
- :返回字符串的长度。
- :判断字符串是否为空(长度为0)。
- :将字符串转换为字符数组。
- :判断字符串是否以指定的前缀开始。
- :判断字符串是否以指定的后缀结束。
- :判断字符串是否匹配给定的正则表达式。
是一个有序的集合,可以包含重复元素。常用实现类有 和 。
ArrayList
是一个基于动态数组的数据结构,提供了快速的随机访问能力。它的主要特点是:
- 动态调整数组大小:当元素超过数组容量时, 会自动扩展。
- 访问元素速度快:由于底层是数组,通过索引访问元素的时间复杂度为 O(1)。
- 插入和删除操作相对较慢:插入或删除元素时,可能需要移动数组中的其他元素,时间复杂度为 O(n)。
常用方法:
- : 添加元素到列表末尾。
- : 获取指定索引位置的元素。
- : 替换指定索引位置的元素。
- : 移除指定索引位置的元素。
- : 返回列表中元素的数量。
示例代码:
LinkedList
是一个基于双向链表的数据结构,提供了高效的插入和删除操作。它的主要特点是:
- 链表节点:每个元素都是一个节点,包含元素值以及指向前一个和后一个节点的指针。
- 插入和删除速度快:插入和删除元素时只需调整指针,时间复杂度为 O(1)。
- 访问元素速度慢:由于需要从头开始遍历链表,通过索引访问元素的时间复杂度为 O(n)。
常用方法:
- : 添加元素到列表末尾。
- : 获取指定索引位置的元素。
- : 替换指定索引位置的元素。
- : 移除指定索引位置的元素。
- : 返回列表中元素的数量。
示例代码:
是一个不包含重复元素的集合。常用实现类有 和 。
HashSet
基于哈希表实现,元素没有顺序。它的主要特点是:
- 无序集合:元素没有特定的顺序。
- 不允许重复元素:如果添加重复元素, 会忽略它。
- 高效的插入、删除和查找操作:时间复杂度为 O(1)。
常用方法:
- : 添加元素到集合中。
- : 从集合中移除指定元素。
- : 检查集合是否包含指定元素。
- : 返回集合中元素的数量。
示例代码:
TreeSet
基于红黑树实现,元素是有序的。它的主要特点是:
- 有序集合:元素按照自然顺序或自定义顺序排序。
- 不允许重复元素:如果添加重复元素, 会忽略它。
- 较高的插入、删除和查找操作性能:时间复杂度为 O(log n)。
常用方法:
- : 添加元素到集合中。
- : 从集合中移除指定元素。
- : 检查集合是否包含指定元素。
- : 返回集合中元素的数量。
示例代码:
是一个键值对的集合,每个键最多只能关联一个值。常用实现类有 和 。
HashMap
基于哈希表实现,键值对没有顺序。它的主要特点是:
- 无序集合:键值对没有特定的顺序。
- 不允许重复键:如果添加重复键, 会覆盖旧值。
- 高效的插入、删除和查找操作:时间复杂度为 O(1)。
常用方法:
- : 添加键值对到映射中。
- : 获取指定键的值。
- : 从映射中移除指定键值对。
- : 检查映射是否包含指定键。
- : 返回映射中键值对的数量。
示例代码:
TreeMap
基于红黑树实现,键值对是有序的。它的主要特点是:
- 有序集合:键值对按照键的自然顺序或自定义顺序排序。
- 不允许重复键:如果添加重复键, 会覆盖旧值。
- 较高的插入、删除和查找操作性能:时间复杂度为 O(log n)。
常用方法:
- : 添加键值对到映射中。
- : 获取指定键的值。
- : 从映射中移除指定键值对。
- : 检查映射是否包含指定键。
- : 返回映射中键值对的数量。
示例代码:
是一个先进先出的集合,常用实现类有 和 。
LinkedList
实现了 接口,提供了基于链表的队列实现。它的主要特点是:
- 双向链表:可以作为队列(FIFO)和双端队列(Deque)使用。
- 高效的插入和删除操作:时间复杂度为 O(1)。
常用方法:
- : 将指定元素插入此队列的末尾。
- : 将指定元素插入此队列的末尾,如果成功则返回 ,如果队列已满则返回 (一般不检查队列是否满)。
- : 检索并移除此队列的头部元素。
- : 检索并移除此队列的头部元素,如果此队列为空,则返回 。
- : 检索但不移除此队列的头部元素。
- : 检索但不移除此队列的头部元素,如果此队列为空,则返回 。
示例代码:
PriorityQueue
是一个基于优先级堆(最小堆或最大堆)的队列,元素按自然顺序或自定义顺序排序。它的主要特点是:
- 无界优先级队列:元素按照优先级排序,不一定是先进先出(FIFO)。
- 默认最小堆:自然顺序为最小堆,可自定义比较器实现最大堆。
- 高效的插入和删除操作:时间复杂度为 O(log n)。
常用方法与 类似:
- : 将指定元素插入此队列。
- : 将指定元素插入此队列。
- : 检索并移除此队列的头部元素。
- : 检索并移除此队列的头部元素,如果此队列为空,则返回 。
- : 检索但不移除此队列的头部元素。
- : 检索但不移除此队列的头部元素,如果此队列为空,则返回 。
示例代码:
当然可以!让我们详细探讨一下Java集合框架的和两个主要组件。
是Java 8引入的一个新特性,它提供了一种功能性编程风格来处理集合数据。并不存储数据,而是对数据进行操作的工具。
1. 从 Collection 创建 Stream
-
List: 使用方法创建。
-
Set: 使用方法创建。
-
Queue: 使用方法创建。
2. 从数组创建 Stream
-
数组: 使用方法将数组转换为。
3. 生成特定类型的 Stream
-
: 创建包含指定元素的。
4. 创建字符流
-
: 从文件中创建字符流。
支持多种操作,可以分为中间操作和终端操作:
-
中间操作: 返回一个新的,可以链式调用,常用的中间操作有:
- : 过滤流中的元素。
- : 将元素映射成另一种形式。
- : 对流进行排序。
- : 去重操作。
-
终端操作: 触发对的处理并生成结果,常用的终端操作有:
- : 遍历每个元素并执行操作。
- : 将收集到集合中。
- : 对流中的元素进行归约操作。
- : 计算流中元素的数量。
在 Java 的 API 中, 方法默认按照升序对流中的元素进行排序。你可以通过使用 进行自定义排序来控制排序顺序,包括降序排序。
方法在没有参数的情况下会使用元素的自然顺序(如果元素实现了 接口),即默认进行升序排序。例如:
降序排序
要实现降序排序,你可以使用 的 方法,或者使用 的 方法。以下是如何进行降序排序的示例:
使用
自定义排序(示例)
如果你需要对复杂对象进行降序排序,可以使用自定义的 :
总结
- 默认排序: 默认按照升序对元素进行排序。
- 降序排序:使用 或 的 方法进行降序排序。
- 自定义排序:可以结合使用 的不同方法来实现更复杂的排序需求,例如同时按多个字段排序。
4. Stream 示例
Java中,输入输出流(I/O流)是处理数据输入和输出的关键机制。它们用于读取和写入数据,支持处理字节流和字符流。Java I/O流可以分为两大类:
- 字节流(Byte Streams):处理原始字节的数据流,如图片、音频、视频文件。
- 字符流(Character Streams):专门处理字符数据,如文本文件。
Java的输入输出流主要位于包中。下面详细讲解如何使用Java的I/O流进行文件、控制台、网络等输入输出操作。
字节流是以字节为单位进行数据的输入和输出。Java通过两个顶层抽象类来处理字节流:
- :所有字节输入流的基类。
- :所有字节输出流的基类。
1.1 InputStream
是读取字节数据的基础类,常用子类包括:
- :从文件中读取字节数据。
- :从内存中的字节数组读取数据。
- :提供缓冲功能,提高读取效率。
1.1.1 FileInputStream读取文件
用于从文件中读取字节数据。以下是读取文件的示例:
1.1.2 BufferedInputStream缓冲读取
提供缓冲区,减少对文件的访问次数,提高读取效率。
1.2 OutputStream
用于写入字节数据,常用子类包括:
- :向文件中写入字节数据。
- :将数据写入内存中的字节数组。
- :提供缓冲功能,提高写入效率。
1.2.1 FileOutputStream写入文件
用于向文件中写入字节数据。如果文件不存在,它会创建文件。
1.2.2 BufferedOutputStream缓冲写入
提供缓冲区,可以提高写入效率。
字符流用于处理字符数据,专门设计为以字符为单位进行输入输出。Java通过两个顶层抽象类来处理字符流:
- :所有字符输入流的基类。
- :所有字符输出流的基类。
2.1 Reader
类用于读取字符数据,常用子类包括:
- :从文件中读取字符。
- :提供缓冲功能,并且提供按行读取的能力。
2.1.1 FileReader读取字符文件
用于从文件中读取字符数据。
2.1.2 BufferedReader按行读取
不仅提供缓冲功能,还提供方法用于按行读取文件内容。
2.2 Writer
类用于写入字符数据,常用子类包括:
- :向文件中写入字符数据。
- :提供缓冲功能,并且提供按行写入的能力。
2.2.1 FileWriter写入字符文件
用于向文件中写入字符数据。
2.2.2 BufferedWriter缓冲写入
不仅提供缓冲区,还提供方法,用于写入换行符。
转换流用于在字节流和字符流之间进行转换,主要用于处理不同的字符编码。Java提供了两个主要的转换流类:
- InputStreamReader:将字节流转换为字符流(从输入字节流读取数据,并将其转换为字符)。
- OutputStreamWriter:将字符流转换为字节流(将字符数据写出时转换为字节)。
是一个将字节流转换为字符流的桥梁。它读取来自字节流的数据,并根据指定的字符编码将其转换为字符数据。
InputStreamReader的构造方法
示例:使用InputStreamReader
以下是使用从字节流中读取字符的示例:
- 工作原理:以字节的形式读取文件内容,而将字节数据转换为字符数据。
是将字符流转换为字节流的桥梁。它接收字符数据,并根据指定的字符编码将其转换为字节流输出。
OutputStreamWriter的构造方法
示例:使用OutputStreamWriter
以下是使用将字符数据写入字节流的示例:
- 工作原理:接收字符数据,并根据UTF-8编码转换为字节,最后通过将其写入文件中。
3. 字符编码
当处理国际化字符或不同语言的文本时,指定正确的字符编码非常重要。例如,UTF-8是一种常用的字符编码,可以表示世界上大多数语言中的字符。使用转换流可以确保在不同字符编码之间进行正确的转换。
常见字符编码
- UTF-8:可变长度字符编码,适合国际化。
- ISO-8859-1:一种单字节编码,仅能表示西欧语言的字符。
- GBK:中文字符编码。
4. InputStreamReader 和 OutputStreamWriter 的常见用途
- 读取文件内容并指定编码:当处理包含特殊字符的文件时,使用可以正确处理字符数据。
- 写入文件内容并指定编码:使用可以将字符流以特定编码方式写入文件,确保跨平台的字符一致性。
- 网络通信中的字符转换:在网络应用中,传输的数据往往是字节流,但客户端和服务器端可能使用不同的字符编码,因此需要使用转换流来处理。
5. 总结
- InputStreamReader 和 OutputStreamWriter 是Java中用于在字节流和字符流之间转换的工具,解决了字节流处理字符时的编码问题。
- 通过这些转换流,程序可以方便地读取和写入不同字符编码的文本文件,确保文本内容在不同平台之间的兼容性。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/18217.html