零基础学Java

第一章 Java编程基础 (30讲)

01 | 课程介绍

02 | 内容综述

03 | 开发环境搭建(macOS)

04 | HelloWorld程序编译和运行(macOS)

05 | 开发环境搭建(Windows)

06 | HelloWorld程序编译和运行(Windows)

07 | 详解HelloWorld程序

08 | IntelliJ IDEA集成开发环境的安装和使用(macOS)

09 | IntelliJ IDEA集成开发环境的安装和使用(Windows)

10 | 从加减乘除到变量

扫描二维码关注公众号,回复: 10360165 查看本文章

11 | 再探计算加减乘除的程序

12 | Java中的基本数据类型

13 | Java中的运算符

14 | Java中的位运算符

15 | 基本数据类型的更多语法点

16 | 字符集编码和字符串

17 | 操作符和数据类型总结

18 | 程序执行流程之if-else语句(上)

19 | 程序执行流程之if-else语句(下)

20 | 程序循环之for语句

21 | 代码块和变量的作用域

22 | 程序循环之while语句

23 | 程序执行流程之switch语句

24 | 循环和判断的总结(上)

25 | 循环和判断的总结(下)

26 | 用数组保存成绩

27 | 认识变量和数组(上)

28 | 认识变量和数组(下)

29 | 多维数组

30 | 用数组灵活处理程序

第二章 Java面向对象编程 (74讲)

31 | 类(class)

32 | 初探类和对象

33 | 认识引用类型(上)

34 | 认识引用类型(下)

35 | 类、对象和引用的关系

36 | 认识数组类型

37 | 引用的缺省值null

38 | 像自定义类型一样使用类

39 | Java中的包和访问修饰符(上)

40 | Java中的包和访问修饰符(下)

41 | 打造一个小超市

42 | IntelliJ调试程序初探

43 | 方法:让Merchandise对象有行为

44 | 返回值:让Merchandise计算毛利润

45 | 参数:让Merchandise计算多件商品的总价

46 | 参数和返回值是怎么传递的

47 | 分清参数、局部变量和实例的地盘

48 | 隐藏的this自引用

49 | 理解方法:一种特殊的代码块

50 | 理解方法的调用:代码的一种特殊跳转

51 | 给类和方法加Java注释

52 | 成熟的类的对象要自己做事情

53 | 方法的签名和重载

54 | 重载的参数匹配规则

55 | 构造方法:构造实例的方法

56 | 构造方法的重载和互相调用

57 | 静态变量

58 | 静态方法

59 | 静态方法的重载

60 | static代码块和static变量初始化

61 | 方法和属性的可见性修饰符

62 | 重新认识老朋友:Math和Scanner(上)

63 | 重新认识老朋友:Math和Scanner(下)

64 | 最熟悉的陌生人:String (上)

65 | 最熟悉的陌生人:String (下)

66 | 重新认识老朋友: main方法和System类

67 | String类的好兄弟

68 | 继承:方便让商品增加新的类别

69 | 子类对象里藏着一个父类对象

70 | 覆盖:子类想要一点不一样

71 | super:和父类对象沟通的桥梁

72 | super:调用父类的构造方法

73 | 父类和子类的引用赋值关系

74 | 多态:到底调用的哪个方法?(上)

75 | 多态:到底调用的哪个方法?(下)

76 | 多态里更多的语法点(上)

77 | 多态里更多的语法点(下)

78 | instanceof操作符

79 | 继承专属的访问控制:protected

80 | final修饰符(上)

81 | final修饰符(下)

82 | 继承里的静态方法

83 | 插曲:for循环的另一种写法

84 | 万类之祖:Object类

85 | hashCode和equals 方法(上)

86 | hashCode和equals 方法(下)

87 | toString方法

88 | 初探Class类

89 | 初探反射(上)

90 | 初探反射(下)

91 | 面向对象三要素:封装、继承和多态

92 | 枚举:定义商品的门类

93 | 接口:让商品类型更丰富(上)

94 | 接口:让商品类型更丰富(下)

95 | 抽象类:接口和类的混合体

96 | 有方法代码的接口

97 | 接口内代码的更多内容

98 | 静态内部类

99 | 成员内部类

100 | 局部内部类

