后端(第1期):Java快速入门

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个有效数字位(二进制中用尾数表示)。

Image

-0.15625在float中的表现形式为:-0.125×1.25=-0.001(B)×(1+0.01(B))

2020-04-01-15857540707951-floating-number-example
精度丢失

并不是所有的小数都可以无误差的转换成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
 */

你可能感兴趣的:(后端(第1期):Java快速入门)