diff --git a/docs/109.md b/docs/109.md index 1628f74317ba052a6cf6f15dc891e6fee3c36454..c338c965c7227d84a79a184614b5f0a65894f6cf 100644 --- a/docs/109.md +++ b/docs/109.md @@ -4,11 +4,11 @@ 本教程介绍了 JavaBeans 的基础知识,其组件以及 JavaBeans 的帮助方式。 -## **简介** +## 简介 软件组件模型中最重要的主题之一是可重用性。 在“一次开发,在任何地方运行和重用它们”的主题下编写自包含软件是最需要和赞赏的。 因此,借助于 JavaBeans,可重用性被添加到 Java 编程语言中。 -## **什么是 JavaBean?** +## 什么是 JavaBean? JavaBeans 由 Sun Microsystem 于 1996 年引入,其定义为 @@ -24,7 +24,7 @@ JavaBeans 由 Sun Microsystem 于 1996 年引入,其定义为 JavaBean -## **JavaBeans 的组件** +## JavaBeans 的组件 包含 bean 定义的类称为 JavaBeans 组件。 这些类遵循某些设计约定。 它包括属性,事件,方法和持久性。 有两种类型的组件,基于 GUI 和非基于 GUI。 例如,JButton 是组件的示例,而不是类。 @@ -42,7 +42,7 @@ JavaBean 没有参数构造函数。 JavaBean 组件 -## **JavaBeans 属性** +## JavaBeans 属性 对象的用户可以访问 JavaBean 属性,它可以被读取,写入,只读或仅写入。 我们可以借助在 bean 的实现类中编写的 getPropertyName()方法(也称为 getter 或 accessor)和 setPropertyName()方法(即 setter)来访问这些 JavaBeans 属性。 @@ -50,7 +50,7 @@ JavaBean 组件 **SetPropertyName():**例如,如果属性名称为标题,则您的方法名称将为 setTitle()。 -## **JavaBeans 的示例** +## JavaBeans 的示例 在编写 JavaBean 之前,这里有一些基本规则。 JavaBean 应该是公共的,应该没有参数默认构造函数,并且应该实现可序列化的接口。 在编写 JavaBean 之前,请牢记这些基本规则。 @@ -100,7 +100,7 @@ public class BankAccount implements java.io.Serializable { ``` -## **JavaBeans 的优点** +## JavaBeans 的优点 以下是 JavaBeans 的一些优点: diff --git a/docs/160.md b/docs/160.md index 2db5256586bd408ff5be84fb358d2268a2e52472..f68fef802ea6c3ffbcf902e57a87fc68189a0f62 100644 --- a/docs/160.md +++ b/docs/160.md @@ -4,7 +4,7 @@ 本教程说明并指导您如何在 Windows 中安装和配置 Android Studio。 -## **Android Studio** +## Android Studio 众所周知,Android 世界正日趋增长。 数十亿个 Android 应用已在 Google Play 商店中发布。 因此,需要时间来学习 Android 开发的一些基础知识。 Android Studio 是用于 Android 应用程序开发的 IDE(集成开发环境)。 @@ -17,11 +17,11 @@ * 在不构建新 APK 的情况下运行您的应用。 * 提供虚拟设备来运行和测试您的应用 -## **安装** +## 安装 请按照以下步骤完整安装和配置 Android Studio。 -## **步骤 1)下载 Android Studio** +## 步骤 1)下载 Android Studio 您可以从[链接](https://developer.android.com/studio/index.html)下载 Android Studio,或转到 [developer.android.com](https://developer.android.com) 主页并搜索下载内容。 选择适用于 Windows,Mac 或 Linux 的适当平台。 以下是 Windows 操作系统的先决条件。 @@ -36,7 +36,7 @@ **注意:**如果您没有 Android SDK,则可以通过 Android Studio 下载。 转到下载页面的末尾,找到 [android-studio-bundle-162.4069837-windows.exe](https://dl.google.com/dl/android/studio/install/2.3.3.0/android-studio-bundle-162.4069837-windows.exe) ,其中还包含 SDK。 -## **步骤 2)运行.exe 文件** +## 步骤 2)运行.exe 文件 现在,下一步是启动您刚刚下载的.exe 文件。 出现以下屏幕 @@ -84,7 +84,7 @@ 步骤 7:Android Studio 启动画面 -## **步骤 3)配置 Android Studio** +## 步骤 3)配置 Android Studio 首次运行时,系统会要求您提供 Android Studio 设置。 diff --git a/docs/161.md b/docs/161.md index c81798a8b4311625781d556915a47db30e33e807..086fa4df2624b08bac35b2c61d43696a4e687ae6 100644 --- a/docs/161.md +++ b/docs/161.md @@ -4,11 +4,11 @@ 本教程将按照分步说明说明如何将您的 Android 设备连接到 Android Studio。 -## **解释** +## 解释 在 Android Studio 中创建应用非常容易。 那么运行和测试呢? Android Studio 为我们提供了一种方法,可以非常轻松,快速地在手机 Android 设备上运行应用程序。 如果您没有 Android 设备,请放心,Android Studio 会为您提供一个模拟器,它会创建虚拟 Android 设备,因此您无需真正拥有 Android 智能手机就可以运行和发送应用程序文本。 这次,我将向您展示如何将 Android 设备连接到 Android Studio。 因为没有替代品可以在硬件设备上运行您的应用程序。 -## **前提条件** +## 前提条件 以下是一些先决条件: @@ -16,7 +16,7 @@ * USB 电缆 * Android 设备 -## **步骤 1)启用 USB 调试** +## 步骤 1)启用 USB 调试 第一步是在 Android 设备上启用 USB 调试。 为此,请按照下列步骤操作 @@ -45,13 +45,13 @@ 步骤 4:USB 侦错 -## **步骤 2:安装 USB 驱动程序** +## 步骤 2:安装 USB 驱动程序 下一步是为您的 Android 设备安装 USB 驱动程序。 为此,请遵循设备制造商的说明。 例如,我正在使用华为的 Android 智能手机,因此我只是从他们的官方网站下载了华为 USB 驱动程序。 如果您的设备使用 Google USB 驱动程序,则可以从此链接 [http://developer.android.com/sdk/win-usb.html](http://developer.android.com/sdk/win-usb.html) 下载。 安装后,您需要对其进行更新。 确保您的设备通过 USB 电缆连接。 转到**控制面板= >设备管理器**,然后找到并右键单击您的 Android 设备,然后单击**更新驱动程序软件。** **注意:**确保通过 USB 电缆连接时,Android 设备未处于睡眠状态。 -## **步骤 3:运行您的应用** +## 步骤 3:运行您的应用 不,您可以运行您的 Android 应用。 右键单击该应用程序,然后单击**运行**。 或者只需从下面显示的工具栏菜单中选择运行选项。 diff --git a/docs/162.md b/docs/162.md index ca7af24b512fc320ae5eb3492a9f2c80ca804703..c1058df5592167852f2b88d0d057e8b59a7a22c6 100644 --- a/docs/162.md +++ b/docs/162.md @@ -4,7 +4,7 @@ 本教程将教您一些 Android 基础知识,因此您可以轻松制作自己的第一个 Android 应用。 -## **Android 简介** +## Android 简介 Android 是适用于多种不同设备的操作系统,例如平板电脑和智能手机。 它基于 Google 维护的 Linux。 统计数据显示,目前全球每月有 20 亿台活跃的 Android 设备。 Android 是功能强大的操作系统,具有许多不同的功能。 这几个 @@ -20,7 +20,7 @@ Android 是适用于多种不同设备的操作系统,例如平板电脑和智 让我们谈谈内部工作,如何创建应用屏幕。 -## **Android 活动** +## Android 活动 活动类是 Android 的重要组成部分。 活动就像带有用户界面的单个屏幕一样,就像 Java 的[框架一样。 我们知道任何用 Java 或 C ++编写的可执行程序都具有 main()方法,并且程序是通过 main()方法启动的。 代替主要方法,Android 具有不同的活动概念。](https://javatutorial.net/swing-jframe-basics-create-jframe) @@ -43,7 +43,7 @@ public class MainActivity extends AppCompatActivity { ``` -## **Android 意向** +## Android 意向 目的使我们能够在组件之间进行通信。 意图就像一条消息,用于从另一个组件请求操作。 它用于不同应用程序中的代码之间的运行时绑定。 @@ -70,7 +70,7 @@ Android 意图 转到我们的 [Android Intent 示例](https://javatutorial.net/android-intent-example),以了解有关 Android Intent 的更多信息 -## **Android 服务** +## Android 服务 服务是没有用户界面的组件,可以执行长时间运行的操作。 Android 中有两种服务。 @@ -80,7 +80,7 @@ Android 意图 查看我们的 [Android 服务示例](https://javatutorial.net/android-service-example),以了解有关 Android 服务的更多信息 -## **Android 布局** +## Android 布局 布局是视觉组件在框架中的排列。 Android 支持许多不同的布局,例如线性布局,相对布局和 Web 视图是最常用的布局。 您还可以混合布局以将所需的设计应用于 Android 应用程序。 diff --git a/docs/163.md b/docs/163.md index 681f785d3fda6b4c125d3b24c23b7cbe7e831dc9..b7dc9472d5f39fd11d3b6409fcc95ea3a6d90fb4 100644 --- a/docs/163.md +++ b/docs/163.md @@ -6,7 +6,7 @@ 在 Android Studio 中创建应用非常容易。 在开始实际编程之前,请确保已正确设置环境和 Android SDK 路径。 您可以按照本教程中的[中的步骤进行操作。 让我们从头开始。](https://javatutorial.net/install-configure-android-studio) -## **创建 Android 项目** +## 创建 Android 项目 创建一个新项目。 @@ -42,7 +42,7 @@ 项目画面 -## **项目的层次结构** +## 项目的层次结构 首先,探索您应用的层次结构 @@ -58,7 +58,7 @@ 现在开始编码。 -## **创建设计** +## 创建设计 打开布局文件,然后单击**设计**视图。 @@ -148,7 +148,7 @@ ## **用 Java 类**编写代码 -现在打开 MainActivity.java 并将操作侦听器添加到您的按钮。 +现在打开 MainActivity.java 并将操作监听器添加到您的按钮。 这是添加动作监听器的方法。 diff --git a/docs/164.md b/docs/164.md index d628405401703f0f702de91dc274c7e137f41584..44142482f83fb121fc000cc69415341b16ceb877 100644 --- a/docs/164.md +++ b/docs/164.md @@ -4,11 +4,11 @@ 在上一教程中,您学习了[如何创建一个简单的 Android 应用](https://javatutorial.net/creating-simple-android-app)。 本教程将说明如何在 Android Studio 中运行和调试 Android 应用程序。 -## **解释** +## 解释 Android Studio 具有自己的默认运行/调试配置,足以满足我们的需求。 但是,如果要创建自己的配置或修改默认配置,也可以使用它。 当您在硬件设备上运行应用程序时,Android Studio 会为您的应用程序创建一个 APK 文件,然后在您的设备上安装并运行。 它为您处理大部分细节。 在 Android Studio 中运行和调试应用非常容易。 开始吧。 -## **运行 Android 应用程序** +## 运行 Android 应用程序 请按照以下步骤运行您的应用程序。 @@ -37,7 +37,7 @@ Android Studio 具有自己的默认运行/调试配置,足以满足我们的 在 Android 设备上运行的应用 -## **调试 Android 应用程序** +## 调试 Android 应用程序 调试是发现错误的过程。AndroidStudio 还提供了一种机制,可以调试在虚拟 Android 设备或硬件 Android 设备上运行的应用。 Android 调试器提供以下功能。 diff --git a/docs/165.md b/docs/165.md index dd05c4a2dca84ecf2d1281cc799716f9fb476de2..c39cf418d08802a0bd336ae0cc41e6f84319a052 100644 --- a/docs/165.md +++ b/docs/165.md @@ -4,11 +4,11 @@ 本教程介绍了如何配置虚拟设备以及如何在 Android 虚拟设备上运行应用程序。 -## **背景** +## 背景 在上一教程中,您已经了解了如何[在硬件 Android 设备上运行和调试 Android 应用](https://javatutorial.net/running-debugging-android-applications)。 如果您没有 Android 硬件设备,则无需购买。 Android Studio 为我们提供了对虚拟 Android 设备的支持。 本教程全部关于 Android 虚拟设备。 -## **Android 虚拟设备** +## Android 虚拟设备 Android SDK 包含 Android 虚拟设备(AVD)或称为移动设备模拟器。 它使您无需使用 Android 硬件设备即可在计算机上开发,测试和运行 Android 应用程序。 多核处理器使其快速,强大且功能丰富。 diff --git a/docs/166.md b/docs/166.md index afe36190a420836ddfc45094c598d97692000639..0c04b98c486be329a65d0911bde327cb0cd0c8f8 100644 --- a/docs/166.md +++ b/docs/166.md @@ -4,11 +4,11 @@ 本教程介绍了什么是 Android 中的活动,活动周期和示例。 -## **Android 活动** +## Android 活动 Activity 是 Android 应用程序开发的基本组成部分之一。 就像带有用户界面的单个屏幕一样。 `ContextThemeWrapper`是 Android 活动的超类。 活动是 Android 应用程序的主要切入点,就像用 Java 或 C ++编写的程序的主要方法一样。 一个活动与用户进行交互,因此它创建了一个放置 UI 元素的窗口。 一个 Android 应用程序可以包含多个活动,这意味着可以相互交互的许多不同屏幕。 -## **活动生命周期** +## 活动生命周期 在 Android 应用程序中,Android 活动具有其自身的生命周期。 活动存储和管理在称为活动堆栈的堆栈中。 新活动位于堆栈顶部并开始运行,而以前的活动则位于堆栈中新活动的下方。 当堆栈中的顶部活动退出时,从下至上的活动将变为活动状态。 @@ -48,7 +48,7 @@ Android 活动生命周期 图中的矩形代表 6 种回调方法。 -## **Android 活动示例** +## Android 活动示例 这是 Android 活动的示例。 打开您的 Android Studio 并创建一个新项目。 新建项目向导将允许您创建一个新的活动。 您可以在“ [创建简单的 Android 应用程序](https://javatutorial.net/creating-simple-android-app)”教程中找到有关如何创建新 Android 项目的更多信息。 diff --git a/docs/167.md b/docs/167.md index 2e6d749438c18ea80d4e83f854351904e8e5e30f..52ad80f75b4e7cd63f5b9a1658f064da1af74987 100644 --- a/docs/167.md +++ b/docs/167.md @@ -4,11 +4,11 @@ 本教程通过示例说明了 Android 的意图,类型和方法。 -## **Android 意向** +## Android 意向 意图是用于向另一个组件请求操作的对象。 目的是一种数据结构,其中包含要执行的操作的抽象描述。 它用于从其他 Android 组件请求功能。 简而言之,意图是做某事的意图。 通过使用意图,我们可以做很多事情,例如从一个活动导航到另一个活动,通过相机应用程序拍照,网络搜索,在地图上搜索位置等等。 这使开发人员可以轻松地重新混合不同的应用程序。 -## **意向类型** +## 意向类型 有两种类型的意图,显式和隐式意图。 @@ -48,7 +48,7 @@ startActivity(intent); Android 联系人 -## **目的方法** +## 目的方法 有用于向活动,服务和广播接收者传达意图的单独机制。 这是几种方法的解释 diff --git a/docs/168.md b/docs/168.md index f8786097860a4b4417c12ddd4ed50fa1fc23e012..156fb01f717aa83692122605d30db2a5af1b9513 100644 --- a/docs/168.md +++ b/docs/168.md @@ -6,11 +6,11 @@ Android 服务与 [Android 活动](https://javatutorial.net/android-activity-example)有很大不同。 这是 Android 应用程序开发的概念。 让我们讨论一下。 -## **Android 服务** +## Android 服务 服务用于实现或执行在我们的应用中运行的后台操作。 它是一个应用程序组件,用于执行长时间运行的重要后台任务,例如播放音乐,下载文件或执行网络事务。 由于服务在后台运行,因此与活动不同,它没有任何用户界面。 它使我们能够在应用程序中启用多任务处理。 尽管应用程序已关闭或服务已完成工作或已明确停止,但服务仍在后台继续运行。 因此,它比不活动的应用程序具有更高的优先级。 您还可以将其设置为与正在运行的前台任务相同的优先级。 让我们讨论一下服务类型。 -## **Android 服务的类型** +## Android 服务的类型 Android 中提供三种不同类型的服务。 diff --git a/docs/169.md b/docs/169.md index ee6722cbf4223404acc3e246bb005bf66a49614d..e2c7885f2a2157277cf393750182b4042d11f93c 100644 --- a/docs/169.md +++ b/docs/169.md @@ -6,7 +6,7 @@ 布局是事物以特定方式进行排列的方式。 Android 还提供了不同的布局,以不同的方式排列不同的组件。 其中一些是线性布局,相对布局,Web 视图布局等。布局对于 UI 应用程序的开发非常重要。 本教程的主要重点是线性布局。 -## **线性布局** +## 线性布局 Android 中的线性布局使我们可以将组件水平排列在单列中或垂直排列在单行中。 垂直或水平方向取决于属性 **android:方向。** 线性布局简单易用,如果窗口的长度超过屏幕的长度,则会创建滚动条。 垂直线性布局每行只有一项。 线性布局具有许多不同的属性,可用于根据需要自定义线性布局。 下图显示了水平和垂直线性布局。 @@ -14,7 +14,7 @@ Android 中的线性布局使我们可以将组件水平排列在单列中或垂 线性布局 -## **线性布局的属性** +## 线性布局的属性 以下是 Android 线性布局的一些属性。 @@ -27,7 +27,7 @@ Android 中的线性布局使我们可以将组件水平排列在单列中或垂 除了这些属性,线性布局还具有许多不同的构造函数。 -## **线性布局的构造函数** +## 线性布局的构造函数 以下是线性布局的构造函数 diff --git a/docs/170.md b/docs/170.md index 8191e27ccc9a369d40a463cfe6a3df4c5f7668a5..8432a4e0c11e1cab06b29a5e942e083691d5c747 100644 --- a/docs/170.md +++ b/docs/170.md @@ -6,7 +6,7 @@ Android 中的布局对于基于 GUI 的应用程序非常重要。 在上一教程中,我们学习了[线性布局](https://javatutorial.net/android-linear-layout-example),本教程介绍了 Android 中的相对布局。 -## **相对布局** +## 相对布局 顾名思义,相对布局显示组件之间的相对位置。 可以相对于连续元素或父组件来指定位置。 相对布局是 Android 提供的最灵活的布局。 它使您可以在屏幕上放置元素。 默认情况下,它将所有组件设置在布局的左上方。 下图显示了相对布局的外观, @@ -14,7 +14,7 @@ Android 中的布局对于基于 GUI 的应用程序非常重要。 在上一教 相对布局 -## **相对布局属性** +## 相对布局属性 以下是相对布局的属性。 @@ -22,7 +22,7 @@ Android 中的布局对于基于 GUI 的应用程序非常重要。 在上一教 * **重力:**它指定对象在 x-y 平面中的位置。 * **IgnoreGravity:**被添加以忽略特定组件上的重力。 -## **相对布局构造函数** +## 相对布局构造函数 相对布局具有四个不同的构造函数 @@ -31,7 +31,7 @@ Android 中的布局对于基于 GUI 的应用程序非常重要。 在上一教 * RelativeLayout(Contetxt 上下文,AttributeSet 属性,int defStyleAttribute) * RelativeLayout(Contetxt 上下文,AttributeSet 属性,int defStyleAttribute,in defStyleRes) -## **相对布局的方法** +## 相对布局的方法 以下是相对布局的几种重要方法 @@ -43,7 +43,7 @@ Android 中的布局对于基于 GUI 的应用程序非常重要。 在上一教 * **getGravity():**用于获取元素的位置。 * **getAccessibilityClassName():**返回对象的类名称。 -## **相对布局的 XML 属性** +## 相对布局的 XML 属性 相对布局具有以下 XML 属性。 @@ -59,7 +59,7 @@ Android 中的布局对于基于 GUI 的应用程序非常重要。 在上一教 **android:layout_alignRight,**将该组件定位在给定组件 ID 的右侧。 -## **相对布局示例** +## 相对布局示例 以下示例显示了 Android 中的相对布局。 创建一个空的活动并将相对布局从调色板拖到屏幕上。 然后拖动所需的 GUI 组件。 这是 xml 文件。 diff --git a/docs/171.md b/docs/171.md index e5a414fd13fa1621d11c665f2c88bb6435cfe608..c7d4bcf5dd320f0774fc435e3371413c3dfd8745 100644 --- a/docs/171.md +++ b/docs/171.md @@ -6,7 +6,7 @@ 您要在 Android 应用程序中打开网页吗? Android 提供了一种称为 Web 视图的布局,可帮助我们在应用程序中打开网页。 -## **Web 视图布局** +## Web 视图布局 Web 视图布局用于显示活动中的在线内容。 Web 视图类是 Android 中视图类的扩展。 它不像网络浏览器,因此不提供导航控件和 URL。 Web 工具包呈现引擎显示网页,并允许我们向前和向后导航。 如果要在应用程序中显示一些网页信息,则使用 Web 视图非常普遍。 或者,如果您想提供需要更新的信息(例如用户指南或协议),则可以用作另一种用途。 @@ -14,7 +14,7 @@ Web 视图布局用于显示活动中的在线内容。 Web 视图类是 Android `<uses-permission android: name= ”android.permission.INTERNET” />` -## **Web 查看方法** +## Web 查看方法 以下是 Android 中 Web 视图布局的方法。 @@ -35,7 +35,7 @@ Web 视图布局用于显示活动中的在线内容。 Web 视图类是 Android * **goBack(),**返回 Web 视图的历史记录。 * **capturePicture(),**用于拍摄 Web 视图的位图快照。 -## **Android 中的网络视图示例** +## Android 中的网络视图示例 这是一个示例,显示了如何通过在活动中使用 Web 视图布局在应用程序中显示 javatutorial.net 网站。 首先,您需要创建一个新活动。 打开您的 activity_main.xml 并粘贴此代码。 diff --git a/docs/172.md b/docs/172.md index a904fc4507f2012821b182aa87559b8f1f537bdd..acd0a81a93c4d52a748f28feeed1fabbbb3baa72 100644 --- a/docs/172.md +++ b/docs/172.md @@ -4,7 +4,7 @@ 您已经学习了 Android 的许多其他布局,本教程通过示例说明了 android 中的列表视图。 -## **ListView** +## ListView 您要在应用中显示列表吗? Android 通过提供列表视图布局来解决其问题。 它是一种布局,在垂直可滚动列表中显示项目。 列表中的每个项目都位于列表中上一个项目的下方。 列表项存储在数组中,并由[使用适配器](https://javatutorial.net/android-listview-with-listadapter-example)从列表中拉出项目,然后将其插入列表。 列表视图是 AdapterView 的子类。 自定义列表在移动应用程序中非常常见,列表视图提供了一种创建自定义列表的简便方法。 它是最常用的布局之一,例如,当您要显示一组日期时,没有什么比列表更合适的了。 下图显示了列表视图的外观 @@ -24,7 +24,7 @@ **android:footerDividersEanabled,**用于在每个页脚视图之前绘制分隔线。 -## **列表视图的方法** +## 列表视图的方法 列表视图有许多公共方法,下面将对其中的一些方法进行说明。 @@ -48,7 +48,7 @@ (adsbygoogle = window.adsbygoogle || [])。push({}); -## **列表视图的示例** +## 列表视图的示例 这是在 Android 中使用列表视图的示例。 它显示了计算机科学中的语言列表。 首先创建一个活动,打开活动 _main.xml 并粘贴此代码 diff --git a/docs/173.md b/docs/173.md index c84f6b512f1543c0903c2f0faf2e1e8972961ba1..39723fcfb177908bc5bd567bdc719e5955f28796 100644 --- a/docs/173.md +++ b/docs/173.md @@ -4,7 +4,7 @@ Android 网格视图是许多应用程序中最常用的布局之一。 本教程通过示例说明了网格视图的布局。 -## **GridView** +## GridView 网格视图是 android 中的布局,可让您将组件排列在二维可滚动网格中。 GirdView 中的组件不一定是静态的,它可以存储在 ListAdapter 中(适配器就像数据和 UI 组件之间的桥梁)。 下图显示了 android 中 GridView 的示例。 @@ -14,7 +14,7 @@ GridView Android 网格视图在计算器,日历等许多应用程序中非常常见。 -## **网格视图的属性** +## 网格视图的属性 以下是 Android 网格视图布局的一些 XML 属性。 @@ -24,7 +24,7 @@ GridView Android * **android:verticalSpacing,**用于指定网格行之间的垂直空间。 * **android:numColumns,**指定要显示的列数。 -## **网格视图的方法** +## 网格视图的方法 网格视图有多种使用方法,其中一些在此处说明 @@ -49,7 +49,7 @@ Gird 视图具有四个不同的公共构造函数,如下所示 * GridView(内容上下文,AttributeSet 属性,int defStyleAttr) * GridView(内容上下文,AttributeSet 属性,int defStyleAttr,int defStyleRes) -## **网格视图示例** +## 网格视图示例 本示例说明如何在 Android 中使用 GridView 布局。 如前所述,GridView 可以直接使用,也可以与自定义适配器一起使用。 本示例显示了小写和大写英文字母的网格。 diff --git a/docs/174.md b/docs/174.md index a70da0a8c49bbc1f26b69af19093648c170d2f6b..8b73f13ac91fbcc3176eb652e22752dba43f43da 100644 --- a/docs/174.md +++ b/docs/174.md @@ -4,7 +4,7 @@ 在上一个教程中,我们通过一个简单的示例了解了[列表视图布局](https://javatutorial.net/android-list-view-example)。 本教程介绍了用于创建自定义列表的列表适配器。 -## **Android ListAdapter** +## Android ListAdapter 列表视图非常简单,您要自定义列表吗? ListAdapter 用于自定义列表视图的布局。 它的行为就像是数据源和列表视图之间的桥梁。 它的父类是 BaseAdapter。 当您要为列表中的各个行指定布局时使用。 不要将其与 ArrayAdapter 混淆,ListAdapter 是一个接口,而 ArrayAdapter 是可处理数据数组的类。 下图显示了使用 ListAdapter 的自定义列表视图。 @@ -12,7 +12,7 @@ 列表适配器 -## **ListAdapter 构造函数** +## ListAdapter 构造函数 ListAdapter 的构造方法采用一个参数,该参数指定每一行的布局资源。 除此之外,它还有两个参数(这两个参数通常是并行数组),使我们能够指定将哪个数据字段与行布局资源中的哪个对象相关联。 diff --git a/docs/175.md b/docs/175.md index 4985769b19bc90f2995d1e1745d7683099271f60..c7e889689d817d34b065f1780c520a8700ecc58e 100644 --- a/docs/175.md +++ b/docs/175.md @@ -4,7 +4,7 @@ 本文是 SQLite 数据库类和方法的简介。 它与[完整的 Android SQLite 示例](https://javatutorial.net/android-sqlite-database-example)相等。 -## **Android 中的 SQLite 数据库** +## Android 中的 SQLite 数据库 您是否要在设备中存储和保存 Android 应用程序的数据? 该解决方案非常简单,因为 Android 内置了 SQLite 数据库引擎。 SQLite 是 SQL 数据库,它将您的应用程序数据存储在一个文本文件中。 它重量很轻,也是开源的。 SQLite 数据库支持关系数据库的标准功能。 它支持文本,整数和实数数据类型。 Android.database.sqlite 软件包具有保存应用程序数据所需的全部。 SqliteDatabase 类具有许多不同的方法来创建数据库,执行 SQL 命令和删除数据库。 @@ -23,7 +23,7 @@ * **update(字符串表,内容值,字符串 whereClause,字符串[]其中 Args):**用于更新数据库中的行。 * **releaseMemory():**用于释放 SQL 所保存的内存。 -## **光标** +## 光标 游标是提供随机读写访问的接口。 游标对象帮助我们从数据库中检索任何内容。 Cursor 类的许多功能可以帮助我们进行数据检索。 diff --git a/docs/176.md b/docs/176.md index 61df3f3a53800d0f151be9d63d84f185f9414ac7..42c23c08320907a82c3364df3afff9e939e356e3 100644 --- a/docs/176.md +++ b/docs/176.md @@ -4,7 +4,7 @@ 上一教程对 Android 中的 SQLite 数据库进行了[简介。 本教程以示例说明了所有 CRUD(创建,检索,更新,删除)功能。](https://javatutorial.net/android-sqlite-database-introduction) -## **示例背景** +## 示例背景 让我们开始使用 SQLite 数据库。 本示例全部有关注册和登录过程以及将用户凭据存储到数据库中的逐步说明。 当用户单击“注册”按钮时,将出现一个新活动,并且用户填写该表单,该表单具有四个值,分别是名字,姓氏,电子邮件 ID 和密码。 当用户单击“确定”按钮时,这些值将保存到数据库中。 下图显示了数据库中的注册表的外观 @@ -12,7 +12,7 @@ 登录表 -## **第 1 步:活动布局** +## 第 1 步:活动布局 让我们开始创建用于注册和登录的 xml 布局。如上所述,注册有四个字段和一个确定按钮。 用户单击确定按钮时,将显示一个对话框,因为已保存值,然后将开始登录活动。 diff --git a/docs/177.md b/docs/177.md index 13e78a63633f9e6e81cb99efb4390566d279e763..1958fde898d89e6172d97a5b222ad4631f77e18a 100644 --- a/docs/177.md +++ b/docs/177.md @@ -4,11 +4,11 @@ 本教程借助一个示例来说明什么是动画以及如何在 Android 应用程序中使用动画。 -## **动画** +## 动画 你知道什么是动画吗? 动画实际上是对运动的幻想。 在这项技术中,相差很小的连续图像会产生运动效果。 动画在移动应用程序中非常有用。 教育中的动画用于解释理论和概念。 应用程序中的动画用来显示一些准则或过程。 向 Android 应用程序添加动画会增加用户的可加性。 它增加了乐趣,并平滑了用户体验。 在本教程中,您将学习如何通过在 Android 应用中添加动画来增加用户体验。 -## **Android 中的动画** +## Android 中的动画 Android 提供了一个名为 Animations 的类。 此类提供了许多不同的方法。 以下是其中一些: @@ -19,7 +19,7 @@ Android 提供了一个名为 Animations 的类。 此类提供了许多不同 * **end():**用于结束动画。 * **cancel():**用于取消动画。 -## **Android 中的动画示例** +## Android 中的动画示例 让我们开始为 Android 中的动画创建示例。 我将讨论四种类型的动画:眨眼,淡入淡出,顺时针和滑动。 打开您的 Android Studio 并创建一个新活动。 在主要活动中,有一个图像视图和一个按钮。 我用足球的形象。 这是 activity_main.xml 的代码 diff --git a/docs/178.md b/docs/178.md index 600aea66483a06ae2d1593844c7f0a68c4a8c87a..3dbf7e6784bd0a11515416e0c73d101fc6ce8235 100644 --- a/docs/178.md +++ b/docs/178.md @@ -4,11 +4,11 @@ Android 应用程序中的通知非常有用。 本教程将通过示例说明如何在应用程序中设置通知。 -## **通知** +## 通知 通知是通知或通知某事。 Android 应用程序中的通知非常有用。 它提供有关重要信息的信息。 现在,一天的用户希望易于使用,而又不想一次又一次地打开应用以获取新的更新。 取而代之的是,它们启用上推通知。 例如,没有人希望在一天内一次又一次地检查电子邮件,最好是在收到新邮件时调整通知。 为了满足这种通知需求,本教程提供了一个简单的示例来设置通知。 -## **NotificationCompat.Builder** +## NotificationCompat.Builder NotificationCompat 构建器类可帮助我们开发通知布局。 它有许多用于在应用程序中进行通知的方法。 以下是其中一些: @@ -21,11 +21,11 @@ NotificationCompat 构建器类可帮助我们开发通知布局。 它有许多 * **setContentTitle(CharSequence title):**此方法用于设置通知栏的标题。 * **setContentText(CharSequence text):**此方法用于设置通知栏中显示的文本。 -## **通知管理器** +## 通知管理器 通知管理器是一个类,用于告知用户后台发生了某些事情。 它通知事件。 -## **Android 中的通知示例** +## Android 中的通知示例 让我们开始创建一个简单的示例,该示例演示如何在 Android 应用中使用通知。 打开您的 Android Studio 并创建主要活动。 在主要活动中,只有文本视图,图像视图和按钮。 当用户单击按钮时,它将在状态栏中显示通知。 这是 activity_main.xml 的 XML 布局 diff --git a/docs/179.md b/docs/179.md index b86f0b30d9fa526060b98e64bd14aa9ef9859a3c..e25ae28cde172bf6d19b4c48f8f6952e83584169 100644 --- a/docs/179.md +++ b/docs/179.md @@ -4,23 +4,23 @@ 在先前的教程中,您了解了[活动](https://javatutorial.net/android-activity-example),[意向](https://javatutorial.net/android-intent-example)和其他内容。 本教程借助示例介绍了 Android 中的事件处理。 -## **事件处理** +## 事件处理 -事件是一个动作。 当用户与移动应用程序交互时,会发生这种情况。 Android 中的事件采用多种不同形式,例如按键,触摸输入和许多其他形式。 触摸屏交互属于触摸事件的类别。 Android 框架将所有事件维护在先进先出(FIFO)队列中。 顾名思义,事件处理程序用于处理 Android 中的事件。 事件处理程序和事件侦听器是相关概念。 +事件是一个动作。 当用户与移动应用程序交互时,会发生这种情况。 Android 中的事件采用多种不同形式,例如按键,触摸输入和许多其他形式。 触摸屏交互属于触摸事件的类别。 Android 框架将所有事件维护在先进先出(FIFO)队列中。 顾名思义,事件处理程序用于处理 Android 中的事件。 事件处理程序和事件监听器是相关概念。 -## **事件监听器** +## 事件监听器 它是一个包含回调方法的接口。 当用户触发视图元素时,它将调用这些方法。 以下是一些重要的回调方法: -* **OnClickListener():**当用户单击任何 UI 元素(如按钮,文本或图像)时,将调用此事件侦听器。 OnClick()事件处理程序用于处理此侦听器。 -* **OnLongClickListener():**当用户长时间单击任何 UI 元素或按住 UI 元素几秒钟时,将调用此方法。 OnLongClick()事件处理程序用于处理此侦听器。 -* **OnFocusChangeListener():**当 UI 元素或小部件失去焦点时,将调用此方法。 只需用户向前导航。 OnFocusChange()事件处理程序用于处理此侦听器。 +* **OnClickListener():**当用户单击任何 UI 元素(如按钮,文本或图像)时,将调用此事件监听器。 OnClick()事件处理程序用于处理此监听器。 +* **OnLongClickListener():**当用户长时间单击任何 UI 元素或按住 UI 元素几秒钟时,将调用此方法。 OnLongClick()事件处理程序用于处理此监听器。 +* **OnFocusChangeListener():**当 UI 元素或小部件失去焦点时,将调用此方法。 只需用户向前导航。 OnFocusChange()事件处理程序用于处理此监听器。 * **OnKeyListener():**当用户按下键盘上的键时,将调用此方法。 OnKey()事件处理程序用于处理此事件。 -* **OnTouchListener():**当用户触摸屏幕上的任何 UI 元素(例如按下或释放按钮)时,将调用此方法。 OnTouch()事件处理程序用于处理此侦听器。 -* **OnMenuItemClickListener():**当用户单击或选择菜单项时使用此方法。OnMenuItemClick()事件处理程序用于处理此侦听器。 -* **OnCreateContextMenuListener():** OnCreateContextMenu()事件处理程序用于处理此侦听器。 +* **OnTouchListener():**当用户触摸屏幕上的任何 UI 元素(例如按下或释放按钮)时,将调用此方法。 OnTouch()事件处理程序用于处理此监听器。 +* **OnMenuItemClickListener():**当用户单击或选择菜单项时使用此方法。OnMenuItemClick()事件处理程序用于处理此监听器。 +* **OnCreateContextMenuListener():** OnCreateContextMenu()事件处理程序用于处理此监听器。 -## **事件处理示例** +## 事件处理示例 让我们开始创建一个示例,说明如何在 Android 应用中使用事件处理程序和事件监听器。 打开 Android Studio 并创建一个新项目。 打开您的 activtity_main.xml 并添加测试视图,图像视图和按钮。 这是代码 diff --git a/docs/180.md b/docs/180.md index 55542df408ac1b2a54c84621763d30d3269b22d3..838172f970aa0ec54b695f72f5581240ec995538 100644 --- a/docs/180.md +++ b/docs/180.md @@ -10,7 +10,7 @@ 首先创建一个允许用户通过电子邮件发送数据的应用程序。 Intent.ACTION_SEND 用于通过手机中的现有客户端发送电子邮件。 类似地,Intent.ACTION_GET_CONTENT 用于附件。 -## **Intent.ACTION_SEND** +## Intent.ACTION_SEND ACTION_SEND 用于将数据发送到您应用中的其他活动或其他应用。 两者都很容易理解和使用。 如果要将数据发送到应用程序中的其他活动,则只需指定数据及其类型。 Android 操作系统将完成剩下的工作……它将找到兼容的活动并显示数据。 同样,您可以将数据发送到其他应用程序。 将内容类型设置为简单的纯文本。 这是应该如何编码的 @@ -22,7 +22,7 @@ emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,subject); ``` -## **Intent.ACTION_GET_CONTENT** +## Intent.ACTION_GET_CONTENT ACTION_GET_CONTENT 用于选择多种类型的数据并返回。 您可以通过将 MIME 类型设置为此类数据来直接选择所需的内容类型。 或者,您可以选择所需的任何类型的数据。 为此,请使用选择器包装您的意图,该选择器将启动一个新活动,并让用户选择所需的内容。 这是怎么做的 diff --git a/docs/182.md b/docs/182.md index 638379e736a7739e935141abc52a327606f16c9d..e158f3e472a136913711a674666704a36c717b0f 100644 --- a/docs/182.md +++ b/docs/182.md @@ -26,7 +26,7 @@ Eclipse IDE Eclipse 是整个视觉容器,它们提供一组编辑器视图。 基本上,它可以完成您希望 IDE 成为的所有工作,并且可以与大多数工具集成。 开发人员选择 Eclipse 是因为它易于使用和开放源代码平台。 与新手一起工作可能会有点麻烦,但是稳定地使用它会成为一种很棒的经验。 -## **NetBeans** +## NetBeans [NetBeans](https://netbeans.org/) 最初是 Sun 系统的一部分,现在已经落入 Oracle 的掌控之中。 它是一个免费的开源 IDE 平台。 该 IDE 用于为所有版本的 JAVA 开发软件。 它还支持您可以使用的各种插件。 @@ -40,7 +40,7 @@ NetBeans IDE NetBeans 提供了多个版本,例如 PHP,JAVA SE,JAVA EE,以及您的项目开发所需的更多版本。 您还可以找到用于许多 Web 技术的工具和编辑器。 NetBeans 支持 JAVA DB,PostgreSQL,MySQL 和 Oracle 的驱动程序,这些驱动程序的排名高于 Eclipse。 数据库资源管理器使您可以在 IDE 中轻松创建,修改和删除记录和表。 -## **IntelliJ IDEA** +## IntelliJ IDEA 作为 JetBrains 一部分的 IntelliJ IDEA 既有免费版本,也有商业版本。 我们已经知道 JetBrains 在 C#开发中为 Visual Studio 提供了 Resharper 插件。 IntelliJ 支持多种语言,例如 Clojure,Groovy,Scala,Java 等。 它还具有高级预测,代码分析和智能代码完成等功能。 主要针对企业领域的最终商业版本支持 PHP,Ruby,Python,SQL 和 ActionScript。 @@ -54,7 +54,7 @@ IntelliJ IDEA IDE Eclipse,Netbeans 和 IntelliJ IDEA 甚至还有许多其他选择。 例如,Visual Studio 也可以利用最新的工具和服务为使用云的设备创建出色的应用程序。 其他选项基于基于 [IntelliJ IDEA](https://www.jetbrains.com/idea/) android 开发环境的 Android Studio,为构建出色应用程序提供完整工具集的 Xcode 和为专业 PHP 和 Web 开发人员提供的 PhpStorm IDE。 -## **结论** +## 结论 我们看到了上面的 Eclipse,NetBeans 和 IntelliJ IDEA 之间的比较,并且还发现了一些其他适合不同目的的替代方案。 这完全取决于开发人员和项目要求,这是最适合他们的 IDE。 diff --git a/docs/185.md b/docs/185.md index bddf919ceb959841333fb259d18c0efcc5a05d8f..63fcec252b0bc60be5a7b54ad44d704877b74a3f 100644 --- a/docs/185.md +++ b/docs/185.md @@ -20,9 +20,9 @@ Liferay DXP 是最受欢迎的开放源代码之一,具有许多现成的(OO * 覆盖语言属性 * 用 Servlet 过滤器覆盖 HTTP 请求 * 覆盖 Liferay Struts 动作 -* 替代 Liferay 模态侦听器 +* 替代 Liferay 模态监听器 -## **什么是片段?** +## 什么是片段? Fragment 是 OSGi 模块的一种,类似于 mvcportlet,服务,激活器,面板应用程序等。可以说 Fragment 是主机模块的扩展。 @@ -68,10 +68,10 @@ Import-Package:片段中使用的外部软件包 2. 覆盖语言属性 3. 用 Servlet 过滤器覆盖 HTTP 请求 4. 覆盖 Liferay Struts 动作 -5. 替代 Liferay 模态侦听器 +5. 替代 Liferay 模态监听器 6. 覆盖 Liferay 动作命令 -## **如何在 Liferay 7 中创建片段** +## 如何在 Liferay 7 中创建片段 要将 Liferay 片段创建为模块,请使用以下命令 @@ -81,7 +81,7 @@ blade create -t fragment [-h hostBundleName] [-H hostBundleVersion] projectName 请注意,我们必须使用-t 参数将刀片模块的类型指定为片段。 而-h 参数将需要主机捆绑包符号名称和-H 参数将需要将被覆盖的主机模块版本。 最后一个 projectName 是人类友好的片段模块名称。 -## **如何覆盖 Liferay OOTB 模块的 JSP** +## 如何覆盖 Liferay OOTB 模块的 JSP 让我们来看一个用例:我想覆盖 Liferay 登录模块,并且要根据自己的需求自定义外观。 因此,要创建的 blade 命令如下: @@ -109,7 +109,7 @@ telnet localhost 11311 现在根据需要修改`login.jsp`并部署 login-fragment-module,成功部署后,您应该在 OOTB 登录模块中进行更改 -## **如何覆盖 Liferay DXP 的语言属性** +## 如何覆盖 Liferay DXP 的语言属性 Liferay 支持多种语言。 因此,我们具有 OOTB 模块的语言属性。 假设我们要更改某些标签,错误消息,成功消息等的属性值。我们可以灵活地覆盖这些属性值,并且可以根据我们的要求进行更改。 @@ -152,7 +152,7 @@ authentication-failed=Authentication failed. Please try again (customized). 现在部署 language-fragment-module,并且在登录模块中登录过程失败时,您将获得自定义消息。 -## **如何使用 Servlet 过滤器覆盖** +## 如何使用 Servlet 过滤器覆盖 有时,我们需要拦截 http 请求,并需要在该请求上编写逻辑。 因此,我们可以使用 BaseFilter 实现它。 @@ -186,7 +186,7 @@ public class CustomFilterPortlet extends BaseFilter { 在这里,CustomFilterPortlet 扩展了 BaseFilter 并覆盖了 processFilter 方法,我们可以在其中编写逻辑,并且必须在@Component 属性中将 url 模式指定为 url-pattern = / *。 -## **如何覆盖 Liferay Struts 动作** +## 如何覆盖 Liferay Struts 动作 在 Liferay 6.2 和其他早期版本中,所有 Liferay 操作都由`struts-config.xml`中定义的 struts 操作处理。 另一方面,在 Liferay 7 DXP 中,大多数操作都在`ActionCommand`中进行了转换。 Still Liferay 7 具有`struts-config.xml`中定义的一些支撑动作。 @@ -220,7 +220,7 @@ public class CustomTermsOfUseActionPortlet extends BaseStrutsAction { 在这里,CustomTermsOfUseActionPortlet 扩展了 BaseStrutsAction 并覆盖了 executes 方法,我们可以在其中编写自定义逻辑。 我们需要在@Component 的属性“ path = / portal / update_terms_of_use”中指定要覆盖的 struts 操作路径。 -## **如何覆盖 Liferay 模态侦听器** +## 如何覆盖 Liferay 模态监听器 有时,我们可能需要覆盖 Liferay 的 OOTB 实体,例如 User,Group,DLFileEntry 等,以执行 onAfterUpdate 或 onBeforeUpdate 之类的操作。 我们可以使用`BaseModelListener<T>`类覆盖这些方法。 diff --git a/docs/22.md b/docs/22.md index 8bc9c5da09a3d813ff9458feb1140077d37012ee..bed411d84ccd8111c8f52cc978476e85659d60e3 100644 --- a/docs/22.md +++ b/docs/22.md @@ -59,7 +59,7 @@ OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" 那你就好了 -## **Linux** +## Linux 要求: @@ -75,7 +75,7 @@ OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" 6. 将 bash 完成添加到 mvn:`sudo wget https://raw.github.com/dimaj/maven-bash-completion/master/bash_completion.bash --output-document /etc/bash_completion.d/mvn`。 这将使您可以通过单击 Tab 两次来完成 Maven 命令。 7. 键入 mvn –version 以验证其是否有效 -## **MAC** +## MAC 1. 打开终端并转到提取文件的目录并以超级用户身份登录 2. 通过键入**删除 tar.gz 存档。rm Downloads / apache-maven * bin.tar.gz** diff --git a/docs/31.md b/docs/31.md index ce0e1f2e9a30b9052dfec58f4137e67b110283bc..06c3a76dd7cb4d371017c852a5e8b4ea8b88e3b0 100644 --- a/docs/31.md +++ b/docs/31.md @@ -43,7 +43,7 @@ public class Example { 在上面的 Java 示例中,globalVar 位于静态数据存储区中。 因为如您所见,即使未在其中创建方法,也可以通过该方法进行访问。 此外,可以在整个程序中对其进行访问。 -## **堆** +## 堆 ```java public class Person { diff --git a/docs/33.md b/docs/33.md index 9b0c917e61a2b2732e79b0cd86630051517ab62e..3dba803c1452e38bcc2ad406e3bafd4ad584fc3b 100644 --- a/docs/33.md +++ b/docs/33.md @@ -25,19 +25,19 @@ 3. CMS 垃圾收集器 4. G1 垃圾收集器 -## **串行垃圾收集器** +## 串行垃圾收集器 GC 的此实现仅使用一个线程,并且在运行时冻结所有应用程序线程。 因此,它不是在多线程应用程序中使用的最佳选择。 所有垃圾收集事件都在一个线程中串行进行。 它用于对暂停时间要求不高且在客户端样式的计算机上运行的应用程序中。 它是为单线程系统设计的,是 JVM 中较小堆大小的首选。 -## **并行垃圾收集器** +## 并行垃圾收集器 此变体是 [JVM](https://javatutorial.net/jvm-explained) 的默认垃圾收集器,也称为吞吐量收集器。 并行 GC 在管理堆时利用多个线程,而串行 GC 则不然。 但是,像串行 GC 一样,它在运行时也会冻结其余的应用程序线程。 可以指定最大垃圾收集线程以及暂停时间,吞吐量和占用空间(堆大小)。 -## **CMS 垃圾收集器** +## CMS 垃圾收集器 CMS 代表并发标记扫描,并同时使用多个 GC 线程来扫描堆并标记未引用的对象,这些对象随后在扫描中被删除/取消分配。 对于那些需要短时间垃圾收集暂停并能够负担与 GC 共享资源的应用程序,它是首选。 使用该 GC 实现的应用程序比不使用 GC 的应用程序要慢,但是在执行垃圾收集时它们不会完全暂停整个应用程序。 @@ -48,7 +48,7 @@ CMS 代表并发标记扫描,并同时使用多个 GC 线程来扫描堆并标 当对象从年轻一代移动到老一代并且收集器没有足够的时间在老一代中腾出空间时,会遇到升级失败。 -## **G1 垃圾收集器** +## G1 垃圾收集器 G1 代表垃圾优先 GC,适用于在具有大内存的多处理器计算机上运行的应用程序。 与 CMS 收集器相比,它具有更高的性能效率。 @@ -56,13 +56,13 @@ G1 GC 将堆划分为一组大小相等的堆区域,并标记并发的全局 标记完成后,GC 知道哪些区域大部分为空。 然后,GC 首先从这些区域收集垃圾(这称为清扫阶段),从而产生大量可用空间。 因此,该名称首先是垃圾。 -## **垃圾收集的好处:** +## 垃圾收集的好处: * 没有手动的内存分配/取消分配处理,因为 GC 会自动处理未使用的内存空间 * 没有处理悬空指针的开销 * 自动内存泄漏管理 -## **垃圾收集的缺点:** +## 垃圾收集的缺点: * 跟踪对象引用的创建/删除需要更多的 CPU 能力,并且可能会影响需要大内存的请求的性能 * 程序员无法控制专用于释放不再需要的对象的 CPU 时间的调度 diff --git a/docs/34.md b/docs/34.md index a4f5ee2dad30a2b5411ee03b6b438b38721eb7b1..90650094996af1e17b09a0302658377397085703 100644 --- a/docs/34.md +++ b/docs/34.md @@ -25,7 +25,7 @@ Mutex 与 Semaphore 略有不同,因此 **Semaphore 允许多个线程访问 第二个构造函数如果传递 true(公平),则确保按线程请求访问并在队列中等待的顺序给出访问。 -## **Mutex 基本代码实现** +## Mutex 基本代码实现 ```java import java.util.concurrent.Semaphore; diff --git a/docs/37.md b/docs/37.md index fc338ae2c2bf33dfc8cd8455beb272a5fc5614c9..567e9265aeccef6bc578f83f1a893a69e593e580 100644 --- a/docs/37.md +++ b/docs/37.md @@ -22,7 +22,7 @@ * 静态同步。 * 合作(Java 中的线程间通信) -## **同步块** +## 同步块 同步块用于线程同步。 @@ -39,7 +39,7 @@ synchronized(referencetoobject) { ``` -## **监视器** +## 监视器 在尝试理解和实现 Java 同步时,监视器的概念很重要。 @@ -48,7 +48,7 @@ synchronized(referencetoobject) { * 在给定时间,只有一个线程可以拥有监视器。 * 一次只能有一个线程可以锁定监视器 -## **线程同步示例** +## 线程同步示例 ```java //We write a program with a simple counter execution. diff --git a/docs/39.md b/docs/39.md index ba4fd9cfe43b8ab8506a7780d3f6b20c8a62112b..fd1683bcdbcc4d7434eb8b4cc6b8693a10103b31 100644 --- a/docs/39.md +++ b/docs/39.md @@ -8,7 +8,7 @@ ThreadLocal 是提供线程局部变量的类,用于实现线程安全。 存 ThreadLocal 扩展了 Object 类,并提供了线程限制,它是局部变量的“一部分”。 -## **创建`ThreadLocal`变量** +## 创建`ThreadLocal`变量 ```java ThreadLocal threadLocalExample = new ThreadLocal(); @@ -27,7 +27,7 @@ ThreadLocal threadLocalExample = new ThreadLocal(); ThreadLocal 实例是希望将状态与线程相关联的类中的私有静态字段(在大多数情况下) -## **实现示例** +## 实现示例 ```java public class ThreadLocalExample { @@ -79,6 +79,6 @@ Before remove: Just a random text that will be displayed before the remove funct After remove: null ``` -## **分解** +## 分解 上面的代码显示了两种使它起作用的方法:一种是通过拥有 Runnable 对象并将其传递给 Thread 实例,然后覆盖 run()方法,或者您可以简单地创建一个 ThreadLocal 实例并为其设置值,然后 可以获取或删除它。 从上面的示例中可以看到,即使它是相同的变量(局部变量),也可以包含不同的值。 在第一种情况下,它包含值“ First”。 在第二种情况下,它包含值“ Second”。 对于其他实现,我只显示了一个线程。 但是,每个线程都是独立的–意味着,如果您要创建另一个 Thread 实例(例如 thread2),并对其进行 start(),它将独立运行,并且与其他 Thread 实例变量无关。 要进行检查,可以在静态类中创建一个 ThreadLocal 实例,然后在重写的 run()方法中创建一个随机数,然后使用 set()方法将其传递给当前线程。 您将看到,如果您在两个或多个不同的线程上调用它,则它们都将具有不同的值。 \ No newline at end of file diff --git a/docs/40.md b/docs/40.md index e4eea497ba6f8ba4a7d55467feb1bcd9365294ad..deb291d7e82032336615b1fdafef076cb082f032 100644 --- a/docs/40.md +++ b/docs/40.md @@ -4,7 +4,7 @@ 以下文章讨论了 Java 中的活锁和死锁状态,它们如何发生以及如何避免它们。 -## **活锁** +## 活锁 Java 中的 Livelock 是一种递归条件,其中两个或多个线程不断重复一段特定的代码。 @@ -110,7 +110,7 @@ public class BridgeCheck { 这导致了非终止循环。 -## **死锁** +## 死锁 死锁与活锁有些不同。 死锁是一种状态,其中每个成员都在等待其他成员释放锁。 diff --git a/docs/41.md b/docs/41.md index 67407de742422bd7eca9df18869657d6b1bf0241..e0b9d8924df3c9c616150c2e5508a02fef7e6012 100644 --- a/docs/41.md +++ b/docs/41.md @@ -1,4 +1,4 @@ -# Java Future 示例 +# Java `Future`示例 > 原文: [https://javatutorial.net/java-future-example](https://javatutorial.net/java-future-example) diff --git a/docs/42.md b/docs/42.md index 3f9653e739838c32c023e55355b9e2aae520eb3f..35ac78a39485cdccc90a6e9d62598f722bee0b32 100644 --- a/docs/42.md +++ b/docs/42.md @@ -1,4 +1,4 @@ -# Java equals()方法示例 +# Java `equals()`方法示例 > 原文: [https://javatutorial.net/java-equals-method-example](https://javatutorial.net/java-equals-method-example) @@ -53,7 +53,7 @@ These objects are not equal. 即使两个对象都是同一 Class 的实例并包含相同的值,但它们并不引用相同的对象。 每当您键入新的**关键字**时,它都会自动创建一个新的对象引用。 当我们使用**新的**关键字创建两个对象时,即使它们包含相同的值,它们也不相同。 它们指向不同的存储位置。 -## **使用 equals()方法和“ ==”运算符比较字符串** +## 使用`equals()`方法和`==`运算符比较字符串 **EqualsDemo.java** @@ -90,7 +90,7 @@ ent,它们指向相同的存储位置。 现在让我们做与上面完全相同的示例,但改用**新的**关键字。 -## 创建使用新的关键字创建的相同内容的字符串 +## 使用`new`关键字创建相同内容的字符串 **EqualsDemo.java** @@ -123,7 +123,7 @@ Not equal 这是一个直观的示例。 内存位置刚刚组成。 但是从示例中可以看到,当创建 str1 和 str2 时,它们指向不同的内存位置。 因此,当您使用==运算符比较它们时,无论如何,您都会得到假。 -## **覆盖 equals()方法以符合条件** +## 覆盖`equals()`方法以符合条件 假设您要在两个对象上调用.equals(),并且如果它们包含相同的名称和年龄,则应返回 true。 @@ -183,7 +183,7 @@ These objects are equal. 我们在 Animal 类中重写 equals 方法,因此它符合我们自己的条件。 如果我们不重写它,而只是对两个对象调用 equals 方法,它将不会返回 true。 -## 在字符串上调用 equals() +## 在字符串上调用`equals()` **EqualsDemo.java** @@ -209,9 +209,9 @@ public class EqualsDemo { equal ``` -在字符串上调用 equals()时,它将检查每个字符是否在两个字符串中都相同。 意思是,比较字符串时应始终使用**等于**,而不是 **==** 。 +在字符串上调用 equals()时,它将检查每个字符是否在两个字符串中都相同。 意思是,比较字符串时应始终使用`equals`,而不是 **==** 。 -## **对使用新关键字**创建的字符串的调用等于 +## 对使用`new`关键字创建的字符串的调用`equals` **EqualsDemo.java** @@ -240,6 +240,6 @@ equal 如您所见,使用 equals 时两个对象(字符串)是否指向不同的存储位置并不重要。 如果两个字符串中的内容相同,则返回 true。 -## **外卖店** +## 结论 比较字符串时,应始终使用.equals()而不是==。 \ No newline at end of file diff --git a/docs/44.md b/docs/44.md index d27cf2d9d4617657cd1e4d31229ac3fe4f32eef9..fa0e3803d9d3dfc98a461e31517f6b4447211a05 100644 --- a/docs/44.md +++ b/docs/44.md @@ -1,4 +1,4 @@ -# Java 可选示例 +# Java `Optional`示例 > 原文: [https://javatutorial.net/java-optional-example](https://javatutorial.net/java-optional-example) @@ -8,7 +8,7 @@ Java 8 引入了 Optional 类,该类用于根据值是否存在来操纵数据 让我举一个例子,说明为什么不使用 Optional 会导致问题。 -**未使用可选的** +**未使用`Optional`** ```java public class NonOptionalImplementation { @@ -53,7 +53,7 @@ Exception in thread "main" java.lang.NullPointerException ``` -**使用可选的**解决了此问题 +**使用`Optional`**解决了此问题 ```java import java.util.Optional; diff --git a/docs/46.md b/docs/46.md index f6e65b7f7e3358b7e5383178003e35dc9e4977f8..46b339176db7224fa70b51e63198cd3bc16c1a88 100644 --- a/docs/46.md +++ b/docs/46.md @@ -8,7 +8,7 @@ Java 类加载器是 [Java 虚拟机(JVM)](https://javatutorial.net/jvm-expl 本文旨在解释类加载器的工作方式,并列出 Java 类加载器的关键组件。 您下次 Java 面试时可能会遇到有关类加载器的问题。 -## 什么是 Java ClassLoader +## 什么是 Java `ClassLoader` 我们知道 Java 程序在 [Java 虚拟机(JVM)](https://javatutorial.net/jvm-explained)上运行。 当我们编译 Java 类时,它将转换为平台和机器无关的字节码。 编译的类存储为.class 文件。 当我们尝试使用类时,Java ClassLoader 将该类加载到内存中。 在已经运行的类中通过名称引用类时,这些类将引入 Java 环境。 一旦第一个类运行,以后将由类加载器完成加载类的尝试。 通常,通过声明并使用静态 main()方法来完成第一类的运行。 @@ -39,9 +39,9 @@ Java 类加载器是 [Java 虚拟机(JVM)](https://javatutorial.net/jvm-expl ## 静态与动态类加载 -使用 Java 的“新”运算符静态加载类。 动态加载是一种使用 Class.forName()在运行时以编程方式调用类加载器的功能的技术。 +使用 Java 的`new`运算符静态加载类。 动态加载是一种使用 Class.forName()在运行时以编程方式调用类加载器的功能的技术。 -## loadClass 和 Class.forName 之间的区别 +## `loadClass`和`Class.forName`之间的区别 **loadClass** 仅加载类,但不初始化对象,而 **Class.forName** 在加载对象后初始化对象。 例如,如果您使用 **ClassLoader.loadClass** 加载 JDBC 驱动程序,则该驱动程序将无法注册,并且您将无法使用 JDBC diff --git a/docs/48.md b/docs/48.md index 37a8165ff16e121950e77fbc458d37c0861f6684..22f1eddab315bf88517de2fb3f949b56c03e3b09 100644 --- a/docs/48.md +++ b/docs/48.md @@ -1,4 +1,4 @@ -# Java hashCode()方法示例 +# Java `hashCode()`方法示例 > 原文: [https://javatutorial.net/java-hashcode-method-example](https://javatutorial.net/java-hashcode-method-example) @@ -14,20 +14,20 @@ Java **java.lang.Object** 中的超类提供了两种比较对象的重要方法 hashCode 的简单说明 -## hashCode()可以使用的集合列表 +## `hashCode()`可以使用的集合列表 * [哈希集](https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html) * [树集](https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html) * [LinkedHashSet](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html) * [CopyOnWriteArraySet](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArraySet.html) -## 什么时候应该使用 hashCode()方法 +## 什么时候应该使用`hashCode()`方法 如果我们想执行 equals()方法,则需要确保这些对象具有相同的**唯一哈希码 ID。** 当哈希码 ID 不同时,我们永远不要执行 equals()。 **注意**:当 hashCode()比较返回**为假**时,equals()方法还必须返回**为假**。 如果哈希码与**不同**,则对象**不等于**。 -## hashCode()和 equals()的实际示例 +## `hashCode()`和`equals()`的实际示例 ```java import java.lang.*; @@ -75,7 +75,7 @@ public class hashCodeExample { } ``` -### 上面代码的简要分类 +### 上面代码的简要分解 在前几行中,我们将创建两个“ Car”对象,并传递一个 id 和一个品牌名称。 @@ -132,13 +132,13 @@ boolean isHashcodeEqual = BMW.hashCode() == mercedes.hashCode(); } ``` -## hashCode()的常见错误 +## `hashCode()`的常见错误 * 在 hashCode()方法中返回一个常量值,而不是为每个对象返回唯一的值。 * 使用 HashMap 之类的哈希集合时,不覆盖 equals()和 hashCode()。 * 忘记使用 equals()方法或其他方法覆盖 hashCode()。 -## 有关 hashCode()的重要注意事项 +## 有关`hashCode()`的重要注意事项 1. 使用有效的算法,以便生成唯一的哈希码 2. 覆盖 equals()方法时,请始终确保也覆盖了 hashCode()方法。 diff --git a/docs/49.md b/docs/49.md index 2311fce4e67dd5818619f2dd75f2859a35bf1d72..b6370024e11b1e4ffa40fee92624577bd7b1f8c8 100644 --- a/docs/49.md +++ b/docs/49.md @@ -1,4 +1,4 @@ -# 如何分析独立的 Java 应用程序 +# 如何测试独立的 Java 应用程序 > 原文: [https://javatutorial.net/how-to-profile-standalone-java-applications](https://javatutorial.net/how-to-profile-standalone-java-applications) @@ -8,7 +8,7 @@ 单元测试是一种软件测试方法,其中正在测试 Java 应用程序的小组件。 其目的是确认每个软件的行为均符合预期。 即使是这样,您也可以使用单元测试来确定另一种实现是否在内存和性能方面会带来更好的结果。 如果您对单元测试不是很熟悉,建议您参考本主题的本教程。 -## 什么是配置文件? +## 什么是性能分析? 性能分析会检查应用程序,并尝试查找与 Java 应用程序相关的内存或性能问题。它允许您执行的操作是通过监视 [JVM(Java)来获取有关性能,方法时序,对象分配等的数据。 虚拟机)](https://javatutorial.net/jvm-explained)。 diff --git a/docs/50.md b/docs/50.md index 669f62a416dc42debd02ef6080f4a3632115a4b3..2dde1b3d5cb2d92648020ee0c4bfe19e58698e06 100644 --- a/docs/50.md +++ b/docs/50.md @@ -1,14 +1,14 @@ -# SWING JFrame 基础知识,如何创建 JFrame +# SWING `JFrame`基础知识,如何创建`JFrame` > 原文: [https://javatutorial.net/swing-jframe-basics-create-jframe](https://javatutorial.net/swing-jframe-basics-create-jframe) 本教程介绍了从创建到定制的 JFrame 基础知识。 -## **什么是 JFrame?** +## 什么是`JFrame`? JFrame 是 java.awt.frame 扩展的 javax.swing 包类,它增加了对 JFC / SWING 组件体系结构的支持。 这是顶层窗口,带有边框和标题栏。 JFrame 类具有许多可用于自定义它的方法。 -## **创建一个 JFrame** +## 创建一个`JFrame` JFrame 类具有许多用于创建 JFrame 的构造函数。 以下是描述。 @@ -46,7 +46,7 @@ public class JFrameExample { J 框架 -## **设置 JFrame 的标题** +## 设置`JFrame`的标题 要设置 JFrame 的标题,可以使用 JFrame.setTitle(String title)。 @@ -77,7 +77,7 @@ public class JFrameExample { 设置 JFrame 的标题 -## **更改 JFrame 的窗口大小** +## 更改`JFrame`的窗口大小 要调整框架的大小,JFrame 提供了 JFrame.setSize(int width,int height)方法,它需要两个参数 width 和 height。 这是现在的代码外观 @@ -101,17 +101,17 @@ public class JFrameExample { ``` -## **调整 JFrame 的大小** +## 调整`JFrame`的大小 设置 JFrame 的大小后,您会注意到您仍然可以通过简单地将光标放在角落并拖动它来更改它的大小。 或者,如果按右上角关闭旁边的“调整大小”选项,它将最大化到全屏大小。 发生这种情况是因为默认情况下调整大小设置为 true。 您可以简单地将 false 设置为 JFrame.setResizable(false),现在它将根据您在代码中给定的尺寸显示,并且不会通过图形界面调整大小。 -## **更改屏幕上的位置** +## 更改屏幕上的位置 要更改 JFrame 在屏幕上的位置,JFranme 提供了一种方法 JFrame.setlocation(int x,int),它使用两个参数 x 表示沿 x 轴的位置,y 表示沿 y 轴的位置。 屏幕的左上角是(0,0)。 -## **关闭 JFrame** +## 关闭`JFrame` 您可以通过单击 JFrame 左上角的 X(十字)来轻松关闭 JFrame。 但是 JFrame.setDefaultCloseOperation(int)是 JFrmae 类提供的方法,您可以设置当用户单击叉号时将发生的操作。 如果给定参数“ 0”,则即使单击十字,JFrame 也不会关闭。 diff --git a/docs/51.md b/docs/51.md index ab8a7fe7d9c1025455b039bae0c8917eaa84962e..7ad493c351ae5b3225c514eb8b7d3b7050bdb85b 100644 --- a/docs/51.md +++ b/docs/51.md @@ -1,14 +1,14 @@ -# Java SWING JFrame 布局示例 +# Java SWING `JFrame`布局示例 > 原文: [https://javatutorial.net/java-swing-jframe-layouts](https://javatutorial.net/java-swing-jframe-layouts) 本教程通过示例和用法说明了各种 [JFrmae](https://javatutorial.net/swing-jframe-basics-create-jframe) 布局。 -## **解释** +## 解释 Java AWT 包提供了许多不同的布局,例如边框布局,框布局,流布局,网格布局等。这些布局管理器用于以特定方式排列组件。 布局用于按特定顺序管理组件。 以下是 Java 中一些常用布局的描述和示例。 -## **边框布局** +## 边框布局 边框布局是最常用的布局之一。 这是 JFrame 中的默认布局。 它可以将组件定位在五个不同的区域,例如顶部,底部,左侧,右侧和中心。 在边框布局中,每个区域仅包含一个组件。 所有可用空间都放在中间。 @@ -56,7 +56,7 @@ public class BorderLayoutExample { 边框布局 -## **流布局** +## 流布局 流布局是常用的布局。 这是 JPanel 使用的默认布局。 它用于将组件排成一行或一行,例如从左到右或从右到左。 如果没有剩余空间,则它将组件排成一行。 Align 属性确定组件的对齐方式,如左,右,居中等。 @@ -108,7 +108,7 @@ public class FlowLayoutExample { 流程布局 -## **网格布局** +## 网格布局 网格布局将组件排列在矩形网格中。 它在单元中排列组件,每个单元具有相同的大小。 组件放置在列和行中。 GridLayout(int 行,int 列)采用两个参数,即 column 是 row。 diff --git a/docs/52.md b/docs/52.md index 0b85ce75dcfd3d9a516374030772c61a4f491b04..4baba07cc43e9e998d465ff548e4644bbcd55574 100644 --- a/docs/52.md +++ b/docs/52.md @@ -1,14 +1,14 @@ -# 在 JFrame 上以 Java 显示文本和图形 +# 在`JFrame`上显示文本和图形 > 原文: [https://javatutorial.net/display-text-and-graphics-java-jframe](https://javatutorial.net/display-text-and-graphics-java-jframe) 本教程介绍了如何在 [JFrmae](https://javatutorial.net/swing-jframe-basics-create-jframe) 上显示文本和图形,例如线条,圆形和矩形。 -## **背景** +## 背景 Java 为我们提供了一种使用 GUI 绘制文本和图形的简便方法。 AWT 包中的 Graphics 类允许我们绘制基本的几何类型,如直线和圆。 除此之外,它还可以显示文本。 本教程将说明用于绘制形状和文本的 Graphics 类的各种功能。 -## **画线** +## 绘制直线 Graphics 类提供了 Graphics.drawline(int x1,int y1,int x2,int y2)方法在屏幕上绘制一条线。 x1 是线的第一点的 x 坐标,而 y1 是线的第一点的 y 坐标。 类似地,x2 和 y2 是第二个线点的坐标。 @@ -45,7 +45,7 @@ public class JFrmaeGraphics extends JPanel{ 行示例 -## **画圆** +## 绘制圆 您可以借助 Graphics.drawOval(int x,int y,int width,int height)方法绘制圆形和椭圆形。 此功能有两个目的。 X 和 y 是位置,屏幕上的起点以及宽度和高度是设置椭圆形或圆形的宽度和高度的参数。 对于圆设置相同的宽度和高度。 @@ -81,7 +81,7 @@ public class JFrmaeGraphics extends JPanel{ 圈子的例子 -## **绘制矩形** +## 绘制矩形 Graphics 类提供了 Graphics.drawRect(int x,int y,int width,int height)方法来绘制矩形或正方形。 前两个参数显示起点,后两个参数显示矩形或正方形的宽度和高度。 对于正方形,宽度和高度应相同。 @@ -117,7 +117,7 @@ public class JFrmaeGraphics extends JPanel{ 矩形示例 -## **绘制多边形** +## 绘制多边形 绘制多边形非常容易.Graphics 类提供了 Graphics.drawPolygon(int [],int [],int points)的方法。 第一个参数是包含多边形所有点的 x 值的数组,第二个也是包含多边形所有点的 y 值的数组,而第三个参数显示点的数量。 @@ -154,7 +154,7 @@ public class JFrmaeGraphics extends JPanel{ 多边形示例 -## **绘制文字** +## 绘制文字 要在屏幕上绘制文本,可以使用 Graphics.drawText(string text,int x,int y)方法。 第一个参数是您要显示的字符串,最后两个参数是此文本将开始的 point 的值。 @@ -190,7 +190,7 @@ public class JFrmaeGraphics extends JPanel{ 文字示例 -## **绘制图像** +## 绘制图像 Graphics 类提供了 Graphics.drawImage(Image,int x,int y,ImageOberver 观察器)方法来绘制图像。 虽然 Image 是类,但是您可以使用 getDafaultKit()方法获取图像的地址。 将图像放置在项目的文件夹中。 diff --git a/docs/53.md b/docs/53.md index b752d80b48efca17ebf87d7610a4ee2b83008633..90cef6e50284a57a484da5b845c6afa3b17215ef 100644 --- a/docs/53.md +++ b/docs/53.md @@ -1,22 +1,22 @@ -# 与 JFrame 交互–按钮,侦听器和文本字段 +# 与`JFrame`交互 – 按钮,监听器和文本区域 > 原文: [https://javatutorial.net/jframe-buttons-listeners-text-fields](https://javatutorial.net/jframe-buttons-listeners-text-fields) -本教程说明了如何通过使用按钮,侦听器和文本字段与 [JFrame](https://javatutorial.net/swing-jframe-basics-create-jframe) 进行交互。 +本教程说明了如何通过使用按钮,监听器和文本区域与 [JFrame](https://javatutorial.net/swing-jframe-basics-create-jframe) 进行交互。 -## **背景** +## 背景 -交互性是用户在每个应用程序中想要的。 为了在程序中增加交互性,Java 为我们提供了一种非常简单的方法。 Javax.swing.JButton calss 为我们提供了一种添加按钮的方法,并且在单击按钮后发生事件。 同样,借助 javax.swing.JTextfield 的帮助,我们可以向 [JFrame](https://javatutorial.net/swing-jframe-basics-create-jframe) 添加文本字段。 +交互性是用户在每个应用程序中想要的。 为了在程序中增加交互性,Java 为我们提供了一种非常简单的方法。 Javax.swing.JButton calss 为我们提供了一种添加按钮的方法,并且在单击按钮后发生事件。 同样,借助 javax.swing.JTextfield 的帮助,我们可以向 [JFrame](https://javatutorial.net/swing-jframe-basics-create-jframe) 添加文本区域。 -## **添加文本字段** +## 添加文本区域 -您可以使用 JTextfield()方法创建一个文本字段。 此类具有许多构造函数,如 JTextField():构造一个新的文本字段 +您可以使用 JTextfield()方法创建一个文本区域。 此类具有许多构造函数,如 JTextField():构造一个新的文本区域 -JTextField(字符串文本):使用指定的文本构造一个文本字段。 +JTextField(字符串文本):使用指定的文本构造一个文本区域。 -JTextField(字符串文本,int 列):它使用指定的文本和列数创建一个新的文本字段。 +JTextField(字符串文本,int 列):它使用指定的文本和列数创建一个新的文本区域。 -以下程序显示了向 JFrame 添加文本字段的示例。 +以下程序显示了向 JFrame 添加文本区域的示例。 ```java package javatutorial.net; @@ -60,9 +60,9 @@ JTextField.setHorizo​​ntalAlignment(int alignment); 它设置文本的 JTextFieldsetScrollOffset(int scrolloffset); 它以像素为单位设置滚动偏移量。 -## **添加按钮并应用动作监听器** +## 添加按钮并应用动作监听器 -同样,您可以在 JFrame 中添加按钮。 JButton 为我们提供了一种添加按钮和动作侦听器的简便方法。 它有很多像 +同样,您可以在 JFrame 中添加按钮。 JButton 为我们提供了一种添加按钮和动作监听器的简便方法。 它有很多像 JButton(); 创建一个没有文本且没有图标的按钮。 @@ -105,9 +105,9 @@ public class SimpleJButton { 带有图标的按钮 -## **添加动作监听器** +## 添加动作监听器 -在 JButton 上添加动作侦听器非常简单。 JButton 类提供方法 JButton.addActionListener(),该方法实现重写方法 actionPerformed()。 在下面的示例中,我编写了一个简单的程序,要求用户输入名称,当用户单击“提交”按钮时,将显示一条消息“名称已提交。”。 这是代码。 +在 JButton 上添加动作监听器非常简单。 JButton 类提供方法 JButton.addActionListener(),该方法实现重写方法 actionPerformed()。 在下面的示例中,我编写了一个简单的程序,要求用户输入名称,当用户单击“提交”按钮时,将显示一条消息“名称已提交。”。 这是代码。 ```java package javatutorial.net; diff --git a/docs/54.md b/docs/54.md index aeff674d58c47109eed90514168580229c6940f9..f65d2ce83263d6d09542c2c35d2d2ea367477ce0 100644 --- a/docs/54.md +++ b/docs/54.md @@ -83,7 +83,7 @@ Maven 工件信息 单击“保存”将添加所有 jar 文件。 -## 步骤 3:清理您的专案 +## 步骤 3:清理您的项目 现在清理您的 Maven 项目。 为此,转到项目的根文件夹,右键单击,在列表中找到**以**运行,然后单击 **Maven clean** 命令。 diff --git a/docs/55.md b/docs/55.md index 8c79bedaff35eb3e2648b82d56885bd8507cbb22..e8d48b1d972674ec36beaf25f1bebd8bbe7c64b3 100644 --- a/docs/55.md +++ b/docs/55.md @@ -1,4 +1,4 @@ -# Java Collection 新手指南 +# Java `Collection`新手指南 > 原文: [https://javatutorial.net/java-collection-tutorial](https://javatutorial.net/java-collection-tutorial) @@ -7,14 +7,14 @@ Java 中的“集合”框架随着 [JDK 1.2](https://javatutorial.net/install-j 它为您(程序员)提供列表,集合,映射和队列,以满足您大多数的编码需求。 而且,无论您选择哪一个,都一定会给您至少一个合理的表现。 在深入探讨事物之前,让我们先整理一些事物。 * 集合(小写 c):这表示存储和迭代对象的不同类型的数据结构。 -* 集合(大写 c):这是设置,列表和队列扩展的接口。 “语法帮助:`java.util.Collection`” +* 集合(大写 c):这是集合,列表和队列扩展的接口。 “语法帮助:`java.util.Collection`” * 集合(大写 c 并以字符 s 结尾):这是一个类,其中包含所有与集合一起使用的“静态”实用程序方法。 ![Java collection hierarchy](img/5c554e1339fdc85bb87b0792a7292174.jpg) Java 集合层次结构 -## 现在出现的问题是……我该如何处理某个 Collection? +## 现在出现的问题是……我该如何处理某个`Collection`? * 对于初学者,您可以将对象添加到集合中。 * 从集合中删除对象 @@ -24,13 +24,13 @@ Java 集合层次结构 现在,不用多说,让我们开始使用收藏集。 它们通常有四个变体,即: * **列表:**事物列表 -* **设置:**独特的事物 -* **地图:**具有唯一 ID 的事物 +* **集合:**独特的事物 +* **映射:**具有唯一 ID 的事物 * **队列:**先进先出。 -## 列表界面 +## 列表接口 -List 界面中重要的首要因素是 INDEX。 拥有索引可以为程序员提供整个索引方法库。 其次,所有三个不同的列表实现均按索引位置排序,这些实现的名称为: +List 接口中重要的首要因素是 INDEX。 拥有索引可以为程序员提供整个索引方法库。 其次,所有三个不同的列表实现均按索引位置排序,这些实现的名称为: * [**ArrayList**](https://javatutorial.net/java-arraylist-example) * **矢量** @@ -44,7 +44,7 @@ List 界面中重要的首要因素是 INDEX。 拥有索引可以为程序员 3. [**LinkedList**](https://javatutorial.net/java-linkedlist-example) :我们又有了类似于 ArrayList 的内容。 这里的主要区别在于,LinkedList 中的元素是双向链接的。 LinkedList 的迭代速度比 ArrayList 慢,但是当需要快速插入或删除时,它是更好的选择。 我们将在我们的教程[中更详细地说明这一点[Java 中的 ArrayList 和 LinkedList 之间的区别](https://javatutorial.net/difference-between-arraylist-and-linkedlist-in-java) -## 设置界面 +## 集合接口 这里的词组类似于您在学校数学中学习过的词组,如果您不喜欢该章,请不要着急。 这里唯一重要的是在 Set 中我们不允许重复。 就像列表接口一样,set 接口也具有三种不同的实现: @@ -56,7 +56,7 @@ List 界面中重要的首要因素是 INDEX。 拥有索引可以为程序员 2. **LinkedHashSet** :您现在必须已经猜到它有点类似于 HashSet,并且绝对正确,因此,我只想让您知道这两者之间的区别(在此处输入鼓声) 是 HashSet 的 ORDERED 版本,该版本在所有元素上维护一个双向链接列表。 3. **TreeSet** :这是一个 SORTED 集合,并使用红黑树结构,该结构保证元素**必定**根据自然顺序处于升序。 -## 地图界面 +## 映射接口 映射接口只关心以下事实:本质上,集合中已经存在或要添加到集合中的所有对象的所有标识符都是完全唯一的。 这里的 KEY 和 VALUE 都是对象。 @@ -66,7 +66,7 @@ List 界面中重要的首要因素是 INDEX。 拥有索引可以为程序员 * [**哈希表**](https://javatutorial.net/java-hashtable-example) * [**LinkedHashMap**](https://javatutorial.net/java-linkedhashmap-example) -1. **HashMap** :这为您提供了一个未分类的,未排序的地图,其中键在地图中的位置取决于键的`hashCode()`函数的值。 +1. **HashMap** :这为您提供了一个未分类的,未排序的映射,其中键在映射中的位置取决于键的`hashCode()`函数的值。 2. **HashTable** :它是 HashMap 的同步副本。 不允许输入`NULL`。 3. **LinkedHashMap** :此实现可维持插入顺序,这在我们讨论迭代及其其他用途时是一项非常重要的功能,但令人怀疑的缺点是速度太慢。 diff --git a/docs/56.md b/docs/56.md index 4dfeab32bda5f3632548d8980d2ce130f02eb5dc..17d12773108e93fa88e4d5a745208a26c1790665 100644 --- a/docs/56.md +++ b/docs/56.md @@ -10,9 +10,9 @@ Java 为您提供了多种收集实现供您选择。 通常,您将始终为 ![java collection interfaces flowchart](img/7067209d54dd92701c19e4d5196cd720.jpg) -这里的主要规则是:如果您需要存储映射了键的值,请转到 Map 界面,否则,请使用 List 表示可能重复的值,如果您不想在集合中使用重复的值,请最终使用 Set 接口。 +这里的主要规则是:如果您需要存储映射了键的值,请转到 Map 接口,否则,请使用 List 表示可能重复的值,如果您不想在集合中使用重复的值,请最终使用 Set 接口。 -## 选择正确的 Java Map 界面 +## 选择正确的 Java `Map`接口 [**HashMap**](https://javatutorial.net/java-identityhashmap-example) –如果迭代时项目的顺序对您不重要,请使用此实现。 与 TreeMap 和 [LinkedHashMap](https://javatutorial.net/java-linkedhashmap-example) 相比,HashMap 具有更好的性能。 @@ -20,13 +20,13 @@ Java 为您提供了多种收集实现供您选择。 通常,您将始终为 [**LinkedHashMap**](https://javatutorial.net/java-linkedhashmap-example) –在插入过程中按键对项目排序 -## 选择正确的 Java List 界面 +## 选择正确的 Java `List`接口 [**ArrayList**](https://javatutorial.net/java-arraylist-example) –插入期间对项目进行排序。 与对 LinkedLists 的搜索操作相比,对 ArrayLists 的搜索操作更快 [**LinkedList**](https://javatutorial.net/java-linkedlist-example) –已快速添加到列表的开头,并通过迭代从内部快速删除 -## 选择正确的 Java Set 界面 +## 选择正确的 Java `Set`接口 [**HashSet**](https://javatutorial.net/java-concurrenthashset-example) –如果迭代时项目的顺序对您不重要,请使用此实现。 与 TreeSet 和 LinkedHashSet 相比,HashSet 具有更好的性能 diff --git a/docs/57.md b/docs/57.md index 559bd6716eabb49d416aae8091651585387c7f0e..ae4bdf4cad301e1b200c4aedcc3cadaddacd8a52 100644 --- a/docs/57.md +++ b/docs/57.md @@ -1,4 +1,4 @@ -# Java ArrayList 示例 +# Java `ArrayList`示例 > 原文: [https://javatutorial.net/java-arraylist-example](https://javatutorial.net/java-arraylist-example) @@ -6,7 +6,7 @@ Java ArrayList 类是实现 List 接口的可调整大小的数组。 它允许 ![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg) -## ArrayList 的优点 +## `ArrayList`的优点 * 动态添加或删除元素的能力。 * ArrayList 使用数组作为其基础实现,这使 ArrayList 类可以更快地访问元素。 @@ -20,7 +20,7 @@ Java ArrayList 类是实现 List 接口的可调整大小的数组。 它允许 * ArrayList 将数据顺序存储在内存中,因此,如果列表很大,则将需要大量连续的内存块。 * ArrayList 的初始容量为 10,如果不指定容量,则将受到性能限制。 每当 ArrayList 达到其自身容量时,数据将以 50%以上的容量从旧空间复制到新空间。 -## ArrayList 的简单说明 +## `ArrayList`的简单说明 ![ArrayList in Java](img/20c47c9f2dcd4e5b6bc53cacf14f5f2f.jpg) @@ -28,13 +28,13 @@ Java 中的 ArrayList 从上图可以看到,ArrayList 中当前有 2 个元素,可以添加的最大元素数量(容量)为 8(或 6 个以上)。 -## ArrayList 中的构造方法 +## `ArrayList`中的构造方法 1. ArrayList()–构造一个初始容量为 10 的空列表。 2. ArrayList(Collection <?Extended E > c)–构造一个列表,该列表包含指定集合的​​元素,并按集合的迭代器返回它们的顺序。 3. ArrayList(int initialCapacity)–构造一个具有指定初始容量的空列表。 -## ArrayList 类中的方法 +## `ArrayList`类中的方法 1. boolean add(E e):将指定的元素附加到列表的末尾。 2. void add(int index,E element):将指定的元素插入列表中的指定位置。 @@ -60,7 +60,7 @@ Java 中的 ArrayList 有关所有方法的文档,请访问 [Oracle 官方文档页面](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html)。 -### 使用 add()在 ArrayList 中添加元素 +### 使用`add()`在`ArrayList`中添加元素 ```java import java.util.* ; @@ -91,7 +91,7 @@ size: 0 new size: 3 ``` -### 使用 remove()移除 ArrayList 中的元素 +### 使用`remove()`移除`ArrayList`中的元素 ```java import java.util.* ; @@ -121,7 +121,7 @@ public class RemoveExample 1: Lion ``` -### 使用 isEmpty()检查 ArrayList 是否包含元素 +### 使用`isEmpty()`检查`ArrayList`是否包含元素 ```java import java.util.* ; @@ -151,7 +151,7 @@ Case 1: false Case 2: true ``` -### 使用 indexOf(Object o)在 ArrayList 中搜索元素 +### 使用`indexOf(Object o)`在`ArrayList`中搜索元素 ```java import java.util.* ; @@ -178,7 +178,7 @@ Index of 'Elephant': 0 Index of 'Lion': 2 ``` -### 使用 Iterator()遍历 ArrayList 中的元素 +### 使用`Iterator()`遍历`ArrayList`中的元素 ```java import java.util.* ; @@ -210,7 +210,7 @@ Tiger Lion ``` -### 使用增强的 For 循环遍历 ArrayList 中的元素 +### 使用增强的`For`循环遍历`ArrayList`中的元素 ```java import java.util.* ; @@ -239,7 +239,7 @@ Lion ``` -### 使用 size()获取 ArrayList 的大小 +### 使用`size()`获取`ArrayList`的大小 ```java import java.util.* ; diff --git a/docs/58.md b/docs/58.md index ed72853e1579589fe84cf5fcad28e8d650250147..4444f8da7b2f88173c7139a8b2b2faf4f56bb85d 100644 --- a/docs/58.md +++ b/docs/58.md @@ -1,4 +1,4 @@ -# Java LinkedList 示例 +# Java `LinkedList`示例 > 原文: [https://javatutorial.net/java-linkedlist-example](https://javatutorial.net/java-linkedlist-example) @@ -6,7 +6,7 @@ Java 中的 LinkedList 类使用双链表来存储元素,并且还提供了链 ![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg) -## 关于 Java 中的 LinkedList 的重要了解是什么 +## 关于 Java 中的`LinkedList`的重要了解是什么 * Java 中的 LinkedList 类允许重复的元素。 * Java 中的 LinkedList 类维护插入顺序。 @@ -14,12 +14,12 @@ Java 中的 LinkedList 类使用双链表来存储元素,并且还提供了链 * Java 中的 LinkedList 类允许快速操作,因为不需要进行任何移位。 * Java 中的 LinkedList 类可以是列表,堆栈甚至队列。 -## LinkedList 的局限性 +## `LinkedList`的局限性 * LinkedList 类比数组需要更多的内存,因为它们的指针使用存储。 * 由于我们不能仅通过它们的索引访问每个元素,因此很难遍历链接列表中的元素。 -## LinkedList 的简单说明 +## `LinkedList`的简单说明 ![LinkedList in Java](img/3cf099121bd42483c6449002786def95.jpg) @@ -27,12 +27,12 @@ Java 中的 LinkedList 这里的头是我上面提到的指针,该指针指向第一个元素。 第一个元素(以及链接列表中的每个单个元素)本质上具有两件事-数据和下一个。 数据只是指定元素包含的内容,其次是指向下一个元素的指针。 最后,在图示中我们可以看到 D 指向 NULL,在链接列表中,NULL 表示列表的末尾。 -## LinkedList 中的构造方法 +## `LinkedList`中的构造方法 1. LinkedList():用于构造一个空列表。 2. LinkedList(Collection <?扩展 E > c):用于构造一个包含指定集合元素的列表,这些元素按顺序由集合的迭代器返回。 -## LinksList 中的方法 +## `LinksList`中的方法 1. boolean add(E e):将指定的元素添加到列表的末尾。 2. void add(int index,E element):将指定的元素添加到指定的位置。 @@ -52,7 +52,7 @@ Java 中的 LinkedList 有关所有方法的文档,请访问 [Oracle 官方文档页面](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html)。 -### 使用 add()将元素添加到 LinkedList +### 使用`add()`将元素添加到`LinkedList` 语法:布尔值 add(E e) @@ -84,7 +84,7 @@ The list is:[Elephant, Tiger] The new List is:[Elephant, Tiger, Lion] ``` -### 使用 push()将元素推送到 LinkedList +### 使用`push()`将元素推送到`LinkedList` 语法:LinkedListObject.push(E e) @@ -115,7 +115,7 @@ public class PushExample { [Lion, Tiger, Elephant] ``` -### 使用 pop()从 LinkedList 弹出元素 +### 使用`pop()`从`LinkedList`弹出元素 语法:LinkedListObject.pop() @@ -155,7 +155,7 @@ Elephant [Elephant, Lion] ``` -### 使用 remove()从 LinkedList 移除元素 +### 使用`remove()`从`LinkedList`移除元素 语法:LinkedList.remove() @@ -191,7 +191,7 @@ LinkedList:[Elephant, Tiger, Lion] Final LinkedList:[Tiger, Lion] ``` -### 使用 clear()清除链接列表 +### 使用`clear()`清除链接列表 ```java import java.io.*; @@ -230,7 +230,7 @@ After clear: [] After adding elements to empty list:[Elephant, Tiger, Lion] ``` -### 使用 contains()检查 LinkedList 中是否存在元素 +### 使用`contains()`检查`LinkedList`中是否存在元素 语法:LinkedList.contains(对象元素) @@ -262,7 +262,7 @@ Is 'Lion' in the linkedlist: true Is 'Cat' in the linkedlist: false ``` -### 使用 size()获取 LinkedList 的大小 +### 使用`size()`获取`LinkedList`的大小 语法:LinkedList.size() diff --git a/docs/59.md b/docs/59.md index 2e7a4355f8c55771a43b35fef269a0f45f79ad25..614cef191f09b8d882a5be975f646f1b5fac0017 100644 --- a/docs/59.md +++ b/docs/59.md @@ -1,4 +1,4 @@ -# Java HashSet 示例 +# Java `HashSet`示例 > 原文: [https://javatutorial.net/java-hashset-example](https://javatutorial.net/java-hashset-example) @@ -6,7 +6,7 @@ ![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg) -## 有关 HashSet 的重要信息 +## 有关`HashSet`的重要信息 * HashSet 通过使用称为**散列的机制来存储元素。** * HashSet 中不能存在重复的元素。 @@ -16,7 +16,7 @@ * 就搜索操作而言,由于 HashSet 具有恒定的时间复杂性,因此它是最好的方法。 * HashSet 的初始默认容量为 16,而负载系数为 0.75。 -## HashSet 结构的简单图 +## `HashSet`简单的结构图 ![hashset in java](img/8d88c8914494e655c806585a31c797f3.jpg) @@ -24,7 +24,7 @@ Java 中的 HashSet 我们放入 HashMap 中的每个对象都首先通过哈希算法发送。 该算法的唯一目的是为传递给它的每个对象生成一个称为**哈希**的唯一编号。 在上图中,此算法为 String Lisa Morgan 生成了数字 3,为 Bob Wiliams 生成了数字 2,为 Jane Smith 生成了数字 1。 以后,这些数字将作为索引存储在数组中。 每当您要对 HashSet 中的元素执行任何类型的操作时,您都将通过由哈希算法生成的索引来解决它们。 这就是 HashSet 以随机顺序返回元素的原因。 哈希号是 HashSet 知道的唯一顺序。 -## HashSet 中的构造方法 +## `HashSet`中的构造方法 1. HashSet hashSet = new HashSet(); 2. HashSet hashSet = new HashSet(int initialCapacity); @@ -33,7 +33,7 @@ Java 中的 HashSet 这些构造函数之间的主要区别在于,在#1 构造函数中,初始容量为 16,默认负载因子为 0.75,但在#2 中,您实际上可以设置容量。 负载系数的默认值仍为 0.75。 在构造函数 3 中,您可以设置容量和负载系数。 -## HashSet 类中的方法 +## `HashSet`类中的方法 1. boolean add(Object o):用于添加作为参数提供的元素,如果不存在,则返回 false。 2. void clear():用于删除所有元素。 @@ -46,7 +46,7 @@ Java 中的 HashSet 有关所有方法的文档,请访问 [Oracle 官方文档页面](https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html)。 -### 使用 add()在 HashSet 中添加元素 +### 使用`add()`在`HashSet`中添加元素 语法:HashSet.add(Object o); @@ -76,7 +76,7 @@ public class HashSetExample { HashSet: [Elephant, Tiger, Lion] ``` -### 使用 clear()清除 HashSet +### 使用`clear()`清空`HashSet` 语法:HashSet.clear(); @@ -113,7 +113,7 @@ HashSet: [Elephant, Tiger, Lion] The final set: [] ``` -### 使用 contains()检查 HashSet 中是否存在元素 +### 使用`contains()`检查`HashSet`中是否存在元素 语法:Hash_Set.contains(对象 o) @@ -159,7 +159,7 @@ Does the Set contain 'Tiger'? true Does the Set contain 'Chicken'? false ``` -### 使用 remove()从 HashSet 中删除元素 +### 使用`remove()`从`HashSet`中删除元素 语法:HashSet.remove(Object o) @@ -196,7 +196,7 @@ HashSet: [Elephant, Tiger, Lion] HashSet after removing elements: [Tiger] ``` -### Iterator()方法 +### `Iterator()`方法 语法:迭代器迭代器= HashSet.iterator(); @@ -239,7 +239,7 @@ Tiger Lion ``` -### 使用 isEmpty()检查 HashSet 是否为空 +### 使用`isEmpty()`检查`HashSet`是否为空 语法:HashSet.isEmpty(); @@ -279,7 +279,7 @@ Is the hash set empty: false Is the hash set empty: true ``` -### **使用 size()获取 HashSet 的大小** +### 使用`size()`获取`HashSet`的大小 语法:HashSet.size(); @@ -313,7 +313,7 @@ HashSet: [Elephant, Tiger, Lion] The size of the hash set is: 3 ``` -### 使用 clone()克隆 HashSet +### 使用`clone()`克隆`HashSet` 语法:HashSet.clone() @@ -352,7 +352,7 @@ HashSet: [Elephant, Tiger, Lion] The new set: [Elephant, Tiger, Lion] ``` -## 如何通过 HashSet 进行迭代 +## 如何迭代`HashSet` 有两种方法可以遍历 HashSet: diff --git a/docs/70.md b/docs/70.md index 69dee2e2a127848296029b05c13338196f793cdd..1b92095051528d5e9adbd8c6b199a4a41e5c0f32 100644 --- a/docs/70.md +++ b/docs/70.md @@ -10,7 +10,7 @@ SortedMap 接口扩展了[映射](https://docs.oracle.com/javase/7/docs/api/java ![SortedMap java example](img/2cbcd0c2dfa54d32469403edc28b2a77.jpg) -## **方法摘要** +## 方法摘要 1. 比较器<? super K >比较器():返回用于对当前映射中的键进行排序的比较器;如果当前映射使用其键的自然顺序,则返回 null。 2. Set < Map.Entry < K,V > > entrySet():返回当前地图中包含的映射的 Set 视图。 diff --git a/docs/71.md b/docs/71.md index 206c05efd7a876ad804a92ecaf6a4fce2abf0ca0..0ac7adb3b5f786d07e28e6c318dc41038d7e7b54 100644 --- a/docs/71.md +++ b/docs/71.md @@ -45,7 +45,7 @@ ConcurrentMap 有关 EnumSet 主要方法的更多信息,请随时访问原始 [Oracle 文档](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html)。 -## **使用上述某些方法的示例程序** +## 使用上述某些方法的示例程序 ```java import java.util.concurrent.*; diff --git a/docs/81.md b/docs/81.md index c261ebd5cc6d611e965498b014536625eb2b8104..c60aa7ebe2443a97c4119af69e79d73252f382a8 100644 --- a/docs/81.md +++ b/docs/81.md @@ -32,7 +32,7 @@ writeObject()方法序列化对象并将其发送到输出流。 如果序 ![write_readObject java example](img/85d504b7ceeaa257a6ec3009bc63f394.jpg) -## **Java 序列化示例** +## Java 序列化示例 **DemoObject.java** @@ -144,7 +144,7 @@ Main.java 强制转换 writeObject 和 readObject 并基本上将错误处理并 您可以忽略它或将您的 IDE 配置为自动生成 ID。 我总是建议让您的 IDE 为您创建唯一的标识符。 -## **什么时候需要序列化** +## 什么时候需要序列化 序列化是一种通用且有效的协议,可在组件之间传输对象。 序列化用于遵循此协议传输对象。 diff --git a/docs/83.md b/docs/83.md index b8a50041a68b63c94a2c900d20ab54e72d9c681b..9075245dd7802dbb7879254bccb7e269d7e8f049 100644 --- a/docs/83.md +++ b/docs/83.md @@ -21,7 +21,7 @@ Java 中有 4 种引用类型: 弱引用需要显式声明,因为默认情况下,Java 将引用标记为强引用。 -## **什么是较弱的可达性?** +## 什么是较弱的可达性? 这意味着一个对象既没有强引用也没有软引用指向它,并且只能通过遍历弱引用来访问。 @@ -29,7 +29,7 @@ Java 中有 4 种引用类型: 垃圾收集器删除了弱引用之后,将该引用放入引用队列中,并最终确定以前弱可访问的对象。 -## **弱引用在哪里使用?** +## 弱引用在哪里使用? * 弱引用主要用于**规范化映射的实现中。** 规范化映射是指映射仅包含特定值的一个实例。 @@ -39,9 +39,9 @@ Java 中有 4 种引用类型: 私有静态类 TryingOut < K,V >扩展了 WeakReference <对象>实现 Map.Entry < K,V > -* 失效侦听器问题也使用弱引用。 在这种情况下,可以通过弱引用来处理内存泄漏问题。 +* 失效监听器问题也使用弱引用。 在这种情况下,可以通过弱引用来处理内存泄漏问题。 -## **实现弱引用:** +## 实现弱引用: <u>java.lang.ref.WeakReference</u> 类在处理和创建弱引用时使用。