{"id":21090700,"url":"https://github.com/ycrao/learning_java","last_synced_at":"2026-04-29T19:34:05.707Z","repository":{"id":82851160,"uuid":"162984643","full_name":"ycrao/learning_java","owner":"ycrao","description":"学习 Java 示例及笔记","archived":false,"fork":false,"pushed_at":"2024-03-13T07:04:51.000Z","size":73,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-14T09:06:27.951Z","etag":null,"topics":["examples","java","jdk","learning-java","maven"],"latest_commit_sha":null,"homepage":"","language":"Thrift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ycrao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-12-24T11:38:58.000Z","updated_at":"2022-05-30T07:05:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"82e236e8-a536-4475-a2db-bd731ed738ee","html_url":"https://github.com/ycrao/learning_java","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ycrao/learning_java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ycrao%2Flearning_java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ycrao%2Flearning_java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ycrao%2Flearning_java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ycrao%2Flearning_java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ycrao","download_url":"https://codeload.github.com/ycrao/learning_java/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ycrao%2Flearning_java/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32441251,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T18:12:22.909Z","status":"ssl_error","status_checked_at":"2026-04-29T18:11:33.322Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["examples","java","jdk","learning-java","maven"],"created_at":"2024-11-19T21:39:39.061Z","updated_at":"2026-04-29T19:34:05.690Z","avatar_url":"https://github.com/ycrao.png","language":"Thrift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Learning Java\n\n\u003e   学习 `Java` 示例及笔记，部分资料来源于网络，整理过来仅供参考使用。推荐新手参考 [Java 教程](http://www.runoob.com/java/java-tutorial.html)\n来学习。\n\n## 简介\n\n`Java` 是由 `Sun Microsystems` 公司于1995年5月推出的 `Java` 面向对象程序设计语言和 `Java` 平台的总称。由 `James Gosling` 和同事们共同研发，并在1995年正式推出。\n\nJava分为三个体系：\n\n- JavaSE（J2SE）： `Java2 Platform Standard Edition` JAVA平台标准版\n- JavaEE（J2EE）： `Java 2 Platform,Enterprise Edition` JAVA平台企业版\n- JavaME（J2ME）： `Java 2 Platform Micro Edition` JAVA平台微型版\n\n2005年6月，`JavaOne` 大会召开，`SUN` 公司公开 `Java SE 6` 。此时，`Java` 的各种版本已经更名以取消其中的数字\"2\"：`J2EE` 更名为 `Java EE`，`J2SE` 更名为 `Java SE`，`J2ME` 更名为`Java ME`。\n\n2009年04月20日，甲骨文（`Oracle`） 74亿美元收购 `Sun` ，取得 `Java` 的版权。\n\n2014年3月18日，`Oracle` 发布 `Java SE 8` 。\n\n\n## 基础知识\n\n\u003e   笔记：https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Java%20%E5%9F%BA%E7%A1%80.md#java-%E4%B8%8E-c-%E7%9A%84%E5%8C%BA%E5%88%AB 。\n\n### 开发环境配置\n\n受限于篇幅，这里不对开发环境配置做更多的说明，请参考以下链接：\n\n- [Java 开发环境配置](http://www.runoob.com/java/java-environment-setup.html)\n- [Mac环境下配置Java开发环境（jdk maven tomcat idea）](https://zhuanlan.zhihu.com/p/35272197)\n- [Ubuntu下maven安装和tomcat简易安装](https://segmentfault.com/a/1190000004453530)\n- [Ubuntu下安装jdk和maven并配置相关环境变量](https://www.jianshu.com/p/de3cec62bf1f)\n\n### `Hello World` 示例\n\n编写 `HelloWorld.java` 代码，示例代码位于 `examples/src/main/java/com/raoyc/demo/HelloWorld.java` 。\n\n```java\npackage com.raoyc.demo;\n\npublic class HelloWorld {\n\n    public static void main(String[] args) {\n        System.out.println(\"Hello World!\");\n    }\n}\n```\n\n运行，如果你使用 诸如 `Virtual Studio Code` (搭配 `JAVA` 相关扩展插件) 、 `IDEA` 与 `Eclipse` 等集成环境（可能需要进行某些配置），可以很方便在源代码文件（右键）点击运行，得到结果。\n\n你也可以手动编译运行源码文件，操作如下：\n\n```\nmkdir classes\njavac examples/src/main/java/com/raoyc/demo/HelloWorld.java -d ./classes\njava -classpath ./classes com.raoyc.demo.HelloWorld\nHello Wolrd!\n```\n\n编写Java程序时，应注意以下几点：\n\n- 大小写敏感：`Java` 是大小写敏感的，这就意味着标识符 `Hello` 与 `hello` 是不同的。\n- 类名：对于所有的类来说，类名的首字母应该大写。如果类名由若干单词组成，那么每个单词的首字母应该大写，例如 `MyFirstJavaClass` 。\n- 方法名：所有的方法名都应该以小写字母开头。如果方法名含有若干单词，则后面的每个单词首字母大写。\n- 源文件名：源文件名必须和类名相同。当保存文件的时候，你应该使用类名作为文件名保存（切记 `Java` 是大小写敏感的），文件名的后缀为 `.java` 。（如果文件名和类名不相同则会导致编译错误）。\n- 主方法入口：所有的 `Java` 程序由 `public static void main(String []args)` 方法开始执行。\n\n\u003e   更多参考： [Java 基础语法](http://www.runoob.com/java/java-basic-syntax.html) 。\n\n### ８种基本数据类型\n\n```\n整型：\nbyte（字节型）\nshort（短整型）\nint（整型）\nlong（长整型）\n浮点型：\nfloat（单精度浮点型）\ndouble（双精度浮点型）\n布尔型：\nboolean（布尔型）(它只有两个值可取 true false)\n字符型：\nchar（字符型）\n```\n\n\u003e   类型转换等请参考：[Java 基本数据类型](http://www.runoob.com/java/java-basic-datatypes.html)\n\n### 对象与类\n\n\u003e   对象：对象是类的一个实例（对象不是找个女朋友），有状态和行为。例如，一条狗是一个对象，它的状态有：颜色、名字、品种；行为有：摇尾巴、叫、吃等。\n\n\u003e   类：类是一个模板，它描述一类对象的行为和状态。\n\n示例代码 [DogTest](examples/src/main/java/com/raoyc/demo/DogTest.java)\n\n当在一个源文件中定义多个类，并且还有 `import` 语句和 `package` 语句时，要特别注意这些规则。\n\n- 一个源文件中只能有一个 `public` 类\n- 一个源文件可以有多个非 `public` 类\n- 源文件的名称应该和 `public` 类的类名保持一致。例如：源文件中 `public` 类的类名是 `Employee` ，那么源文件应该命名为 `Employee.java` 。\n- 如果一个类定义在某个包中，那么 `package` 语句应该在源文件的首行。\n- 如果源文件包含 `import` 语句，那么应该放在 `package` 语句和类定义之间。如果没有 `package` 语句，那么 `import` 语句应该在源文件中最前面。\n- `import` 语句和 `package` 语句对源文件中定义的所有类都有效。在同一源文件中，不能给不同的类不同的包声明。\n- 类有若干种访问级别，并且类也分不同的类型：抽象类和 `final` 类等。\n\n除了上面提到的几种类型，`Java` 还有一些特殊的类，如：内部类、匿名类。\n\n### 变量\n\n```java\n\npublic class Variable {\n    int a, b, c;  // 申明3个int型变量 a b c\n    int d = 3, e = 4, f = 5;  // 申明3个int型变量 d e f 并赋值\n    byte z = 22;\n    // string 必须使用双引号\n    String s = \"hello world\"; // 实例变量 \n    static Float PI = 3.14f;  // 类变量\n    // char 必须使用单引号\n    char x = 'x';\n    char dao = '道';\n    char uDao = '\\u9053';  // unicode 编码的 '道'\n\n    public void method() {\n        int i = 0;  // 局部变量\n    }\n}\n```\n\n#### 局部变量\n\n- 局部变量声明在方法、构造方法或者语句块中；\n- 局部变量在方法、构造方法、或者语句块被执行的时候创建，当它们执行完成后，变量将会被销毁；\n- 访问修饰符不能用于局部变量；\n- 局部变量只在声明它的方法、构造方法或者语句块中可见；\n- 局部变量是在栈上分配的；\n- 局部变量没有默认值，所以局部变量被声明后，必须经过初始化，才可以使用。\n\n#### 实例变量\n\n- 实例变量声明在一个类中，但在方法、构造方法和语句块之外；\n- 当一个对象被实例化之后，每个实例变量的值就跟着确定；\n- 实例变量在对象创建的时候创建，在对象被销毁的时候销毁；\n- 实例变量的值应该至少被一个方法、构造方法或者语句块引用，使得外部能够通过这些方式获取实例变量信息；\n- 实例变量可以声明在使用前或者使用后；\n- 访问修饰符可以修饰实例变量；\n- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见；\n- 实例变量具有默认值。数值型变量的默认值是0，布尔型变量的默认值是false，引用类型变量的默认值是null。变量的值可以在声明时指定，也可以在构造方法中指定；\n- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中，就应该使用完全限定名：`ObejectReference.VariableName` 。\n\n#### 类变量（静态变量）\n\n- 类变量也称为静态变量，在类中以 `static` 关键字声明，但必须在方法构造方法和语句块之外。\n- 无论一个类创建了多少个对象，类只拥有类变量的一份拷贝。\n- 静态变量除了被声明为常量外很少使用。常量是指声明为 `public/private` ，`final` 和 `static` 类型的变量。常量初始化后不可改变。\n- 静态变量储存在静态存储区。经常被声明为常量，很少单独使用 `static` 声明变量。\n- 静态变量在第一次被访问时创建，在程序结束时销毁。\n- 与实例变量具有相似的可见性。但为了对类的使用者可见，大多数静态变量声明为 `public` 类型。\n- 默认值和实例变量相似。数值型变量默认值是 `0` ，布尔型默认值是 `false` ，引用类型默认值是 `null` 。变量的值可以在声明的时候指定，也可以在构造方法中指定。此外，静态变量还可以在静态语句块中初始化。\n- 静态变量可以通过：`ClassName.VariableName` 的方式访问。\n- 类变量被声明为 `public static final` 类型时，类变量名称一般建议使用大写字母。如果静态变量不是 `public` 和 `final` 类型，其命名方式与实例变量以及局部变量的命名方式一致。\n\n### 修饰符\n\n#### 访问控制修饰符\n\n`Java` 中，可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。\n\n- `default` (即缺省，什么也不写）: 在同一包内可见，不使用任何修饰符。使用对象：类、接口、变量、方法。\n- `private` : 在同一类内可见。使用对象：变量、方法。 注意：不能修饰类（外部类）。\n- `public` : 对所有类可见。使用对象：类、接口、变量、方法\n- `protected` : 对同一包内的类和所有子类可见。使用对象：变量、方法。 注意：不能修饰类（外部类），接口及接口的成员变量和成员方法不能声明为 `protected`。\n\n**访问控制规则**\n\n| 修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |\n| --- | --- | --- | --- | --- | ---- |\n| public | Y | Y | Y | Y | Y |\n| protected | Y | Y | Y | Y/N（说明）| N |\n| default | Y | Y | Y | N | N |\n| private | Y | N | N | N | N |\n\n`protected` 需要从以下两个点来分析说明：\n\n- 子类与基类在同一包中：被声明为 `protected` 的变量、方法和构造器能被同一个包中的任何其他类访问；\n- 子类与基类不在同一包中：那么在子类中，子类实例可以访问其从基类继承而来的 `protected` 方法，而不能访问基类实例的 `protected` 方法。\n\n**访问控制和继承**\n\n- 父类中声明为 `public` 的方法在子类中也必须为 `public` 。\n- 父类中声明为 `protected` 的方法在子类中要么声明为 `protected` ，要么声明为 `public` ，不能声明为 `private` 。\n- 父类中声明为 `private` 的方法，不能够被继承。\n\n#### 非访问修饰符\n\n为了实现一些其他的功能，Java 也提供了许多非访问修饰符。\n\n- `static` 修饰符，用来修饰类方法和类变量。\n- `final` 修饰符，用来修饰类、方法和变量，`final` 修饰的类不能够被继承，修饰的方法不能被继承类重新定义，修饰的变量为常量，是不可修改的。\n- `abstract` 修饰符，用来创建抽象类和抽象方法。\n- `synchronized` 和 `volatile` 修饰符，主要用于线程的编程。\n\n更多查阅：http://www.runoob.com/java/java-modifier-types.html 。\n\n### 运算符、循环与条件等\n\n运算符、循环、条件与`switch/case` 等知识点，类似于你所熟知的某门语言，如 `javascript/php/c/c++` 等语言，这里限于篇幅不过多赘述。您可以查阅最后一节提供的参考资源链接来学习相关内容。另外，也可参考本仓库的示例代码： [OperatorTest](examples/src/main/java/com/raoyc/demo/OperatorTest.java) 与  [ControlFlowTest](examples/src/main/java/com/raoyc/demo/ControlFlowTest.java) 。\n\n## 高阶知识 - 数据结构\n\n### 数组（Array）\n\n\u003e   数组是用来存储固定大小的同类型元素。\n\n```java\npublic class ArrayTest {\n    public static void main(String[] args) {\n        // 数组大小\n        int size = 7;\n        // 定义数组\n        String[] days = new String[size];\n        days[0] = \"Sunday\";\n        days[1] = \"Monday\";\n        days[2] = \"Tuesday\";\n        days[3] = \"Wednesday\";\n        days[4] = \"Thursday\";\n        days[5] = \"Friday\";\n        days[6] = \"Saturday\";\n\n        System.out.println(\"7 days in one week:\");\n        for (String day : days) {\n            System.out.println(day);\n        }\n    }\n}\n```\n\n排序算法：[冒泡排序](examples/src/main/java/com/raoyc/demo/BubbleSort.java) 。\n\n### 向量（Vector）\n\n\u003e   向量（ `Vector` ）类和传统数组非常相似，但是 `Vector` 的大小能根据需要动态的变化。和数组一样，Vector对象的元素也能通过索引访问。\n\n```java\nimport java.util.Enumeration;\nimport java.util.Vector;\n\npublic class VectorTest {\n    public static void main(String[] args) {\n        Vector v = new Vector(3, 2);\n        System.out.println(\"Initial size: \" + v.size());\n        System.out.println(\"Initial capacity: \" + v.capacity());\n        v.addElement(new Integer(1));\n        v.addElement(new Integer(2));\n        v.addElement(new Integer(3));\n        v.addElement(new Integer(4));\n        Enumeration vEnum = v.elements();  // 枚举\n        System.out.println(\"Elements in vector:\");\n        while(vEnum.hasMoreElements()) {\n            System.out.print(vEnum.nextElement() + \" \");\n        }\n    }\n}\n```\n### 栈（Stack）\n\n\u003e   栈（ `Stack` ）实现了一个后进先出（ `LIFO` ）的数据结构。你可以把栈理解为对象的垂直分布的栈，当你添加一个新元素时，就将新元素放在其他元素的顶部。当你从栈中取元素的时候，就从栈顶取一个元素。换句话说，最后进栈的元素最先被取出。\n\n### 哈希表（Hashtable）\n\n\u003e   `Hashtable` 类提供了一种在用户定义键结构的基础上来组织数据的手段。\n`Hashtable` 是原始的 `java.util` 的一部分， 是一个 `Dictionary` 具体的实现 。然而，`Java 2` 重构的 `Hashtable` 实现了 `Map` 接口，因此，`Hashtable` 现在集成到了集合框架中。它和 `HashMap` 类很相似，但是它支持同步。像 `HashMap` 一样，`Hashtable` 在哈希表中存储键/值对。当使用一个哈希表，要指定用作键的对象，以及要链接到该键的值。\n\n```java\nimport java.util.Enumeration;\nimport java.util.Hashtable;\n\npublic class HashtableTest {\n\n    public static void main(String[] args) {\n        Hashtable balance = new Hashtable();\n        Enumeration names;\n        String str;\n        double bal;\n\n        balance.put(\"Zara\", new Double(3434.34));\n        balance.put(\"Mahnaz\", new Double(123.22));\n        balance.put(\"Ayan\", new Double(1378.00));\n        balance.put(\"Daisy\", new Double(99.22));\n        balance.put(\"Qadir\", new Double(-19.08));\n\n        // Show all balances in hash table.\n        names = balance.keys();\n        while (names.hasMoreElements()) {\n            str = (String) names.nextElement();\n            System.out.println(str + \": \" + balance.get(str));\n        }\n        System.out.println();\n        // Deposit 1,000 into Zara's account\n        bal = ((Double) balance.get(\"Zara\")).doubleValue();\n        balance.put(\"Zara\", new Double(bal + 1000));\n        System.out.println(\"Zara's new balance: \" + balance.get(\"Zara\"));\n    }\n}\n```\n\n## Thrift Java 示例\n\n\u003e   `Apache Thrift` 相关介绍以及具体语言的示例请参考我的 [learning_thrift](https://github.com/ycrao/learning_thrift) 仓库。\n\n### 编写 `thrift` 定义文件：\n\n```thrift\nnamespace java com.raoyc.thrift.demo.service\nservice PingService {\n    string ping(),\n    void say(1:string msg)\n}\n```\n\n### 生成 `java` 接口代码文件：\n\n```bash\nmkdir javagen\nthrift -out javagen/ --gen java ping.thrift\n```\n\n执行完之后可以看到 `javagen` 文件夹下多出含包名（`com.raoyc.thrift.demo`）路径的 `PingService.java` 文件。\n\n移动或复制生成的上一步文件到项目源码对应的包目录下，本示例中即为：`examples/src/main/java/com/raoyc/thrift/demo/service/PingService.java` 。\n\n### 编写接口处理类：\n\n编写实例化 `PingService.Iface` 的类，本示例代码位于：`examples/src/main/java/com/raoyc/thrift/demo/service/impl/PingServiceImpl.java`\n\n```java\npackage com.raoyc.thrift.demo.service.impl;\n\nimport com.raoyc.thrift.demo.service.PingService;\nimport org.apache.thrift.TException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class PingServiceImpl implements PingService.Iface {\n    private Logger logger = LoggerFactory.getLogger(PingService.class);\n\n    @Override\n    public String ping() throws TException {\n        System.out.println(\"pong\");\n        return \"pong\";\n    }\n\n    @Override\n    public void say(String msg) throws TException {\n        System.out.println(msg);\n    }\n}\n```\n\n### 编写服务端与客户端代码：\n\n具体请参考示例代码：\n\n[ThriftServer](examples/src/main/java/com/raoyc/thrift/demo/ThriftServer.java)\n\n[ThriftClient](examples/src/main/java/com/raoyc/thrift/demo/ThriftClient.java)\n\n### 运行：\n\n使用 `IDE` 安装好依赖， 可以很方便的运行 `ThriftServer` 与 ThriftClient 代码。\n\n运行结果大概如下：\n\n```bash\n# start ThriftServer on #terminal#1\nThreadedSelectorServer start....\n\n\n# start ThriftClient on terminal#2\nClient say by class com.raoyc.thrift.demo.ThriftClient@1406718218\n\n# meanwhile on terminal#1 will display\npong\nHello from Java\n```\n\n## Quartz 示例\n\n### 简介：\n\n`Quartz` 对任务调度的领域问题进行了高度的抽象，提出了调度器、任务和触发器这3个核心的概念，并在 `org.quartz` 通过接口和类对重要的这些核心概念进行描述。\n \n`Quartz` 调度包的两个基本单元是作业和触发器。作业是能够调度的可执行任务，触发器提供了对作业的调度。\n\n调度器：调度器用于将与作业触发器关联，一个作业可关联多个触发器，这样每个触发器被可以触发的作业执行；一个触发器可用于控制多个作业，触发触发时，全部作业将获得调度。`Quartz` 的调度器由 `Scheduler` 接口体现。\n\n作业：只需实现 `org.quartz.job` 接口即可。`Job` 接口包含一个方法 `execute()` ，`execute` 方法体是被调度的作业体。一旦实现 `Job` 接口和 `execute()` 方法， `Quartz` 确定作业运作的时候，它将调用 `execute()` 方法体。\n\n触发器：有`SimpleTrigger` 和 `CronTrigger` 等类型。\n\n### 示例代码：\n\n- [RAMQuartzTest](examples/src/main/java/com/raoyc/quartz/demo/RAMQuartzTest.java)\n- [JDBCQuartzTest](examples/src/main/java/com/raoyc/quartz/demo/JDBCQuartzTest.java)\n\n### 参考链接：\n\n- [quartz-core-learning](https://github.com/dufyun/quartz-core-learning)\n- [quartz cron 表达式用法（CronTrigger 教程）](https://blog.csdn.net/shfqbluestone/article/details/51009685)\n- [Quartz 官网](http://www.quartz-scheduler.org/)\n- [Quartz 中文化资料](https://www.w3cschool.cn/quartz_doc/)\n- [Quartz 调度系统入门和调度高可用实现方案](https://www.jianshu.com/p/810400e6a274)\n\n## 参考资源\n\n- [Java教程](http://www.runoob.com/java/java-tutorial.html)\n- [Java Development Kit 8 Documentation](https://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html)\n- [JDK中文版](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh)\n- [CyC2018/CS-Notes](https://github.com/CyC2018/CS-Notes)\n- [brianway/java-learning](https://github.com/brianway/java-learning)\n- [winterbe/java8-tutorial](https://github.com/winterbe/java8-tutorial) 中文版 [aalansehaiyang/java8-tutorial](https://github.com/aalansehaiyang/java8-tutorial)\n- [JeffLi1993/java-core-learning-example](https://github.com/JeffLi1993/java-core-learning-example)\n- [HowToDoInJava](https://howtodoinjava.com/java/)\n- [Java CMS建站系统 - 建站系统 - Trending Projects - Gitee](https://gitee.com/explore/starred/cms?lang=Java)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fycrao%2Flearning_java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fycrao%2Flearning_java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fycrao%2Flearning_java/lists"}