为了避免和源代码的文件夹的冲突

This commit is contained in:
2025-04-13 10:29:06 -04:00
parent 901d1b917d
commit c75fce0aea
79 changed files with 1 additions and 1 deletions
+18
View File
@@ -0,0 +1,18 @@
## Java 技术问题导航
Java 是由 Sun Microsystems 公司于 1995年5月推出的 Java 面向对象程序设计语言和 Java 平台的总称(Java 1.0 [J2SE])。
由 James Gosling和同事们共同研发,并在 1995 年正式推出。
由于 Sun 在早年被 Oracle 公司收购了,目前 Java 是 Oracle 公司的资产和注册商标。
本页面中主要对 Java 使用的基础知识和配置的内容进行快速导航。
Java 的配置比较复杂,同时还有比较复杂的编译和集成工具,因此必要对 Java 使用的环境进行一些说明,来帮助大家快速了解和使用这么语言。
### 安装
任何语言或者程序在使用之前都需要先配置环境,在这个页面我们主要对 Java 环境配置的内容进行总结。
- [Windows 环境下安装 Oracle JDK](https://www.isharkfly.com/t/windows-oracle-jdk/7254)
## 配置环境
* [Java 在 Windows 10 中配置环境变量](https://www.ossez.com/t/java-windows-10/13675)
@@ -0,0 +1,2 @@
# 集合
@@ -0,0 +1,21 @@
## Java 11 核心
本模块中包含有关 Java 11 核心新增功能特性的一些文章。
- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-codehttps://www.baeldung.com/java-single-file-source-code)
- [Java 11 Local Variable Syntax for Lambda Parameters](https://www.baeldung.com/java-var-lambda-params)
- [Java 11 String API Additions](https://www.baeldung.com/java-11-string-api)
- [Java 11 Nest Based Access Control](https://www.baeldung.com/java-nest-based-access-control)
- [Exploring the New HTTP Client in Java](https://www.baeldung.com/java-9-http-client)
- [An Introduction to Epsilon GC: A No-Op Experimental Garbage Collector](https://www.baeldung.com/jvm-epsilon-gc-garbage-collector)
- [Guide to jlink](https://www.baeldung.com/jlink)
- [Negate a Predicate Method Reference with Java 11](https://www.baeldung.com/java-negate-predicate-method-reference)
- [Benchmark JDK Collections vs Eclipse Collections](https://www.baeldung.com/jdk-collections-vs-eclipse-collections)
- [Pre-compile Regex Patterns Into Pattern Objects](https://www.baeldung.com/java-regex-pre-compile)
- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
- [Guide to Java 8s Collectors](https://www.baeldung.com/java-8-collectors)
- [New Features in Java 11](https://www.baeldung.com/java-11-new-features)
- [Getting the Java Version at Runtime](https://www.baeldung.com/get-java-version-runtime)
- [Invoking a SOAP Web Service in Java](https://www.baeldung.com/java-soap-web-service)
- [Java HTTPS Client Certificate Authentication](https://www.baeldung.com/java-https-client-certificate-authentication)
- [Call Methods at Runtime Using Java Reflection](https://www.baeldung.com/java-method-reflection)
@@ -0,0 +1,20 @@
## Java 8 核心
本模块中包含有关 Java 8 核心新增功能特性的一些文章。
- [New Features in Java 8](https://www.baeldung.com/java-8-new-features)
- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector)
- [Java 8 中的设计模式策略](https://www.ossez.com/t/java-8/13978)
- [Guide to Java 8 Comparator.comparing()](https://www.baeldung.com/java-8-comparator-comparing)
- [Guide to the Java 8 forEach](https://www.baeldung.com/foreach-java)
- [Introduction to Spliterator in Java](https://www.baeldung.com/java-spliterator)
- [Finding Min/Max in an Array with Java](https://www.baeldung.com/java-array-min-max)
- [Internationalization and Localization in Java 8](https://www.baeldung.com/java-8-localization)
- [Generalized Target-Type Inference in Java](https://www.baeldung.com/java-generalized-target-type-inference)
- [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments)
- [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit)
- [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface)
- [Interface With Default Methods vs Abstract Class](https://www.baeldung.com/java-interface-default-method-vs-abstract-class)
- [Convert Between Byte Array and UUID in Java](https://www.baeldung.com/java-byte-array-to-uuid)
- [Create a Simple “Rock-Paper-Scissors” Game in Java](https://www.baeldung.com/java-rock-paper-scissors)
- [Java 8 开始新增的 Optional 类](https://www.ossez.com/t/java-8-optional/13964)
@@ -0,0 +1,11 @@
## Annotation(注解)
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
- [Java @Override Annotation](https://www.baeldung.com/java-override)
- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings)
- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs)
- [Java @Deprecated Annotation(注解)](https://www.ossez.com/t/java-deprecated-annotation/13676)
- [Overview of Java Built-in Annotations](https://www.baeldung.com/java-default-annotations)
- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
@@ -0,0 +1,6 @@
## Java 数字(Number
本模块中包含有关 Java 数字(Number)有关的文章。
- [理解 Java 中的 NumberFormatException 异常](https://www.ossez.com/t/java-numberformatexception/13986)
-
@@ -0,0 +1,16 @@
## Java 字符串(Strings
本模块中包含有关 Java 字符串(String)有关的文章。
- [Java 使用 char[] Array 还是 String 存储字符串密码](https://www.ossez.com/t/java-char-array-string/14015)
- [Java 9 中的字符串(String)压缩](https://www.ossez.com/t/java-9-string/14024)
- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [String Performance Hints](https://www.baeldung.com/java-string-performance)
- [Java Localization Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting)
- [Java Generate Random String](https://www.baeldung.com/java-random-string)
- [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions)
- [Java 多行字符串](https://www.ossez.com/t/java/14049)
- [Java 中的 String Pool 简介](https://www.ossez.com/t/java-string-pool/14017)
- [Java “constant string too long” 编译错误](https://www.ossez.com/t/java-constant-string-too-long/14048)
- [Java 对象如何安全的 toString](https://www.ossez.com/t/java-tostring/14000)
- [编程常用的几种字符编码](https://www.ossez.com/t/topic/14022)
@@ -0,0 +1,219 @@
## Java UUID
在本文中,我们将会 对 UUIDs 和基于时间的 UUIDstime-based UUIDs 进行一些探讨。
当我们在对基于时间的 UUIDs 进行选择的时候,总会遇到一些好的方面和不好的方面,如何进行选择,也是我们将要简要探讨的内容。
同时我们还会对可能会使用类库进行一些比较和探索,以便于我们更好的做出选择。
## UUIDs 和 基于时间的 UUIDs
UUID 的全称是 Universally Unique Identifier,中文为通用唯一识别码。
当生成 UUID 的时候,系统总会自动生成一个 128 位的 UUID。基于 UUID 的生产算法的不同,我们会有不同的版本。
UUID 的主要目的就是用来在全世界中唯一标识一个数据,而且需要保证生成的 UUID 在全世界范围内是不重复的。因此我们可以用来标识一个上下文,包括数据库系统,计算机系统中的消息,分布式系统中的对象等等。
为了实现这个目标,我们需要确保哪怕是在同一个时间瞬间生成的 UUID 也是不相同,这样能够让我们更好的利用 UUID 在分布式计算机系统中标识存在的对象。
基于时间的 UUID,通过字面就可以了解到,这个 UUID 是基于时间的,实际上这个 UUID 存在 UUID 设计中的第一版。
这个版本是基于随机数的,使用的基数为每 100 纳秒为一个单位,时间的起点为1582年10月15日。同时还需要加上当前计算机的网卡物理地址(MAC)。
在后续的版本中,UUID (v6 和 v7)也是基于时间的 UUID 生成算法,可以说是基于 UUID v1 的更新版本。
UUID v1 因为是基于时间的,所以具有排序功能,这个在对数据库的设计上就很有帮助,当我们使用 UUID v1 来作为 PK(主键)的时候,我们就知道了,我们创建的这条记录的时间戳是什么时候,这个对我们在对数据进行调试和问题分析的时候就很有帮助了。
有优势就自然会有劣势,因为我们是基于时间创建 UUID 的,那么在同一个系统产生 UUID 冲突的可能性就会大很多,假设在同一个时间点,我们创建了很多个 UUID,那么大概率就会有出现冲突,重复出现的情况。
在本文的后部分,我们会对这个可能出现的情况进行一些探索。
另外一个原因,就是在 UUID v1 版本中使用主机地址这种做法会潜在的增加系统的安全性问题。这就是 UUID v6 尝试希望解决的问题。
## 对比程序
为了对可能出现的 UUID 冲突进行演示。我们尝试使用程序来对比可能出现 UUID 冲突的可能性。
这个程序,将会创建 128 个线程,在每个线程中将会生成 100,000 个 UUID。
首先我们对需要使用的变量来进行一些初始化:
```java
int threadCount = 128;
int iterationCount = 100_000;
Map<UUID, Long> uuidMap = new ConcurrentHashMap<>();
AtomicLong collisionCount = new AtomicLong();
long startNanos = System.nanoTime();
CountDownLatch endLatch = new CountDownLatch(threadCount);
```
如上面的程序所表示的内容,我们定义了 128 个线程,在这 128 个线程中,我们会循环 100,000 次。
同时,我们还初始化了一个 ConcurentHashMap 把我们生成的 UUID 存储到 ConcurentHashMap 中。
同时,我们还会记录出现 UUID 冲突的次数。
为了记录程序的性能,我们对程序开始时间和程序的结束也都进行了存储。在最后我们定义了一个 latch 等待所有线程的执行完成。
当定义完成后变量后,我们就需要启动线程并对线程序进行执行。
```java
for (long i = 0; i < threadCount; i++) {
long threadId = i;
new Thread(() -> {
for (long j = 0; j < iterationCount; j++) {
UUID uuid = Generators.timeBasedGenerator().generate();
Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j);
if(existingUUID != null) {
collisionCount.incrementAndGet();
}
}
endLatch.countDown();
}).start();
}
```
在 UUID 的创建过程中,我们使用了 fasterxml 包中的 Generators,这个 Generators 使用的是 java.util.UUID 类来创建的。
在创建 UUID v1 的使用,使用 fasterxml 是我们常用的做法。
当 UUID 创建后,我们就把创建好的 UUID 存储到 Map 中,UUID 为 map 的 Key,当我们的 UUID 重复出现冲突的时候,Map 将会提示错误,我们程序就会捕获这个错误,然后把出现错误的计数器 + 1。
```java
endLatch.await();
System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in "
+ TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms");
```
在程序的最后,CountDownLatch 的 await() 方法会等待所有的线程完成。
当所有线程完成后,我们就会把结果打印在计算机屏幕上。
下面就让我们开始对程序进行运行。
```txt
12800000 UUIDs generated, 0 collisions in 16913ms
```
上面出现了程序的运行结果,我们可以看到并没有出现 UUID 冲突的问题。
## uuid-creator
Java UUID Creator 小巧并且使用比较广泛的 UUID 生成器。
使用这个生成器能够为你生成各种 UUID,但从使用的情况上来看并不如 java-uuid-generator 使用得更加频繁。
### 依赖
如希望在项目中使用这个生成器,需要把这个生成器添加到依赖中。
<dependency>
<groupId>com.github.f4b6a3</groupId>
<artifactId>uuid-creator</artifactId>
<version>5.3.7</version>
</dependency>
Copy
### 使用
这个库提供了 3 个基于时间生成的 UUID 方法。
* UuidCreator.getTimeBased() 遵守 RFC-4122 规范生成基于时间的 UUID
* UuidCreator.getTimeOrdered() 使用 gregorian epoch 处理的新 UUID 格式
* UuidCreator.getTimeOrderedEpoch() 使用 Unix epoch proposed 处理的新 UUID 格式
当我们导入包后,可以直接使用下面的方法来进行使用。
```java
System.out.println("UUID Version 1: " + UuidCreator.getTimeBased());
System.out.println("UUID Version 6: " + UuidCreator.getTimeOrdered());
System.out.println("UUID Version 7: " + UuidCreator.getTimeOrderedEpoch());
```
我们可以看到生成 UUID 为我们通常认识的 UUID 格式。
```txt
UUID Version 1: 0da151ed-c82d-11ed-a2f6-6748247d7506
UUID Version 6: 1edc82d0-da0e-654b-9a98-79d770c05a84
UUID Version 7: 01870603-f211-7b9a-a7ea-4a98f5320ff8
```
### 冲突校验
我们还可以使用上面提供的生成代码放我我们开始的一部分使用的冲突校验程序中运行。
运行的结果为:
```txt
12800000 UUIDs generated, 0 collisions in 2595ms
```
通过这个库生成的基于时间的 UUID 我们也没有发现有冲突的情况。
## Java UUID Generator (JUG)
### 依赖
Java UUID Generator (JUG) 在很多项目中因为要生成 UUID 而被使用,其中包括了有 生成UUID 的方法和格式化输出等一些内容。
生成的 UUID 是按照 (RFC-4122) 标准来生成的。
使用下面的代码来添加依赖,当前使用的最新版为 5.0.0
```text
<dependency>
<groupId>com.fasterxml.uuid</groupId>
<artifactId>java-uuid-generator</artifactId>
<version>5.0.0</version>
</dependency>
```
### 使用
这个库也同时提供了 3 个方法来生成基于时间的 UUID(包括 v1,v6 和 v7)。
我们可以使用下面的方法来进行命令的调用:
```java
System.out.println("UUID Version 1: " + Generators.timeBasedGenerator().generate());
System.out.println("UUID Version 6: " + Generators.timeBasedReorderedGenerator().generate());
System.out.println("UUID Version 7: " + Generators.timeBasedEpochGenerator().generate());
```
当程序完成运行后,可以从控制台中看到输出:
```txt
UUID Version 1: e6e3422c-c82d-11ed-8761-3ff799965458
UUID Version 6: 1edc82de-6e34-622d-8761-dffbc0ff00e8
UUID Version 7: 01870609-81e5-793b-9e4f-011ee370187b
```
### 校验
将新的生成程序替换掉我们原有的代码的时候,我们可以对生成进行输出校验。
```txt
12800000 UUIDs generated, 0 collisions in 15795ms
```
从上面的输出来看,针对代码我们并没有发现有 UUID 冲突的问题。
但是针对运行结果,生成 UUID 的时间是不同的,这是因为 JUG 的生成速度通常要慢一点,对于我们 UUID 来说如果不大量一次性生成 UUID,这个通常不会是太大的问题。
在项目中,通常需要选择项目已有的依赖,可能在现有的项目中,使用 java-uuid-generator 库的情况要相对多一点。
## 结论
在本文中,我们对需要生成基于时间的 UUID 进行了一些探讨。同时基于时间的不同,UUID 有不同的版本。
JDK 自己并没有提供快速的基于时间的 UUID 生成方法。
JDK 中的 `UUID.randomUUID()` 方法生成的是 UUIDv4 的方法。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/d/dcfda606305cf9e640635ff66ad937462fc1bb6a.png)
基于时间的 UUID 生成,我们通常会依赖使用第三方的类库。
---
https://www.isharkfly.com/t/uuid/15686
- [UUID 的 5 个版本](https://www.isharkfly.com/t/uuid-5/15098)
- [在 Java 中生成只有数组和字母的 UUID](https://www.isharkfly.com/t/java-uuid/15097)
- [Guide to UUID in Java](http://www.baeldung.com/java-uuid)
- [Validate UUID String in Java](https://www.baeldung.com/java-validate-uuid-string)
- [Generate the Same UUID From a String in Java](https://www.baeldung.com/java-generate-same-uuid-from-string)
- [Generating Time Based UUIDs](https://www.baeldung.com/java-generating-time-based-uuids)
@@ -0,0 +1,15 @@
# Java 核心编程
<!--@include: core-java-8.md -->
<!--@include: core-java-11.md -->
<!--@include: core-java-annotations.md -->
<!--@include: core-java-numbers.md-->
<!--@include: core-java-strings.md-->
<!--@include: core-java-uuid.md-->
[](core-java-uuid.md ':include')
@@ -0,0 +1,141 @@
## 概述
在本文中,我们将会对 Java 特性预览背后的动机进行一些探索,对比当前使用 Java 的版本提供了哪些实验性的功能,以及如何在不同的 IDE 工具中启用这个功能。
## 为什么使用特性预览
如你对 Java 版本的发行计划不太熟悉的话,那么需要了解的是 Java 目前是每 6 个月将会发行一个版本。在发行新的版本的时候会提供一些新的特性。
Java 特性预览这个功能,将能够让用户提前了解一些 Java 将会在新版本中使用的功能,同时也能让 Java 团队能够更多的获得用户的反馈意见。
我们都知道 Java 被在很多大中小系统中使用,哪怕是实现中的一点点瑕疵或者糟糕的糟糕的设计都会带来很多意想不到情况和损失。
又因 Java 系统的广泛应用,这种损失通常是非常巨大的。
如何能够确保每一个发行的 Java 版本能够稳定的发布和升级,同时也能够满足 Java 社区的需要就成了一个问题。
针对 JEP-12 的改进,Java 提供了针对 VM(虚拟机)和语言特性的预览功能。通过这种方式 Java 社区能够在环境中直接测试新的功能,同时这些功能也不会影响到服务器的开发和使用。
Java 团队会基于社区中的反馈而对预览的功能会进行一些调整,同时会针对后续的发行版本而对提供的新的特性进行多次修改。
在最后,新特性可能会成为官方正式的发布版本,当然提供的一些新特性可能会在后续的官方正式发布版本中被完全的删除。
## 预览一些实验性特性
Java 的预览特性是针对正在开发中的特性,并且这些特性还在接受评估。所以这些特性还没有完全确定,所以很多特性可能会在新的发行版本中出现,当然很多也可能会被完全抛弃。
正是因为 Java 对品质的要求,针对 JDK 的不版本的实现,都会要求在 JDK 发布的时候同时也包含有实验性的特性预览。但是,针对最后的发布版本,这种实验性的预览功能是不会提供的。
特性预览只是让 Java 社区提前知道 Java 团队目前正在干什么和计划要干什么的一种方式。需要明确的是,不要把这些可能还会删掉的特性和功能包含到你的发行版本中。
下面是 JEP-12 有关预览特性的定义,官方的链接地址在:https://openjdk.org/jeps/12。
如你有兴趣的话,可以直接阅读官方的原文。
## 使用预览特性
Java 预览特性在默认情况下是关闭的。为了启用这个功能,我们必须使用启用预览参数,使用这个参数将会把所有的特性一次性全部启用。
**Java 编译器(JVM)和 Java 的版本必须保持一致。**
让我们来尝试使用 JDK 13 中提供的 String 字符串块功能。
```
String query = """
SELECT 'Hello World'
FROM DUAL;
""";
System.out.println(query);
```
上面的功能只能够在 JDK 13 及其后续版本中使用,所以为了使用这个功能,你需要安装 JDK 13 到你的计算机中。
### 使用 Eclipse
如果拷贝上面的代码到 Eclipse 中,你的 Eclipse 是不会进行进行正确编译的,在编译的过程中将会提示代码错误。
提示的内容是:如果需要这个功能请使用 JDK 13 的 String 字符串块功能。
这个时候,我们在我们的项目中单击右键,然后在弹出的菜单中选择属性。
然后进入到 Java 编辑器,这个时候我们就可以为我们的这个项目或者整个 Workspace 启用预览特性。
同时,我们还不能选择 使用默认编译器设置(Use default compliance settings)这个选项,这样可以让我们能够对 Java 13 的特性进行预览。
因目前我们使用的编译器版本比较高,为 JDK 17 的版本,所以在预览选项这里就只能对 JDK 21 的版本进行预览了。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/9/98cb0ad231736e2b16a915c49889b74c7c8440f3.png)
### IntelliJ IDEA
针对使用不同的 IDE,我们也希望我们的预览功能能够在 IDEA 中也可以使用。
与 Eclipse 相同,IDEA 也有这个方面的配置,你只需要在 IDEA 中修改配置即可。
配置是在语言结构上。
单击语言结构上的 SDK 默认,往下拉,就可以看到针对新版本的选项。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/3/3c64a3ccf02a1519a2516e36ab156fe02274819d.png)
同时还可以看到那些版本是支持新特性预览的,那些版本是不支持新特性预览的。
整体来说,IntelliJ IDEA 的新特性预览功能做得要比 Eclipse 更好一些。
### Maven
针对 Maven 项目,因 Maven 项目的配置都会依赖 pom.xml 来进行,对 IDE 的修改,可能在某些时候没有效果。
如果是这个情况的话,那你需要打开你的 pom.xml 文件,在 pom.xml 文件中找到针对编译有关的插件配置,然后再插件配置中添加 compilerArgs 参数。
具体的示例如下:
```
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>13</source>
<target>13</target>
<compilerArgs>
--enable-preview
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
```
针对上面的修改,同样也能让你的 IDE 能够识别到。
### 使用命令行
在编译期间,Java 有 2 个参数来控制启用预览的功能,请参考下面的编译命令:
```
javac --release 13 --enable-preview ClassUsingTextBlocks.java
```
如果当前使用的 JDK 版本是不支持的预览功能的,那么使用上面的命令将会得到错误的提示。
例如 JDK 14 的版本是不支持预览的,在命令行中,如果我们把命令行的中的 13 替换成 14 的话,都那么编译器将会提示我们错误。
在实际的开发环境中,在命令行中使用预览功能的可能性非常小,设置我们都不会使用命令行的方式来编译我们的 Java 代码。
上面提出这种编译方式的目的就是告诉大家,我们还是有这个选项的,主要还是能够让大家了解我们是有这 2 个参数提供的。
在运行时,Java 只需要 enable-preview 参数就可以启用预览功能。
```
java --enable-preview ClassUsingTextBlocks
```
需要注意的是,在这里如果你的 JDK 版本和预览的版本不匹配的话,你的程序是没有办法运行的。
## 结论
在本篇文章中我们主要针对 Java 提供的特性预览功能进行了一些讨论。
在实际使用的时候,我们确实也会遇到一些,这些情况就是项目使用的 JDK 版本比较低,但是下载的 JDK 编译的 Jar 包版本又比较高,这就导致了无法编译的情况。
我们会考虑使用 Java 的预览功能来查看下代码的兼容性。
比如说,当前项目使用的 JDK 版本为 8,但是我们项目中的一个依赖却使用了 JDK 11 来编译了包,所以我们可能会把我们的编译器版本提升下到 JDK 11 来查看代码的兼容情况。
如你只是针对自己的项目的话,Java 新特性功能用得就比较少,主要是对架构师而言,他们需要确定下代码的兼容性,以便于在对 JDK 是否可以进行升级上做出判断。
---
https://www.isharkfly.com/t/java/15682
@@ -0,0 +1,5 @@
# Java 核心编程
[](concept.md ':include')
[](data-type.md ':include')
@@ -0,0 +1,2 @@
# 基本概念
@@ -0,0 +1,2 @@
# 数据类型
@@ -0,0 +1,2 @@
# 异常处理
@@ -0,0 +1,2 @@
# 语言基础
@@ -0,0 +1,2 @@
# I/O 操作
@@ -0,0 +1,2 @@
# 语言结构
@@ -0,0 +1,2 @@
# 方法和函数
@@ -0,0 +1,2 @@
# 反射
+19
View File
@@ -0,0 +1,19 @@
# Java 程序语言
Java 是由 Sun Microsystems 公司于 1995年5月推出的 Java 面向对象程序设计语言和 Java 平台的总称(Java 1.0 [J2SE])。
由 James Gosling和同事们共同研发,并在 1995 年正式推出。
由于 Sun 在早年被 Oracle 公司收购了,目前 Java 是 Oracle 公司的资产和注册商标。
本页面中主要对 Java 使用的基础知识和配置的内容进行快速导航。
Java 的配置比较复杂,同时还有比较复杂的编译和集成工具,因此必要对 Java 使用的环境进行一些说明,来帮助大家快速了解和使用这么语言。
### 安装
任何语言或者程序在使用之前都需要先配置环境,在这个页面我们主要对 Java 环境配置的内容进行总结。
- [Windows 环境下安装 Oracle JDK](https://www.isharkfly.com/t/windows-oracle-jdk/7254)
### 配置环境
* [Java 在 Windows 10 中配置环境变量](https://www.isharkfly.com/t/java-windows-10/13675)
@@ -0,0 +1,3 @@
# JVM
@@ -0,0 +1,3 @@
# 多线程
@@ -0,0 +1,3 @@
# 新特性