Java
Java是一门编程语言。
历史
前情提要,该部分主要描述Java从诞生到Java8正式发布期间,有关Java及中国软件行业的一些历史细节。
1990年,Sun(Stanford University Network,斯坦福大学校园网)公司启动绿色计划。该计划旨在开发一种编程语言,用于控制电视机机顶盒的运作。于是詹姆斯·高斯林等人开始开发 Java 语言的雏形,并将其命名为 Oak(橡树)。结果市场没啥反响,该语言开始服务家用电器业务,辗转反侧,依然不景气,最终,跟着浪潮进入互联网领域。
1992年,Oak的开发者觉得Oak不像是编程语言的名字,决定改名为Silk(丝绸),结果因为涉及专有名词没有审批通过。由于程序员喜欢喝咖啡,而印尼Java岛的咖啡很不错,于是更名为Java,寓意Java编程语言让写程序如同喝咖啡一样闲适。
1994年,高斯林在硅谷大会上演示JavaEE功能,实现动态网页效果,震惊世界,然后公司架设ftp服务器,供众人下载JDK。
1995年,Sun公司正式发布第一版Java。相继发布到版本1.4后,直接发布版本5,直到今天的版本15。
1997~1998年,中国开始出现网页。
2000年初,中国软件行业的寒冬,马化腾想卖掉QQ给新浪。要价100万。但新浪王志东只愿意出50万,最终没谈成。
2000年末,中国软件行业回暖,腾讯拿到风投,起死回生。
2003年5月10日,马云创办淘宝网。
2004~2005年,中国软件行业迅速发展,很好找工作。
2007年,中国的第一批智能手机诞生。
2009年,Java的桌面开发仍大有所为,往后开始进入互联网开发时代。
2014年3月18日,Java8发布。
简介
Java,一种编程语言。
版本
- Java SE:Standard Edition(标准版),包含标准的JVM和标准库。
- Java EE:Enterprise Edition(企业版),在Java SE的基础上加上了大量的API和库,以便开发Web应用、数据库、消息服务等。
- Java ME:Micro Edition(微机版),针对嵌入式设备的“瘦身版”,注意该版本不是Android,不要混淆。
专有名词
- JDK:Java Development Kit(Java开发工具包),用于Java开发工具软件,包含JRE、java.exe、javac.exe等。
- JRE:Java Runtime Environment(Java运行时环境),用于运行Java程序的软件,如用户不开发,只用Java软件,只装JRE即可,包含JVM和Java类库。
- JVM:Java Virtual Machine(Java虚拟机),虚拟机是指通过虚拟化技术模拟计算机硬件运行的一个软件。主要负责把 Java 程序生成的字节码文件(.class),解释成系统相应的机器指令,让其在各个系统上运行。
三者关系如下图:
┌─ ─ ─ ┌──────────────────────────────────┐
│ │ Compiler, debugger, etc. │
│ └──────────────────────────────────┘
JDK ┌─ ┌──────────────────────────────────┐
│ │ │ │
│ JRE │ JVM + Runtime Library │
│ │ │ │
└─ └─ └──────────────────────────────────┘
┌───────┐┌───────┐┌───────┐┌───────┐
│Windows││ Linux ││ macOS ││others │
└───────┘└───────┘└───────┘└───────┘
语法基础
关键字
用于定义数据类型的关键字 | ||||
---|---|---|---|---|
class | interface | |||
void | ||||
boolean | ||||
byte | short | int | long | |
float | double | |||
char |
用于定义数据类型值的关键字 | ||
---|---|---|
true | false | null |
用于定义流程控制的关键字 | ||
---|---|---|
if | else | switch |
case | default | while |
do | for | break |
continue | return |
标识符
在程序中自定义的名称。
注释
// 单行注释
/*
* 多行注释
*/
/**
* Java类简述
* @author Charlie
* @version 1.0
*/
/**
* 方法简述
* @param value
* @return data
*/
数据类型
分类
┌─ 整型:byte、short、int、long
┌─ 数值 <
| └─ 浮点型:float、double
┌─ 基本 |
│ 数据 < 字符:char
│ 类型 |
│ |
数据类型 < └─ 布尔:boolean
│
│ ┌─ 类:class
│ 引用 |
│ 数据 < 接口:interface
└─ 类型 |
└─ 数组:[]
基本数据类型
类型名称 | 关键字 | 占用内存 | 取值范围 |
---|---|---|---|
字节型 | byte | 1 字节 | -128~127 |
短整型 | short | 2 字节 | -32768~32767 |
整型 | int | 4 字节 | -2147483648~2147483647 |
长整型 | long | 8 字节 | -9223372036854775808L~9223372036854775807L |
单精度浮点型 | float | 4 字节 | ±3.4E+38F(6~7 个有效位) |
双精度浮点型 | double | 8 字节 | ±1.8E+308 (15 个有效位) |
字符型 | char | 2 字节 | ISO 单一字符集 |
布尔型 | boolean | 1 字节 | true 或 false |
字节的由来
为了用二进制表示文字(英文),设计者做出如下统计:26个英文字母,大小写52个;加上10 个数字达到62 个;考虑到还有特殊字符(如- ! @#$%〈& *{} |等)和不可见的控制字符(如换行、制表),必然超过64 个,所以至少需要7个位用于记载2^7=128个字符。为了避免传输或存储时带来的误差,所以预留了一个奇偶校验位。至此,一个八位的字节诞生。
ASCII码表
ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码),是计算机发展初期较成熟的字符集。
这里提及它的原因是该表拥有128个字符,同上文《字节的由来》中提到的“7个位用于记载128个字符”相吻合。
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
补码的存在意义
计算机中的二进制数都是以补码的形式存在,这里我们简单说明一下补码的存在意义。
为了用二进制表示有符号的数字,设计者将最高位定义为符号位(0为正,1为负),那么就会出现正零和负零,而聪明的印度设计者将所有的负数统统取反加一,规定为补码。以一个字节为例,这样使原先的-0变成-128,而-1变成-127,以此类推,直到-127变成-1。完美解决正负零问题,并充分利用了每个位。
浮点数的底层原理
浮点数,顾名思义,它的小数点可以浮来浮去,由此联想到科学计数法,通过改变指数,从而改变小数点的位置。
那么,按照科学计数法的要求,以-0.15625为例,就是。
而在计算机中是以2进制存储数据的,那么就只能以2为底数,而不是10,如:1111(B)=。根据IEEE 754规定,浮点数的表示方法为:,其中
- 符号位:0正,1负。
- 阶码E(指数):可以存放0~255,为了让浮点数的E能够表示正数和负数,在计算时要将E减去127,这样的话阶码E就可以表示-127 ~ 128。
- 尾数F(有效数字):23个位,以二进制存放有效数字,1.xxx...xxx(23个0或1)。
其内部存储结构为1个符号位,8个指数位(二进制中用阶码表示),23个有效数字位(二进制中用尾数表示)。
-0.15625在float中的表现形式为:-0.125×1.25=-0.001(B)×(1+0.01(B))
精度丢失
并不是所有的小数都可以无误差的转换成2进制,但具体丢失细节,本人暂无精力研究透彻。
只需注意存放需要计算的数据时,不要用浮点数,因为其精度丢失容易出现问题。
运算符
- 算术运算符:+、-、*、/、%、++、--
- 赋值运算符:+=、-=、*=、/=、%=
- 关系运算符(比较运算符):==、!=、>、<、>=、<=
- 位运算符(用补码运算!):&、|、~、^、<<、>>、>>>
- 逻辑运算符:&&、||、!
- 三元运算符(条件运算符):?:
- 其他运算符:instanceof
修饰符
- 访问控制修饰符:private、public、protected
- 非访问修饰符:static、final、abstract、synchronized、volatile、transient
语句
循环
- while
- do...while
- for
- for each
条件
- if...else
- if...else if...else(一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。)
- switch case default
数组
package cn.charliejohn.fundamantal;
public class LearningArray {
public static void main(String[] args) {
// 容量需要初始化,并且无法扩容
int array[] = new int[10];
array[0] = 1;
System.out.println(array.length);
}
}
/** console log output
* 10
*/
输入
package cn.charliejohn.fundamantal;
import java.util.Scanner;
public class LearningScanner {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] values = scanner.nextLine().split(" ");
for (String value : values){
System.out.println(value);
}
scanner.close();
}
}
/** console log output
* 1 0 1 0
* 1
* 0
* 1
* 0
*/