学习《Java核心数据》(原书第十版)的笔记------第三章
1、Java区分大小写
2、包名采用全部小写;项目名称首字母小写;类名采用驼峰命名法,每个单词的首字母大写;对象名及变量名使用小驼峰命名法
3、源代码的名字必须与类名相同
4、main方法必须声明为public方法
5、java中的所有代码都放在类中
6、三种注释的写法
行注释://statement
块注释:/* statement */
文档注释,用于说明某个模块的作用,生成文档 /** statement */
7、数据类型
Java数据类型的字长与平台无关,是固定的
整形
类型 | 长度(字节) |
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
浮点型
类型 | 长度(字节) |
float | 4 |
double | 8 |
一般而言不用float,因为其精度有限;除非在对占用空间十分敏感或者存储大量数据的地方
另外,浮点运算将存在一定误差,比如
for (double i=0; i<=10; i++)
可能不会执行11次,因为i可能从9.0000000000001直接变为10.0000000000001
并且,在不同的计算机上运行时,由于CPU对浮点运算会有不同的优化,比如intel64位会将double的中间运算结果扩展到80位,最终结果再截取为64位,造成精度更高。但是再不同计算机上会有不同结果。
如果想要得到可预测的结果,需要在函数之前加上strictfp关键字,禁止进行浮点优化。
其他
类型 | 长度(字节) |
char | 2 |
boolean | 一个数据位 |
8、长整型字面量后加L,float字面量之后加f;十六进制以0x或者0X开头,八进制以0开头,二进制以0b开头
9、三种特殊类型的数值
正无穷,负无穷,NaN(不是一个数字)
整数除0发生异常,浮点除0得到无穷值
判断一个数是否为数值,可以用Double.isNaN(x)
10、因为计算机用二进制表示数字,所以无法精确表示所有数字,如果需要十分精确,没有四舍五入,需要使用BigDecimal
11、char类型
一个占用2个字节的数据类型.
Java采用Unicode形式的UTF-16编码方式,每个char占用两个字节,可以用转义字符\uxxxx的十六进制来表示。
Unicode转义序列在解析代码之前就会得到,比如c:\user\dir会报错,因为\u之后没有跟四个数字;比如字符串字面量
"\u0022+\u0022"会被认为时""+"",是空字符串,而不会被认为是字符串"+"
12、Unicode和char
Unicode编码范围是0x10FFFF:0x0,分成了16个区,其中0区是常用字符的编码区,如ASCII,中文等,范围是0x0000-0xFFFF,所以用一个16位就可以表示。其他字符需要两个16位来表示,即两个char。
编码中,将一个16位称为一个代码单元,即一个char;将一个字符成为一个码点。
所以,码点和char有很大区别。在使用Java字符串时,使用String.atChar得到的不是某个字符,而是某个代码单元的值。
为了遍历字符串,需要使用String.codePoints().toArray()将码点转换成码点的数组,再进行遍历。
!!!尽量不要使用代码单元(char)
13、常量
使用final关键字声明,虽然constant是关键字,但是没有被用到
14、在C++中,int i;是定义变量; extern int i;是声明变量
但是java并不区分。
15、运算符------加减乘除模
java的模运算,使用Math.floorMod可以避免负数的模出现负数,因为数学家规定余数必须是正数。
16、数学运算与常量 java.util.Math
pow(),sin(),cos(),tan(),atan(),atan2(),exp(),log(),log10(),E,PI
17、数值类型转换
double类型运算,都被转换成double,float一样
long类型运算,都转成long
否则都被转成int
18、强制类型转换
使用Math.round()进行四舍五入,返回long
19、自增自减运算符
20、关系运算符
==,!=,<,>,<=,>=
&&,||,!
&&和||按照短路规则进行计算,如果求得前面表达式可以确定结果,则不会求后面。用如下方法可以避免除0错误
if (x!=0 && 1/x<10)
21、位运算
& ^ ~ ^
<< >>右移用符号位补最高位 >>>右移补用0最高位
22、枚举类型
enum Size{S,M,L,XL,XXL,XXXL}
Size size = Size.XXL;
23、字符串及其子串
String.equals()
String.length()
24、字符串构造器
StringBuilder.append()向字符串后方加入字符
toString()转化为字符串
25、输入
Scanner in =new Scanner(System.in);
in.next()
in.nextLine()
in.nextInt()
26、格式化输出
System.out.printf()
String.format()
27、使用%n$代表输出参数的编号,从1开始;使用%<xxxx代表使用和前一个格式化输出相同的参数编号。
28、使用%tx打印时间
29、文件输入
构造Scanner("filename", "charset");
30、文件输出
构造PrintWriter("filename")
31、switch分支
每个选择之后必须加上break;否则可能执行多个语句块。
32、不能用==判断字符串相等。字符串是对象,==会判断其指向的内存单元是否一样
33、中断控制流程语句
break label;
label放在想要跳出的循环的前边,加冒号;
可以当作goto使用。
34、BigDecimal和BigInteger
用于计算长浮点和长整型
java没有运算符重载,所以只能用add,substract,multiply,divide进行运算。
使用BigInteger a = BigInteger.valueOf(x);将int转化成大整形。
35、数组
声明一个数组:
int[] a;
初始化:
a = new int[100];
36、二维数组
java没有真正意义上的二维数组。只是创建了一个一维数组,里面每个元素都是一个一维数组。在初始化阶段,java会自动执行这种引用。
如果想要创建不规则数组,需要自行初始化赋值,如
int[] a = new int[100];
for (int i = 0; i<100; i++) a[i]=new int[i];
37、数组的排序方法Arrays.sort()
38、foreach遍历语句
foreach (int i: arr){statements;}
但是foreach不能自动遍历二维数组,因为java只有一维数组,所以要这样写
foreach (int[] i:arr)
foreach (int j:i){statements;}