先扯点闲皮
学习java再难坚持,也好过这两年IT行业的就业寒冬,选择了就无需后悔。这两年找java岗位就和49年入国军一样,老蒋来了都顶不住呀。生在这个年代你就没啥几乎去摸枪杆子和挨枪子,所以致富之路你得换一条。学医,这个不是不好,主要是也解决不了现在成群结队半夜不睡觉的emo青年,周树人先生当年也试过,连思想固化的国人都药不醒,更别说如今睡不着的靓仔靓女们。所以聪明的我们选择了键盘作为初始武器,网络也成为了我们赖以生存的环境,跟着众多志同道合之人看着攻略开始了这个大型开放世界探索。
现实就是这样,未来是不可预测的,连老子都说“无名,天地之始;有名,万物之母。故常无欲,以观其妙;常有欲,以观其徼”。这都过了2000多年,我依旧是没走进老子画的这个⭕,老子可真🐂🍺。请加油,程序员!学习时要注意带着疑问,这是啥?能干啥?有啥用?只要你足够坚持、自律,就没有你做不到的!(这是毒鸡汤,信了你就信了吧)
Java学习之旅:
一、JavaSE
1.Java基础
1.1.数据类型
1.2.注释、标识符、关键字
1.3.运算符
1.4.流程控制
1.5.Java方法
1.6.数组
1.7.常用排序算法
1.8.面向对象三大特性
1.9.重写和重载
1.10.抽象类和接口
1.11.String类
1.12.Object类
2.Java集合
2.1.集合和数组的区别(长度、内容、元素)
2.2.Collection集合(结构、是否有序/重复/安全、底层实现、使用场景扩容机制、遍历方式)
2.2.1.List集合
2.2.1.1.ArrayList
2.2.1.2.Vector(子类Stack)
2.2.1.3.LinkedList(父类Queue)
2.2.2.Set集合
2.2.2.1.HashSet
2.2.2.2.TreeSet
2.2.2.3.LinkedHashSet
2.3.Map集合
2.3.1.HashMap
2.3.2.HashTable
2.3.3.TreeMap
2.3.4.Map的三种遍历方式
2.4.Iterator迭代器
2.4.1.增强for(foreach简单迭代器)
2.5.Queue接口(队列)
2.6.安全集合
3.Java高并发
3.1.并行和并发(线程和进程)
3.2.线程的生命周期(新建、就绪、运行、阻塞、死亡)
3.3.线程的实现(Thread、Runable、Callable以及继承Thread类和实现接口的区别)
3.4.本地线程和守护线程(setDaemon)
3.5.线程常用方法(sleep、yield、join、setDaemon)
3.6.线程池工厂(常用线程池、七大参数、启动策略、优点)
3.7.Executors框架(结构:任务、任务的执行、异步计算的结果)
3.8.线程间的通信(wait、notify、notifyAll、生产者和消费者问题)
3.9.synchronized、lock、volatile
3.10.原子性、可见性、有序性
3.11.多线程安全问题(同步与互斥、加锁)
3.12.锁优化
3.13.JUC(AQS等)
3.JVM
3.1.运行时数据时区
3.1.1.程序计数器
3.1.2.java虚拟机栈
3.1.3.本地方法栈
3.1.4.堆
3.1.5.方法区
3.1.6.运行时常量池
3.1.7.直接内存
3.2.GC垃圾回收
3.2.1.垃圾判断算法(引用计数器、根搜索法)
3.2.2.垃圾回收算法(标记-清除、标记-整理、复制、分代收集)
3.2.3.垃圾回收器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1)
3.3.内存分配与回收策略
3.4.类加载机制
3.4.1.类的生命周期
3.4.2.类加载过程
3.4.3.类初始化时机
3.4.4.类加载器
3.4.5.双亲委派模型
3.4.6.自定义类加载器实现
4.IO
4.1.流分类(字节/字符流、输入/输出流、节点/包装流)
4.2.IO操作分类(磁盘、网络、数据库、内存映射)
4.3.字节操作(文件拷贝、对象拷贝)
4.4.字符操作
4.4.1.编码与解码(new String()和str.getBytes())
4.4.2.Reader和Writer
4.5.IO中的适配器模式和装饰者模式
4.5.1.缓冲流
4.5.2.字节转字符
4.5.3.实现逐行输出文本内容
4.6.对象操作
4.6.1.对象序列化
4.6.2.static和transient关键字
4.7.IO模型
4.7.1.BIO、NIO、AIO
4.7.2.缓冲区、通道、选择器
4.7.3.文件NIO实例
4.7.4.嵌套字NIO实例
4.7.5.内存映射文件
一、JavaSE
1.Java基础
1.1.数据类型
定义
Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。
数据分类
- 基本数据类型 (八种)
- 数值型
- 整数类型(byte,short,int,long)
- 浮点类型(float,double)
- 字符型(char)
- 布尔型(boolean)
- 数值型
- 引用数据类型
- 类(class)
- 接口(interface)
- 数组([])
计算机存储单元
- 定义:变量是内存中的小容器,用来存储数据。那么计算机内存是怎么存储数据的呢?无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称之为“比特位”,通常用小写的字母b表示。而计算机最小的存储单元叫“字节(byte)”,通常用大写字母B表示,字节是由连续的8个位组成。
- 常用存储单元关系
- 1B= 8b
- 1KB = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
Java基本数据类型图
类型 | 类型名称 | 关键字 | 占用内存 | 取值范围 | 作为成员变量的默认值 |
---|---|---|---|---|---|
整型 | 字节型 | byte | 1字节 | -128(-2^7) ~ 127(2^7-1) | 0 |
短整型 | short | 2字节 | -2^15 ~ 2^15-1 | 0 | |
整型 | int | 4字节 | -2^31 ~ 2^31-1 | 0 | |
长整型 | long | 8字节 | -2^63 ~ 2^63-1 | 0L | |
浮点型 | 单精度浮点型 | float | 4字节 | -3.403E38 ~ 3.403E38 | 0.0F |
双精度浮点型 | double | 8字节 | -1.798E308 ~ 1.798E308 | 0.0D | |
字符型 | \ | char | 2字节 | \ | "\u0000" |
布尔型 | \ | boolean | 1字节 | true 或 false | false |
数据类型转换
- 定义 数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。
- 分类
- 隐式转换
- 定义:在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。
- 转换规则
- 数值型数据的转换:byte→short→int→long→float→double。
- 字符型转换为整型:char→int。
- 转换条件
- 自动类型转换的实现需要同时满足两个条件:①两种数据类型彼此兼容,②目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)。例如
byte 类型向 short 类型转换时,由于 short 类型的取值范围较大,会自动将 byte 转换为 short 类型。
- 自动类型转换的实现需要同时满足两个条件:①两种数据类型彼此兼容,②目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)。例如
- 隐式转换
- 显式转换
- 定义:当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。
- 语法格式:目标类型 变量名 = (目标类型) (被转换的数据); 举例:int b = (byte)(a + b);
- 注意:如果超出了被赋值的数据类型的取值范围得到的结果会与你期望的结果不同,不建议强制转换,因为会有精度的损失。
想进一步了解包装类、基本数据类型转换、引用类型可参考博主 程序own 的 java数据类型(最强详解)
1.2.注释、标识符、关键字
注释Java的注释与C语言的注释有相同之处,又有不同的地方。
- Java的注释:
- 单行注释:// 注释内容 // 建议使用
- 多行注释:/* 注释内容 */ 不建议使用
- 文本注释:/** 文本注释内容 */ 可以生成一套网页形式的注释说明手册
- C的注释:
- 单行注释:// 注释内容 //
- 块注释:/* 注释内容 */
我们可以很明显的看出Java注释形式和C注释形式的不同之处:java存在文本注释的形式,而C没有该形式。
同时,在我们写注释时,也要注意一些内容:
- 注释不能嵌套使用。
- 无论是单行注释还是多行注释在编译时都是不进行编译操作的。
标识符
问:标识符是什么?
答:但凡是可以由程序员自己来进行命名的都是标识符。
问:标识符可以标识什么?
答:标识符可以标识:类名、方法名、常量名、变量名等等。
问:是否标识符可以任意命名?
答:标识符有自己的一套命名规则:
命名规则
-
标识符中可以包含:字母、数字以及 下划线和 $ 符号等等。
-
标识符不能以数字开头,也不能是关键字,且严格区分大小写。
( 以上两条为标识符命名的硬性规则。) -
类名 :采用大驼峰。(每个单词的首字母大写)
-
方法名:采用小驼峰。(首字母小写,剩余的字母大写)
-
变量名:采用小驼峰。
关键字
问:关键字是什么?
答:关键字是指由Java语言提前定义好的,有特殊含义的标识符,或者保留字。
问:关键字有哪些?
答:
搬运于博主 Sunlightʊə 的 Java第二课 —— 注释、标识符与关键字
未完待续。。。