乐趣区

读书笔记写给大忙人的JavaSE-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)
退出移动版