提交 6752ab9f 编写于 作者: W wizardforcel

2020-05-22 11:44:53

上级 39034694
......@@ -2,11 +2,11 @@
> 原文: [https://howtodoinjava.com/java8/java-8-string-join-csv-example/](https://howtodoinjava.com/java8/java-8-string-join-csv-example/)
到目前为止,直到 [**java 7**](//howtodoinjava.com/category/java-7/ "java 7") 为止,我们都具有 [**String.split()**](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29) 方法,该方法可以基于作为参数传递的某些标记来分割字符串 。 它返回字符串标记列表作为字符串数组。 但是,如果您想通过使用字符串之间的分隔符来连接字符串令牌或通过使用字符串之间的分隔符来创建 CSV,则必须遍历字符串列表或字符串数​​组,然后使用 [**StringBuilder**](//howtodoinjava.com)[**StringBuffer**](https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html) 对象连接这些字符串标记并最终获得 **CSV**
到目前为止,直到 [**java 7**](//howtodoinjava.com/category/java-7/ "java 7") 为止,我们都具有[`String.split()`](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29)方法,该方法可以基于作为参数传递的某些标记来分割字符串 。 它返回字符串标记列表作为字符串数组。 但是,如果您想通过使用字符串之间的分隔符来连接字符串令牌或通过使用字符串之间的分隔符来创建 CSV,则必须遍历字符串列表或字符串数​​组,然后使用[`StringBuilder`](//howtodoinjava.com)[`StringBuffer`](https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html)对象连接这些字符串标记并最终获得 **CSV**
## 使用 join()的字符串连接(CSV)
## 使用`join()`的字符串连接(CSV)
Java 8 使这项任务变得容易。 现在,您有了 [**String.join()**](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#join-java.lang.CharSequence-java.lang.Iterable-) 方法,其中**第一个参数是分隔符**,然后您可以传递**多个字符串或具有字符串实例的 Iterable 实例作为第二个参数**。 它将返回 CSV 作为返回值。
Java 8 使这项任务变得容易。 现在,您有了[**`String.join()`**](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#join-java.lang.CharSequence-java.lang.Iterable-)方法,其中**第一个参数是分隔符**,然后您可以传递**多个字符串或具有字符串实例的`Iterable`实例作为第二个参数**。 它将返回 CSV 作为返回值。
```java
package java8features;
......
......@@ -19,9 +19,9 @@ Java 示例**计算 Java 8** 中两个日期之间的差。 首先,我们将
```
#### 例
####
大家都更喜欢可读性,我建议使用 [**Jodatime**](http://www.joda.org/joda-time/) 库(实际上启发了 [Java 8 日期/时间 API](https://howtodoinjava.com/java8/date-and-time-api-changes-in-java-8-lambda/) )。 例如
大家都更喜欢可读性,我建议使用 [**Jodatime**](http://www.joda.org/joda-time/) 库(实际上启发了 [Java 8 日期/时间 API](https://howtodoinjava.com/java8/date-and-time-api-changes-in-java-8-lambda/))。 例如:
```java
public void difference_between_two_dates_duration_Joda()
......@@ -37,11 +37,11 @@ public void difference_between_two_dates_duration_Joda()
## 2\. Java 8 – 两个日期之间的差额
Java Date 一直缺乏足够的支持来有效地表达日期和时间段。 Java 8 首次尝试升级此日期/时间 API。 如果您在项目中使用 Java 8,则一定要使用以下两种方法之一来计算两个日期之间的日期/时间差。
Java `Date`一直缺乏足够的支持来有效地表达日期和时间段。 Java 8 首次尝试升级此日期/时间 API。 如果您在项目中使用 Java 8,则一定要使用以下两种方法之一来计算两个日期之间的日期/时间差。
#### 2.1 java.time.Period 示例,以了解天/月/年的差异
#### 2.1 `java.time.Period`示例,以了解天/月/年的差异
Java 程序使用**期间**类获取在两天之间的**差。**
Java 程序使用`Period`类获取在两天之间的**差。**
```java
LocalDate endofCentury = LocalDate.of(2014, 01, 01);
......@@ -54,9 +54,9 @@ System.out.printf("Difference is %d years, %d months and %d days old",
```
#### 2.2 java.time.temporal.ChronoUnit 示例,以了解天/月/年的差异
#### 2.2 `java.time.temporal.ChronoUnit`示例,以了解天/月/年的差异
Java 程序使用 **ChronoUnit** 类来获取两个月之间的日期之间的**差异。**
Java 程序使用`ChronoUnit`类来获取两个月之间的日期之间的**差异**
```java
public void difference_between_two_dates_java8()
......@@ -69,7 +69,7 @@ public void difference_between_two_dates_java8()
}
```
您可以使用`ChronoUnit`了解较小时间单位中的**时差,例如 **毫秒**,**分钟**等。但是在这种情况下,您将不得不使用`LocalDateTime`代替在第一个示例中使用的`LocalDate`。**
您可以使用`ChronoUnit`了解较小时间单位中的时差,例如**毫秒****分钟**等。但是在这种情况下,您将不得不使用`LocalDateTime`代替在第一个示例中使用的`LocalDate`
```java
public void difference_between_two_dates_duration()
......@@ -84,9 +84,9 @@ public void difference_between_two_dates_duration()
}
```
#### 2.3 java.time.Duration 示例了解毫秒/秒/分钟等的差异
#### 2.3 `java.time.Duration`示例了解毫秒/秒/分钟等的差异
Java 程序使用**持续时间**类来获取以毫秒为单位的两个日期之间的**差。**
Java 程序使用`Duration`类来获取以毫秒为单位的两个日期之间的**差**
```java
public void difference_between_two_dates_duration()
......@@ -101,6 +101,6 @@ public void difference_between_two_dates_duration()
}
```
最重要的是,这三种方式都具有足够的可读性和灵活性,可以知道多个时间单位之间的日期差异。 可以随意使用以上程序来使用**等用例,以计算 Java** 中两个日期之间的天数。
最重要的是,这三种方式都具有足够的可读性和灵活性,可以知道多个时间单位之间的日期差异。 可以随意在用例中使用以上程序,**以计算 Java** 中两个日期之间的天数。
学习愉快!
\ No newline at end of file
......@@ -4,7 +4,7 @@
## 外部迭代
直到 Java 7 为止,[集合框架](//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/ "Useful java collection interview questions")都依赖于外部迭代的概念,其中 Collection 通过实现 Iterable 提供枚举其元素(即 Iterator)的方法,并且客户端使用它顺序地遍历了集合。 例如,如果我们想将所有字符串都大写,则可以这样写:
直到 Java 7 为止,[集合框架](//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/ "Useful java collection interview questions")都依赖于外部迭代的概念,其中集合通过实现`Iterable`提供枚举其元素(即`Iterator`)的方法,并且客户端使用它顺序地遍历了集合。 例如,如果我们想将所有字符串都大写,则可以这样写:
```java
public class IterationExamples {
......@@ -37,12 +37,13 @@ public class IterationExamples {
以上两个代码段均用于外部迭代。 外部迭代非常简单,但是存在几个问题:
1)Java 的 for-each 循环/迭代器本质上是顺序的,必须按集合指定的顺序处理元素。
1)Java 的`for-each`循环/迭代器本质上是顺序的,必须按集合指定的顺序处理元素。
2)它限制了管理控制流的机会,该控制流可能能够通过利用数据的重新排序,并行性,短路或惰性来提供更好的性能。
## 内部迭代
有时需要 for-each 循环的强力保证(顺序,顺序),但通常只是性能的劣势。 外部迭代的替代方法是内部迭代,客户端让它由库处理而不是控制迭代,而仅提供必须对所有/某些数据元素执行的代码。
有时需要`for-each`循环的强力保证(顺序,顺序),但通常只是性能的劣势。 外部迭代的替代方法是内部迭代,客户端让它由库处理而不是控制迭代,而仅提供必须对所有/某些数据元素执行的代码。
上一个示例的内部迭代等效项是:
......@@ -57,7 +58,7 @@ public class IterationExamples {
```
Where external iteration mixes the “what” (uppercase) and the “how” (for loop/iterator), internal iteration lets the client to provide only the “what” but lets the library control the “how”. This offers several potential benefits: client code can be clearer because it need only focus on stating the problem, not the details of how to go about solving it, and we can move complex optimization code into libraries where it can benefit all users.
在外部迭代将“做怎么”(大写)和“怎么做”(`for`循环/迭代器)混合使用的情况下,内部迭代使客户端仅提供“做怎么”,而由库控制“怎么做”。 这提供了许多潜在的好处:客户端代码可以更加清晰,因为它只需要关注于陈述问题,而不是解决问题的细节,并且我们可以将复杂的优化代码移到可以使所有用户受益的库中。
这就是关于内部与外部迭代的全部内容。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/java8/secure-random-number-generation/](https://howtodoinjava.com/java8/secure-random-number-generation/)
如果您已经开发软件已有一段时间,那么您就会知道如何使用 Java 的 **SecureRandom** 类甚至甚至安全地生成随机数。 不幸的是,生成*安全随机数*并不像简单地使用`SecureRandom`那样容易。
如果您已经开发软件已有一段时间,那么您就会知道如何使用 Java 的`SecureRandom`类甚至甚至安全地生成随机数。 不幸的是,生成*安全随机数*并不像简单地使用`SecureRandom`那样容易。
在此 Java 示例中,我们组装了一个简单的清单,以帮助您在应用程序中使用安全随机数时获得成功。
......@@ -10,7 +10,7 @@
## 1\. 如何生成安全的随机数
通常,随机数的生成取决于熵(随机性)的来源,例如信号,设备或硬件输入。 在 Java 中, **java.security.SecureRandom** 类被广泛用于生成密码强的随机数。
通常,随机数的生成取决于熵(随机性)的来源,例如信号,设备或硬件输入。 在 Java 中,`java.security.SecureRandom`类被广泛用于生成密码强的随机数。
确定性随机数已成为许多软件安全漏洞的根源。 这个想法是,给定几个随机数样本,对手(黑客)应该无法确定原始种子。 如果违反了此限制,则对手可能会成功预测所有将来的随机数。
......@@ -43,7 +43,7 @@ public class Main
#### 2.1 确定性能标准和工作负载平衡
如果性能是首要考虑因素,请使用`SHA1PRNG`,它是`/dev/urandom`的种子。 **SHA1PRNG 可以比 NativePRNG** 快 17 倍,但播种选项是固定的。
如果性能是首要考虑因素,请使用`SHA1PRNG`,它是`/dev/urandom`的种子。`SHA1PRNG`可以比`NativePRNG`快 17 倍,但播种选项是固定的。
使用`NativePRNG`进行播种更加灵活,但是如果服务器上的熵不够大(因为它从`/dev/random`读取),它将阻止。 如果您不知道从哪里开始,请从`SHA1PRNG`开始。
......@@ -59,11 +59,11 @@ SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
以下是 SUN 提供程序的 PRNG 列表:
* **SHA1PRNG** (目前,初始播种是通过系统属性和 java.security 熵收集设备的组合完成的)
* **NativePRNG** (nextBytes()使用/ dev / urandom,generateSeed()使用/ dev / random
* **NativePRNGBlocking** (nextBytes()和 generateSeed()使用/ dev / random
* **NativePRNGNonBlocking** (nextBytes()和 generateSeed()使用/ dev / urandom
* **NativePRNGBlocking****NativePRNGNonBlocking** 在 JRE 8+中可用。
* **`SHA1PRNG`**(目前,初始播种是通过系统属性和`java.security`熵收集设备的组合完成的)
* **`NativePRNG`**`nextBytes()`使用`/dev/urandom``generateSeed()`使用`/dev/random`
* **`NativePRNGBlocking`**`nextBytes()``generateSeed()`使用`/dev/random`
* **`NativePRNGNonBlocking`**`nextBytes()``generateSeed()`使用`/dev/urandom`
* **`NativePRNGBlocking`****`NativePRNGNonBlocking`**在 JRE 8+ 中可用。
有关其他提供程序的信息,请参见 [Java 密码架构 JDK 8 的 Oracle 提供程序文档](https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html)。 Oracle 还提供了按 OS 平台描述提供程序的文档。
......@@ -76,15 +76,15 @@ SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
sr.setSeed(SecureRandom.generateSeed(int))
```
如果种子泄漏,定期重新播种可防止数据泄露。 如果使用 SHA1PRNG,则始终在创建 PRNG 的新实例后立即调用`java.security.SecureRandom.nextBytes(byte[])`
如果种子泄漏,定期重新播种可防止数据泄露。 如果使用`SHA1PRNG`,则始终在创建 PRNG 的新实例后立即调用`java.security.SecureRandom.nextBytes(byte[])`
#### 2.4 降低可预测性
如果为`egdSource``java.security`文件中的配置参数或`java.security.egd`系统属性分配了可预测的文件/ URL,则 SecureRandom 可以变为可预测的。
如果为`egdSource``java.security`文件中的配置参数或`java.security.egd`系统属性分配了可预测的文件/ URL,则`SecureRandom`可以变为可预测的。
#### 2.5 修补旧版 Java
低于 1.4.2 的 JRE 版本在生成 SHA1PRNG 安全种子方面存在已知问题。 再说一次,如果您使用的 Java 版本如此之旧,则存在更大的安全隐患。
低于 1.4.2 的 JRE 版本在生成`SHA1PRNG`安全种子方面存在已知问题。 再说一次,如果您使用的 Java 版本如此之旧,则存在更大的安全隐患。
Java 的旧版本非常不安全,因此更新补丁程序非常重要。 确保客户安全的最佳方法之一是针对可能出现的最新 [Oracle 重要补丁更新](https://www.oracle.com/technetwork/topics/security/alerts-086861.html)快速认证您的软件。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册