当前位置:网站首页 > Java教程 > 正文

java430教程全集



先序: 学习编程语言要先学个轮廓,刚开始只用学核心的部分,一些细节、不常用的内容先放着,现用现查即可;把常用的东西弄熟练了在慢慢补充。

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 表达式包含多个语句,则需要用 包括起来。

示例

  1. 无参数

    
    

    这个 Lambda 表达式实现了 接口,它没有参数,并且打印出 "Hello, World!"。

  2. 一个参数

    
    

    这个 Lambda 表达式实现了 接口,它接收一个参数并打印它。

  3. 多个参数

    
    

    这个 Lambda 表达式实现了 接口,它接受两个参数并返回它们的和。

  4. 多个语句

    
    

    这个 Lambda 表达式实现了 接口,包含多个语句,返回一个字符串。

面向对象编程 (OOP) 是 Java 的核心概念,以下是几个重要的面向对象概念:

7.1 接口

接口是一种抽象类型,定义了类必须实现的方法。接口中的所有方法默认都是抽象的(没有方法体),且所有字段默认都是 。


7.2 抽象类

抽象类是不能被实例化的类,可以包含抽象方法和具体方法。抽象方法必须在子类中实现。


7.3 继承

继承是指一个类(子类)继承另一个类(父类)的属性和方法。子类可以扩展或重写父类的方法。


7.4 多态

多态允许同一个接口在不同的实现中表现出不同的行为。它是通过方法重载和方法重写实现的。



Java 的 I/O 库提供了丰富的类和接口,用于文件操作、数据流操作、网络通信等。

类是 Java 5 引入的,用于从各种输入源读取数据,例如控制台输入、文件、字符串等。它提供了一系列方便的方法来解析基本类型和字符串。

下面给的示例代码都是从控制台获取输入


常用方法:
  • : 读取一整行输入,返回一个字符串。
  • : 读取一行字符串中的第一个,一般用这个读取char类型变量。
  • : 读取一个整数。
  • : 读取一个双精度浮点数。
  • : 读取一个布尔值。
  • : 检查是否有下一个输入。
  • : 检查是否有下一行输入。
  • : 关闭 Scanner。

类用于从字符输入流中读取文本,提供了缓冲功能以提高读取效率。它通常与 一起使用,从标准输入或文件读取数据。

使用 BufferedReader 从终端读取数据
示例代码:

常用方法:
  • : 读取一整行输入,返回一个字符串。
  • : 关闭 BufferedReader。

对比 Scanner 和 BufferedReader

相同点:

  1. 都可以用于从终端、文件等源读取输入。
  2. 都提供了读取整行输入的方法: 和 。

不同点:

  1. 功能

    • 提供了更多解析输入数据的方法,如 , 等,可以直接读取基本类型数据。
    • 主要用于读取字符串,需要手动解析基本类型数据。
  2. 性能

    • 通常性能更高,因为它使用缓冲机制,适合读取大量文本数据。
    • 在方便性上有优势,但性能可能稍逊色。
  3. 使用场景

    • 更适合处理交互式的终端输入,或者需要解析各种基本类型数据的场景。
    • 更适合读取大量文本数据,或者需要更高效的输入操作的场景。

将数据输出到控制台。

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流可以分为两大类:

  1. 字节流(Byte Streams):处理原始字节的数据流,如图片、音频、视频文件。
  2. 字符流(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 的常见用途

  1. 读取文件内容并指定编码:当处理包含特殊字符的文件时,使用可以正确处理字符数据。
  2. 写入文件内容并指定编码:使用可以将字符流以特定编码方式写入文件,确保跨平台的字符一致性。
  3. 网络通信中的字符转换:在网络应用中,传输的数据往往是字节流,但客户端和服务器端可能使用不同的字符编码,因此需要使用转换流来处理。

5. 总结

  • InputStreamReaderOutputStreamWriter 是Java中用于在字节流和字符流之间转换的工具,解决了字节流处理字符时的编码问题。
  • 通过这些转换流,程序可以方便地读取和写入不同字符编码的文本文件,确保文本内容在不同平台之间的兼容性。

  • 上一篇: 30种java教程
  • 下一篇: java教程.pdf
  • 版权声明


    相关文章:

  • 30种java教程2024-10-12 10:50:05
  • java挑战视频教程2024-10-12 10:50:05
  • java 开发教程 mobi2024-10-12 10:50:05
  • java教程434集2024-10-12 10:50:05
  • java教程视频推荐2024-10-12 10:50:05
  • java教程.pdf2024-10-12 10:50:05
  • java爬虫入门教程2024-10-12 10:50:05
  • java卡教程入门2024-10-12 10:50:05
  • java scanner 教程2024-10-12 10:50:05
  • java招聘教程2024-10-12 10:50:05