101 | 匿名类

102 | 特殊类的总结

103 | 让我们的超市运转起来:设计篇

104 | 让我们的超市运转起来:代码篇

第三章 Java中的异常处理 (9讲)

105 | 初识异常:try catch

106 | Java中异常的分类

107 | 抛出异常的语法

108 | Java异常的传递

109 | 自定义异常

110 | 异常传递不是凌波微步

111 | try catch finally语句

112 | 自动回收资源的try语句

113 | Java中的常见异常

第四章 Java中的常用工具类和新语法 (22讲)

114 | Collection类族简介

115 | Collection中的List (上)

116 | Collection中的List(下)

117 | Collection中的Set

118 | 泛型简析(上)

119 | 泛型简析(下)

120 | 再探泛型

121 | Iterator接口

122 | Map:key和value的映射

123 | 定义自己的注解

124 | Lambda V.S. 匿名类(上)

125 | Lambda V.S. 匿名类(下)

126 | 基本类型的自动装箱和拆箱

127 | Java中的File类

128 | Java I/O简介

129 | 写文件内容小程序

130 | 读文件内容小程序

131 | 网络通讯名词简介

132 | 简单的网络通讯小程序(上)

133 | 简单的网络通讯小程序(下)

134 | 简单的抓取网页内容的程序

135 | JDK和JRE

第五章 Java中的线程 (19讲)

136 | 初识线程

137 | 创建自己的线程

138 | 再探线程

139 | 多线程:混乱开始了

140 | 同步控制之synchronized

141 | 同步控制之wait notify

142 | 多线程经典模型:生产者消费者

143 | 线程同步之join

144 | 死锁

145 | ThreadLocal线程专属的变量

146 | 定时任务

147 | volatile关键字的作用

强制从内存获取数据

public class AccessMemoryVolatile {

    public volatile long counterV = 0;
    public long counter = 0;

    public static void main(String[] args) {
        int loopCount = Integer.MAX_VALUE / 30;
        // TODO 只是为了演示 volatile 每次访问都要直达内存,不能使用缓存,所以耗费的时间略多
        AccessMemoryVolatile accessMemoryVolatile = new AccessMemoryVolatile();
        Thread volatileAdder = new Thread(() -> {
            long start = System.currentTimeMillis();
            for (int i = 0; i < loopCount; i++) {
                accessMemoryVolatile.counterV++;
            }
            System.out.println("volatile adder takes " + (System.currentTimeMillis() - start));
        });
        volatileAdder.start();

        Thread justAdder = new Thread(() -> {
            long start = System.currentTimeMillis();
            for (int i = 0; i < loopCount; i++) {
                accessMemoryVolatile.counter++;
            }
            System.out.println("simple adder takes " + (System.currentTimeMillis() - start));
        });
        justAdder.start();
    }

}

影响指令重排

package com.geekbang.learnvolatile;

public class VolatileAppMain {
    public static void main(String[] args) {
        DataHolder dataHolder = new DataHolder();

        Thread operator = new Thread(() -> {
            while (true) {
                dataHolder.operateData();
            }
        });
        operator.start();

        Thread checker = new Thread(() -> {
            while (true) {
                dataHolder.check();
            }
        });
        checker.start();
    }
}

148 | concurrent包基本原理

149 | concurrent包中的Atomic类族

150 | concurrent包中的锁

151 | concurrent包中的数据结构

152 | concurrent包中的线程池

153 | 聊天室开张喽 (上)

154 | 聊天室开张喽 (下)

第六章 Java编程实战 (16讲)

155 | 什么是学习一门语言

156 | Java平台简介

157 | Maven概念简介

158 | Maven的安装和配置

159 | 创建一个简单的Maven项目

160 | 一个从pptx文件中抽取文字的小工具

161 | Maven常用命令和插件

162 | Intellij更多功能介绍

163 | 值得学习的类库简介

164 | 如何在Stack Overflow上提问才不会被骂

165 | 浅谈程序设计

166 | 游戏小程序功能定义

167 | 游戏小程序设计和模块划分

168 | 游戏小程序代码分析

169 | 使用Swagger创建一个Spring Boot的Web服务

170 | 结束语

发布了105 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/github_38596081/article/details/104315843