提交 1374b05b 编写于 作者: W wizardforcel

2019-11-28 15:56:05

上级 37eda90b
......@@ -12,21 +12,21 @@
创建的字节流与平台无关。 这意味着,如果对象在一个平台上序列化,则可以在另一个平台上反序列化。
**ObjectInputStream****ObjectOutputStrem** 是高级流,其中包含用于序列化和反序列化对象的方法。
`ObjectInputStream``ObjectOutputStrem`是高级流,其中包含用于序列化和反序列化对象的方法。
**ObjectInputStream** 提供了一个称为 readObject()的方法,该方法可检索对象并将其反序列化。 它返回一个 Object 值,这意味着它将需要强制转换为适当的数据类型。 它抛出 IOException
`ObjectInputStream`提供了一个称为`readObject()`的方法,该方法可检索对象并将其反序列化。 它返回一个`Object`值,这意味着它将需要强制转换为适当的数据类型。 它抛出`IOException`
```java
public final Object readObject()
```
**ObjectOutputStream** 提供了许多写入方法,但使用最广泛的是
`ObjectOutputStream`提供了许多写入方法,但使用最广泛的是
```java
public final void writeObject(Object object)
```
writeObject()方法序列化对象并将其发送到输出流。 如果序列化出错,则可能会引发 IOException
`writeObject()`方法序列化对象并将其发送到输出流。 如果序列化出错,则可能会引发`IOException`
因此,为了可视化这些方法的确切位置,让我们在上面的图片中显示它们。
......@@ -34,7 +34,7 @@ writeObject()方法序列化对象并将其发送到输出流。 如果序
## Java 序列化示例
**DemoObject.java**
`DemoObject.java`
```java
import java.io.*;
......@@ -58,7 +58,7 @@ public class DemoObject implements java.io.Serializable {
}
```
**Main.java**
`Main.java`
```java
import java.io.*;
......@@ -132,9 +132,9 @@ Age = 19
**以上**的代码实现的细分
我们有一个 DemoObject 类,它是一个虚拟类,将对其进行序列化然后反序列化。 它有 2 个实例变量,我们称为名称和年龄。 我们可以将这些变量设置为公开,但是我们希望始终保持安全,因此在上面的示例中将它们声明为私有。
我们有一个`DemoObject`类,它是一个虚拟类,将对其进行序列化然后反序列化。 它有 2 个实例变量,我们称为名称和年龄。 我们可以将这些变量设置为公开,但是我们希望始终保持安全,因此在上面的示例中将它们声明为私有。
Main.java 强制转换 writeObject 和 readObject 并基本上将错误处理并打印到控制台。 在示例中,我们有一个设置为 null 的对象。 设置为 null 是因为它充当反序列化对象的“占位符”。 基本上,我们可以将反序列化的对象复制到该空对象中。
`Main.java`强制转换`writeObject``readObject`并基本上将错误处理并打印到控制台。 在示例中,我们有一个设置为`null`的对象。 设置为`null`是因为它充当反序列化对象的“占位符”。 基本上,我们可以将反序列化的对象复制到该空对象中。
![null object purpose java example serialized deserialized](img/ca17cacf7d30811b711ae33ceda98ce2.jpg)
......
......@@ -8,11 +8,11 @@
![Reflection api java](img/f1a36e57cfb794af81dfb126951e1e76.jpg)
默认情况下,Java 中的每个对象都有 getClass(),它基本上确定当前对象的类(即使在编译时未知)。
默认情况下,Java 中的每个对象都有`getClass()`,它基本上确定当前对象的类(即使在编译时未知)。
反射使您可以编写在编译时不必“识别”所有内容的程序,而可以使程序动态化,因为它们可以在运行时链接在一起。
**Java Reflection** 的简短示例
## Java 反射的简短示例
```java
import java.lang.reflect.*;
......@@ -39,9 +39,9 @@ public class Main {
}
```
在这里,class.forName 为我们提供了指定的类,然后,它调用 getDeclaredMethods,其目的是检索在该类中定义的方法的列表。
在这里,`class.forName`为我们提供了指定的类,然后,它调用`getDeclaredMethods`,其目的是检索在该类中定义的方法的列表。
方法 m []存储我们要在其上调用该方法的类的所有已声明方法,在这种情况下为 String
方法`m[]`存储我们要在其上调用该方法的类的所有已声明方法,在这种情况下为`String`
尝试并在这里捕获是必需的,就好像您没有它一样,您会收到此错误:
......@@ -129,9 +129,9 @@ public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
public java.lang.String java.lang.String.trim()
```
从输出中可以看到,String 有很多方法。
从输出中可以看到,`String`有很多方法。
**设置反射**
## 设置反射
1. 首先,必须获得一个类对象。 获得它的最常见方法是
......@@ -139,10 +139,10 @@ public java.lang.String java.lang.String.trim()
Class class = Class.forName("java.lang.'class name, for example String'");
```
2. 下一步是调用方法(例如 getDeclaredMethods(),getFields()等)
3. 下一步是使用 Reflection API 来操纵/更改信息
2. 下一步是调用方法(例如`getDeclaredMethods()``getFields()`等)
3. 下一步是使用反射 API 来操纵/更改信息
**另一个示例,遵循上述**的步骤
## 另一个示例,遵循上述的步骤
```java
import java.lang.reflect.*;
......
......@@ -8,12 +8,12 @@
Java 中有 4 种引用类型:
1.大的参考
2. 参考不足
3.参考
4. 幻影参考
1.引用
2. 弱引用
3.引用
4. 幻影引用
在这里,我们将讨论弱参考
在这里,我们将讨论弱引用
弱引用与 Java 中的垃圾收集有关。 [垃圾收集](https://javatutorial.net/java-garbage-collection)只是从内存中自动取消分配未引用对象的方法。
......@@ -31,19 +31,19 @@ Java 中有 4 种引用类型:
## 弱引用在哪里使用?
* 弱引用主要用于**规范化映射的实现中。** 规范化映射是指映射仅包含特定值的一个实例。
* 弱引用主要用于**规范化映射的实现中**规范化映射是指映射仅包含特定值的一个实例。
* 弱引用还广泛用于 [WeakHashMap](https://javatutorial.net/java-weakhashmap-example) 类中。 这是 Map 接口的实现,其中每个键值都存储为弱引用。 键值对扩展了 WeakReference 类。 因此,垃圾收集器删除此键也会导致实体也被删除。
* 弱引用还广泛用于[`WeakHashMap`](https://javatutorial.net/java-weakhashmap-example)类中。 这是`Map`接口的实现,其中每个键值都存储为弱引用。 键值对扩展了`WeakReference`类。 因此,垃圾收集器删除此键也会导致实体也被删除。
代码示例:
私有静态类 TryingOut < K,V >扩展了 WeakReference <对象>实现 Map.Entry < K,V >
私有静态类`TryingOut<K, V>`扩展了`WeakReference<Object>`实现`Map.Entry<K, V>`
* 失效监听器问题也使用弱引用。 在这种情况下,可以通过弱引用来处理内存泄漏问题。
## 实现弱引用:
java.lang.ref.WeakReference 类在处理和创建弱引用时使用。
`java.lang.ref.WeakReference`类在处理和创建弱引用时使用。
可以使用弱引用的一种实际的实际场景是在建立数据库连接时使用,当使用数据库的应用程序关闭时,垃圾收集器可能会清除该数据库连接。
......
......@@ -2,7 +2,7 @@
> 原文: [https://javatutorial.net/java-8-date-time-api](https://javatutorial.net/java-8-date-time-api)
Java 8 引入了新的 Date-Time API,其目的是弥补旧的 date-time API 的缺点。
Java 8 引入了新的日期时间 API,其目的是弥补旧的日期时间 API 的缺点。
![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)
......@@ -10,10 +10,10 @@ Java 8 引入了新的 Date-Time API,其目的是弥补旧的 date-time API
新的 API 不仅解决了所有这些问题,而且还引入了`java.time`包中的 2 个重要类:
* 本地 –时区处理没有复杂度
* 分区的 –处理各种时区的更复杂的日期时间 API
* 本地 – 时区处理没有复杂度
* 时区 – 处理各种时区的更复杂的日期时间 API
**地时间 API** 在不需要时区时应使用
**地时间 API** 在不需要时区时应使用
**使用主要方法调用**的本地日期时间 API 的示例
......@@ -60,7 +60,7 @@ Day: 20
Seconds: 58
```
**区日期时间 API 示例**
**区日期时间 API 示例**
```java
import java.time.ZonedDateTime;
......@@ -90,7 +90,7 @@ ZoneId: Europe/Paris
CurrentZone: Europe/London
```
如您所见,区日期时间 API 可以让您访问特定时区,还可以为您提供时区或系统的默认时区。
如您所见,区日期时间 API 可以让您访问特定时区,还可以为您提供时区或系统的默认时区。
**计时单位示例**
......@@ -135,9 +135,9 @@ Current date: 2019-07-20
```
**期限和持续时间**
**周期和持续时间**
期间处理基于日期的时间,而持续时间处理基于时间的时间。
周期处理基于日期的时间,而持续时间处理基于时间的时间。
```java
import java.time.temporal.ChronoUnit;
......
......@@ -10,17 +10,17 @@
## 字符串类中的正则表达式方法
Java 8 中的 String 类具有一些使用正则表达式(或 regex)的方法。 这是此方法的列表。 有关更多详细信息,您可以在中检查[字符串 javadoc。](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)
Java 8 中的`String`类具有一些使用正则表达式(或 regex)的方法。 这是此方法的列表。 有关更多详细信息,您可以在中检查[字符串 javadoc](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)
* **boolean String.matches(String regex )**判断此字符串是否与给定的正则表达式匹配
* **字符串 replaceAll(字符串正则表达式,字符串替换)**用给定的替换项替换与给定的正则表达式匹配的此字符串的每个子字符串
* **字符串 replaceFirst(字符串正则表达式,字符串替换)**用给定的替换替换与给定的正则表达式匹配的此字符串的第一个子字符串
* **String [] split(String regex )**围绕给定正则表达式的匹配项拆分此字符串
* **String [] split(字符串正则表达式, int 限制)**围绕给定正则表达式的匹配项拆分此字符串。 模式被“限制”应用了次数
* `boolean String.matches(String regex)`判断此字符串是否与给定的正则表达式匹配
* `String replaceAll(String regex, String replacement)`用给定的替换项替换与给定的正则表达式匹配的此字符串的每个子字符串
* `String replaceFirst(String regex, String replacement)`用给定的替换替换与给定的正则表达式匹配的此字符串的第一个子字符串
* `String[] split(String regex)`围绕给定正则表达式的匹配项拆分此字符串
* `String[] split(String regex, int limit)`围绕给定正则表达式的匹配项拆分此字符串。 模式被“限制”应用了次数
## 匹配一个字符
假设我们有以下字符串:“你好,是我”,我们想用空格分隔其中的单词。
假设我们有以下字符串:`"Hello, it’s me"`,我们想用空格分隔其中的单词。
```java
String str = "Hello, it's me";
......@@ -38,7 +38,7 @@ it's
me
```
但是,如果我们像这样在“它”和“我”之间放置两个空格怎么办:“你好,它是我”
但是,如果我们像这样在`"it's"``"me"`之间放置两个空格怎么办:`"Hello, it’s me"`
我们程序的输出将是:
......@@ -53,11 +53,11 @@ me
## 重复
+号表示在同一行中匹配 1 个或多个。
`+`号表示在同一行中匹配 1 个或多个。
让我们回到前面的示例“你好,它是我”,在“它”和“我”之间有两个空格。
让我们回到前面的示例`"Hello, it’s me"`,在`"it’s"``"me"`之间有两个空格。
在我们的代码中,我们将模式更改为“ +”。 在这种情况下,我们将连续匹配 1 个或多个空格
在我们的代码中,我们将模式更改为` +`。 在这种情况下,我们将连续匹配 1 个或多个空格
```java
String str = "Hello, it's me";
......@@ -77,59 +77,83 @@ me
## 连接
使用正则表达式,我们可以连续匹配一个字符串或多个字符,并以此作为正则表达式模式。 例如,模式“ ing”将匹配如下:
使用正则表达式,我们可以连续匹配一个字符串或多个字符,并以此作为正则表达式模式。 例如,模式`ing`将匹配如下:
“赚取和钱很容易,因为和算是 1 233。不!!”
```java
"Earning money is easy as counting 1 2 33. Nah!"
***
```
换句话说,如果在我们的字符串中提供“ ing”,则该字符串匹配。
换句话说,如果在我们的字符串中提供`ing`,则该字符串匹配。
## 结合连接和重复
模式:“ ar +”将匹配
模式:`ar+`将匹配
“ 和欠 ar e 的速度不如子弹快”
```java
"arrows are not as fast as bullets"
*** **
```
## 匹配零个或多个
模式:“ it *将匹配
模式:`"it*"`将匹配
“ 很有趣,只需在计算机正面学习 itti ng 和”
```java
"it‘s fun to learn just sitting in front of my computer"
** **** *
```
*(星号)将匹配“ i”,后跟零个或多个“ t”。 在我们的示例中,它将匹配“ it”,“ itt”,“ i”,“ i”
`*`(星号)将匹配`i`,后跟零个或多个`t`。 在我们的示例中,它将匹配`it``itt``i``i`
## 交替
模式:“ ea | in”将匹配
模式:`ea|in`将匹配
“ g 中的或 rn 等于 g 中的计数 sy 1 233。不!!”
```java
"earning money is easy as counting 1 2 33. Nah!"
** ** ** **
```
| (竖线符号)将匹配“ ea”或“ in”
`|`(竖线符号)将匹配`ea``in`
## 字符类
模式:“ [123]”将匹配
模式:`[123]`将匹配
“赚钱很容易,只需计算 1 2 33 即可。 不!
```java
"Earning money is easy as counting 1 2 33. Nah!"
* * **
```
[]匹配集合中的任何字符
`[]`匹配集合中的任何字符
## 匹配范围
模式:“ [1-3]”将匹配
模式:`[1-3]`将匹配
“赚钱很容易,只需计算 1 2 33 即可。 不!
```java
"Earning money is easy as counting 1 2 33. Nah!"
* * **
```
模式:“ [a-f]”将匹配
模式:`[a-f]`将匹配
“ E 和表示为 e y 是 a sy a 计数为 1 233。N a H!
```java
"Earning money is easy as counting 1 2 33. Nah!"
* * * * *
```
## 排除字符
模式:“ [^ a-z123]”将匹配
模式:`[^a-z123]`将匹配
“ E 赚钱很容易,因为计算 1 2 33 。 N 啊!
```java
"Earning money is easy as counting 1 2 33. Nah!"
* * * *
```
^表示此集合中没有任何字符
`^`表示此集合中没有任何字符
## 验证电子邮件地址正则表达式
......
......@@ -4,7 +4,7 @@
有时您想知道硬盘上还剩下多少磁盘空间。 有几种方法可以做到这一点。 在此示例中,我将向您展示如何使用 Apache Commons 来实现此目的。
您将需要 commons-io 来运行此示例。 您可以在 [apache 下载页面](http://commons.apache.org/proper/commons-io/download_io.cgi)上获得它,也可以使用 [Maven](https://javatutorial.net/how-to-install-maven-on-windows-linux-and-mac) 依赖项:
您将需要`commons-io`来运行此示例。 您可以在 [apache 下载页面](http://commons.apache.org/proper/commons-io/download_io.cgi)上获得它,也可以使用 [Maven](https://javatutorial.net/how-to-install-maven-on-windows-linux-and-mac) 依赖项:
```java
<dependency>
......
......@@ -26,20 +26,9 @@ System.out.println("Max memory: " + maxBytes / 1024 / 1024 + " MB");
您可以通过设置初始和最大堆大小来配置 Java 程序的内存使用量,如下所示:
```java
java
java -Xms<initial heap size> -Xmx<maximum heap size>
```
**-Xms**
```java
<initial heap size>
```
**-Xmx**
```java
<maximum heap size>
```
例如:
......@@ -51,9 +40,9 @@ java -Xms500m -Xmx6g myprogram
## 增加栈大小
在 Windows 上,默认线程栈大小是从二进制文件(java.exe)中读取的。 从 Java SE 6 开始,此值在 32 位 VM 中为 320k,在 64 位 VM 中为 1024k。 在 x86 Solaris / Linux 上,在 32 位 VM 中为 320k,在 64 位 VM 中为 1024k。
在 Windows 上,默认线程栈大小是从二进制文件(`java.exe`)中读取的。 从 Java SE 6 开始,此值在 32 位 VM 中为 320k,在 64 位 VM 中为 1024k。 在 x86 Solaris/Linux 上,在 32 位 VM 中为 320k,在 64 位 VM 中为 1024k。
您可以使用 **–** **Xss** 自变量来增加栈大小。
您可以使用`–Xss`自变量来增加栈大小。
例如:
......
......@@ -4,9 +4,9 @@
在本教程中,我将向您展示如何在 Java 中从属性文件存储和检索值。
在许多情况下,您可能希望为 Java 程序准备一个配置文件。 Java 在 **java.util.Properties** 中具有内置机制,可让您轻松访问和更改配置文件中的值。
在许多情况下,您可能希望为 Java 程序准备一个配置文件。 Java 在`java.util.Properties`中具有内置机制,可让您轻松访问和更改配置文件中的值。
属性由键和值对构成,二者均表示为 String 对象。 您可能会将属性视为持久性[哈希表](https://javatutorial.net/java-hashtable-example)
属性由键和值对构成,二者均表示为`String`对象。 您可能会将属性视为持久性[哈希表](https://javatutorial.net/java-hashtable-example)
## 将数据写入属性文件
......
......@@ -18,13 +18,13 @@
## 2.安装 Eclipse Oxygen
转到 [Eclipse 下载页面](https://www.eclipse.org/downloads/eclipse-packages/)并下载“ Java 开发人员的 Eclipse IDE”或“ Java EE 开发人员的 Eclipse IDE”
转到 [Eclipse 下载页面](https://www.eclipse.org/downloads/eclipse-packages/)并下载“Java 开发人员的 Eclipse IDE”或“Java EE 开发人员的 Eclipse IDE”
未归档的 Eclipse
**注意**:您将需要**预先安装在系统上的 [JDK 8](https://javatutorial.net/install-java-8-jdk-on-ubuntu)** 或更早版本。
如果 Java 9 是仅安装的 **Java 版** – Eclipse 将不会启动。 您将在 eclipse 日志文件中发现以下错误:
如果 Java 9 是仅安装的 **Java 版** – Eclipse 将不会启动。 您将在 eclipse 日志文件中发现以下错误:
```java
eclipse.buildId=4.7.0.I20170612-0950
......@@ -87,7 +87,7 @@ Caused by: java.lang.ClassNotFoundException: javax.annotation.PostConstruct cann
## 4.创建一个 Java 9 Eclipse 项目
打开 Eclipse 并转到 File-&gt; New-&gt; Java Project
打开 Eclipse 并转到“File -&gt; New -&gt; Java Project”
在“新建 Java 项目窗口”中,单击“配置 JRE ...”。
......@@ -95,19 +95,19 @@ Caused by: java.lang.ClassNotFoundException: javax.annotation.PostConstruct cann
Eclipse 新的 Java 项目窗口
在“ Installed JRE”窗口中,按“ Add…”按钮
在“Installed JRE”窗口中,按“Add…”按钮
![Eclipse add new JRE](img/3b9d8a1e1c28b89d6a0ea2044dfc7965.jpg)
Eclipse 添加新的 JRE
选择“标准 VM”,然后按“下一步&gt;”按钮
选择“标准 VM”,然后按“下一步 &gt;”按钮
![Eclipse select Standard VM](img/fb7d2df248e0a18dd4a12ab490b9aaa1.jpg)
Eclipse 选择标准 VM
在“ JRE 主目录”下,按“目录…”按钮,然后浏览并选择您的 JRE 9 根目录。 **注意**:如果您选择 JDK 目录,则将无法构建项目
在“JRE 主目录”下,按“目录…”按钮,然后浏览并选择您的 JRE 9 根目录。 **注意**:如果您选择 JDK 目录,则将无法构建项目
![Select JRE 9 directory](img/edc0244d2cc6d4f712107b98f1482cd3.jpg)
......@@ -119,7 +119,7 @@ Eclipse 选择标准 VM
完成 Java 9 安装
现在,在列表中选择 jre-9 并应用更改
现在,在列表中选择`jre-9`并应用更改
![Select java 9 as default JRE](img/ab56deb8edc988bb912801969172c3bc.jpg)
......@@ -133,4 +133,4 @@ Eclipse 选择标准 VM
现在您准备尝试一些 Java 9 新功能
您将在此处找到的许多教程都是基于 Edward Lavieri 博士和 Peter Verhas 博士撰写的 [Mastering Java 9](https://www.amazon.com/Mastering-Java-reactive-modular-concurrent/dp/1786468735/ref=sr_1_3?ie=UTF8&qid=1520921208&sr=8-3&keywords=mastering+java+9) 。 本书将为您提供对 Java 9 新概念和工具的完整而深刻的理解。
\ No newline at end of file
您将在此处找到的许多教程都是基于 Edward Lavieri 博士和 Peter Verhas 博士撰写的 [Mastering Java 9](https://www.amazon.com/Mastering-Java-reactive-modular-concurrent/dp/1786468735/ref=sr_1_3?ie=UTF8&qid=1520921208&sr=8-3&keywords=mastering+java+9)。 本书将为您提供对 Java 9 新概念和工具的完整而深刻的理解。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册