共计 3266 个字符,预计需要花费 9 分钟才能阅读完成。
读书笔记《写给大忙人的 JavaSE 9 核心技术》
第一章 基本的编程结构
关于 Java 用途的定义
Java 不是用来快速完成几个命令的脚本语言,它明确定位为可以从组织有序的类和包以及模块中获益的 大型程序 的编程语言
JShell
Java 9 中引入的运行 Java 语句的交互式命令窗口,和 Python Node 差不多。
基本类型
8 种基本类型
有符号整型
类型 | 存储需求 |
---|---|
byte | 1 个字节(-128–127) |
short | 2 个字节(-32768–32767) |
int | 4 个字节(约 20 亿) |
long | 8 个字节(约 9 千亿亿)2 的 63 次方 |
如果 long 类型还不够用,可以使用 BigInteger 类
- 0x 是 16 进制前缀
- 0b 是 2 进制前缀
tips: 为了方便阅读,可以在数字中间加上下划线,1_000_0000,编译时会自动删除掉。
浮点类型
类型 | 存储需求 |
---|---|
float | 4 个字节(6- 7 位有效小数) |
double | 8 个字节(15 位有效小数) |
对于 float 来说,4 个字节,32 位,0-22 位表示尾数,23-30(8 位)表示指数,31 位表示符号位。
对于 double 来说,8 个字节,64 位,0-51 表示尾数,52-62(11 位)表示指数,63 位最高位表示符号位。
浮点数不适合做金融计算
java
2.0-1.1 = 0.89999999999
二进制表示浮点数有些数字是没办法精确表示的。
如果要精准无误的表示应使用 BigDecimal
char 类型
JAVA 中,char 占 2 字节,16 位。可在存放汉字
- char a='a'; // 任意单个字符,加单引号。- char a='中'; // 任意单个中文字,加单引号。- char a=111; // 整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。
注:只能放单个字符。
布尔类型
true false
关于字符集、字符编码
Unicode
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为 0 就可以。
ASCII
一个字节能表示的最大的整数就是 255(二进制 11111111= 十进制 255),0 – 255 被用来表示大小写英文字母、数字和一些符号,这个编码表被称为 ASCII 编码,比如大写字母 A 的编码是 65,小写字母 z 的编码是 122。
GB2312
如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和 ASCII 编码冲突,所以,中国制定了 GB2312 编码,用来把中文编进去。
参考资料:
- https://www.cnblogs.com/tsing…
- https://baike.baidu.com/item/…
strictfp
关键字 strictfp 是 strict float point 的缩写,指的是 精确浮点,它是用来确保浮点数运算的准确性,JVM 在执行浮点数运算时,如果没有指定 strictfp 关键字,此时计算结果可能会不精确,而且计算结果在不同平台或厂商的虚拟机上会有不同的结果,导致意想不到的错误。
而一旦使用了 strictfp 来声明一个类、接口或者方法,那么在所声明的范围内,Java 编译器以及运行环境会完全依照 IEEE 二进制浮点数算术标准来执行,在这个关键字声明的范围内所有浮点数的计算都是精确的。
需要注意的是,当一个类被 strictfp 修饰时,所有方法都会自动被 strictfp 修饰。
因此,strictfp 可以保证浮点数运算的精确性,而且在不同的硬件平台会有一致的运行结果。
public strictfp class Test {
int a = 1;
public static void testStrictfp(){
float f = 0.12365f;
double d = 0.03496421d;
double sum = f + d;
System.out.println(sum);
}
public static void main(String[] args) {testStrictfp();
}
}
运行结果:0.15861420949932098
字符串
字符串不是基本类型,字符串是对象!
字符串连接
将几个字符以分隔符连接起来,可以使用 join()方法,
String names = String.join("-","Peter","Paul","Mary")
在操作大量字符串时,使用 StringBuilder 效率更高
字符串截取
String w = "Hellow,World";
w.substring(7,12);// 开始位置,结束位置(不包含)
字符串比较相等
w.equals("World")
// 是比较在内存中是否是一个对象,而不是字面量
w == "World"
// 不考虑大小写比较字符串
w.equalsIgnoreCase("World")
数字转字符串
Integer.toString(number,n)// number 要转换的数字,n:基数,就是几进制,不传默认十进制
// 最简便的方法 数字加空串
number+""
字符串转数字
Integer.parseInt()
Double.parseDouble()
读取输入
System.in 对象只能读取单个字节的方法,要读取字符串和数字,需要构造一个依附到 System.in 的 Scanner
Scanner in = new Scanner(System.in)
String s = in.nextLine()
if(in.hasNextInt()){int age = in.nextInt()
}
// 读取密码是可以只用 Console 类
Console terminal = System.console()
String s = terminal.readLine("user name");
char[] pasw = terminal.readPassword("Password");
shell 重定向
输入输出到文件
java mypackage.MainClass<input.txt> output.txt
此时 System.in 从 input.txt 中读取,System.out 将会输出到 output.txt
循环
break 跳出整个循环
continue 跳出此次循环
数组和数组列表
数组定长不可变
String[] myStringArr = nwe String[100]
构造数组时 Java 会默认填充数组,
- 数字类型、char 类型 用 0 填充
- boolean 用 false 填充
- 对象数组用 null 填充
数组列表较为灵活
ArrlyList 对象在内部管理数组。数组不够用时会自动创建另外一个内部数组,并且将元素移动到该数组。这个过程对程序员透明。
数组列表是泛型类,泛型类不能使用基本类型作为类型参数,要用基本类型的包装类。
ArrayList<int> // 错误
ArrayList<Integer>// 正确
- Integer
- Byte
- Short
- Long
- Character
- Float
- Double
- Boolean
增强型 for 循环
int[] numbers = new int[10]
for(int n : numbers){sum += n}
此时的循环变量不是索引值,而是索引对应的值。
数组与数组列表的复制
int[] numbers = new int[10]
int[] myNums = numbers
此时 numbers,myNums 这两个变量引用同一个数组对象,也就是这两个变量共享一个数组,利用 numbers 进行操作,myNums 也会变。JavaScript 中也是这样!
int copys = Arrays.copyof(numbers,numbers.length)
//friends 为已有的数组列表
ArrayList<String> copys = new ArrayList<>(friends)
命令行参数
java test.java -name merry -p 3306
-name merry -p 3306 这四个字符串会封装成一个字符串数组传递给 main 函数
public static main(String[] args)