Basic
1. Java大小写敏感。因此,变量HireDay和hireDay是两个变量
2. Java所有函数都属于某个类的方法。因此,main方法需要一个外壳类
3. System.exit方法
n 概念:
Java与C/C++不同,不向操作系统返回“退出代码”。
main方法正常退出,Java应用程序的退出代码为0,表示成功的运行了程序。
如果希望在终止程序时返回其他代码,则需要调用System.exit方法
n 源代码:
public static void exit(int status) { Runtime.getRuntime().exit(status); }
n 方法说明:
1. 该方法终止虚拟机运行,并释放内存;
2. System.exit(0)表示正常退出程序;System.exit(非0)表示非正常退出;
3. System.exit和return有以下不同:return是回到上一层,而System.exit是回到最上层;
n 应用示例:
在一个if-else判断中,如果程序是按照我们预想的执行,到最后我们需要停止程序,那么我们使用System.exit(0)。而System.exit(1)一般放在catch块中,当捕获到异常,需要停止程序,我们使用System.exit(1)。这个status=1是用来表示这个程序是非正常退出。
n 参考博文:http://www.cnblogs.com/xwdreamer/archive/2011/01/07/2297045.html
4. Java基本数据类型
数据类型 | 存储需求:字节数 | 取值范围 | 默认值 | 特别说明 |
byte | 1’ | -128—+127 | (byte)0 |
|
short | 2’ | -32768—+32767 | (short)0 |
|
int | 4’ | -2147483648到2147483647 共10位 | 0 | 默认整数 |
long | 8’ | -9223372036854775808到9223372036854775807 共19位 | 0L | L |
char | 2’ | \u0000—\Uffff | ‘/u0000’(null) |
|
boolean | 一般认为占据一个字节 |
| false |
|
float | 4’ |
| 0.0f | F |
double | 8’ |
| 0.0d | 默认浮点数 |
boolean类型,理论上占八分之一个字节,因为他只有两个值:true/false 用 0/1 即可表示但是Java中并没有明确定义boolean类型的大小,且在内存中,最小的计量单位是字节
故,一般就认为Boolean占用一个字节
三个特殊的浮点数
正无穷大 | Double.POSITIVE_INFINITY | 一个正数除以0 |
|
负无穷大 | Double.NEGATIVE_INFINITY | 一个负数除以0 |
|
NaN | Double.NaN | 0/0,负数的平方根 |
|
说明:
1. 所有的“非数值”的值都认为是不相同的,涉及到“非数值”的比较方法:
if ( x == Double.NaN ) // 错误
if ( Double.isNaN(x) ) // 正确
2. char类型
表示单个字符,常用来表示字符常量(用单引号括起来的单个普通字符或转义字符)。
一个字符可以用单引号表示,也可以用对应的Unicode编码表示。
5. 浮点数的比较与计算
在计算机系统中,浮点数采用二进制表示。由于二进制是无法精确的表示分数1/10(介于0b0.0001和0b0.001之间),就像十进制无法精确的表示1/3一样(0.33333…)
所以,
1. 浮点类型做加减法是不靠谱的。如果两个浮点数相减得到的数很小,可能就会自动变为0
2. 如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类
6. 数值类型之间的转换
n 合法转换(自动):
n 数值计算中的自动转换:
X + double | (double)X + double |
X + float | (float)X + float |
X + long | (long)X + long |
X + Y(例如char + byte) | (int)X + (int)Y |
n 强制类型转换cast(手动):
默认:double/float——>int截断小数
舍入:long Math.round(double/float),int a =(int)Math.round(44.44);//a=44
溢出:a = byte(300);//a = 44
补充:不要在boolen类型与任何数值类型之间进行强制类型转换,这样可以防止错误。只有极少数的情况才需要将布尔类型转换为数值类型,这是可以用b? 1 : 0;
7. Unicode编码表详谈
n 背景:
1. 相同的代码值在不同的编码方案下对应不同的字母
2. 采用大字符集的语言的编码长度不统一:有的字符单字节表示,有的多字节
n 解决:
1. Unicode字符集统一采用2个字节的代码宽度对字符进行编码
2. 然,中华文化博大精深,由于汉字韩文日文的加入,很快2个字节不够用了
3. 于是引入了代码点( code point ):一个编码表某个字符对应的代码值
4. Unicode中代码点采用十六进制书写,前缀为U+
共有17个代码级别 |
|
|
第1级:基本的多语言级别 | U+0000—U+FFFF | 经典的Unicode代码 |
其余16个附加级别 | U+10000—U+10FFFF | 辅助字符,特定字符 |
5. Java采用了UTF-16编码方案
UTF-16编码采用不同长度的编码表示所有Unicode代码点 | ||
基本多语言级别 | 16bits | 一个代码单元 |
其余16个附加级别 | 32bits:一对代码单元 | 使用了空闲的替代区域 |
6. 在Java中,建议不要使用char类型,而是用String类类型表示
8. 不要使用未被初始化的变量;
9. 关系运算的短路求值特性:x != 0 && 1 / x > x + y;
10. 位运算符:
int fourthBitFromRight = ( n & 0b1000 ) / 0b1000;//根据fourthBitFromRight判断n的右数第4位值(0或1),利用了按位与的“屏蔽位”特性
& 和 | 也可以用于布尔值,得到的结果也是布尔值,只是不按“短路”方式计算。
int fourthBitFromRight = ( n & ( 1 << 3 ) )>> 3;//作用同上
>>> 和 >> :前者逻辑右移(高位补零),后者符号右移(补符号位)
11. boolean类型
Java中,整型值和布尔值不能相互转换
if ( x = 0 ) { … };//在Java中这段代码不能通过编译,帮助程序员减少了麻烦
(如果在C++中,不小心将x == 0,写成了x = 0,程序可以通过编译,结果总是false)
12. 运算符的优先级(某些企业笔试题考这个也是醉)
13. 字符串
n 什么是字符串?
从概念上讲,所谓的字符串就是一组Unicode字符序列。
例如,字符串”Java”——>字符’J’, ’a’, ’v’, ’a’
n String类:
每个用双引号括起来的字符串都是String类的一个实例
n 不可变字符串:
不可变性体现在:String类的对象不能变化,而不是对象变量。String类型的对象变量可以引用不同的String对象。
n 为什么Java字符串不可变?——字符串常量共享机制
编译器实现了字符串常量共享。字符串常量存放在常量池中,字符串变量指向常量池中对应的位置。
如果复制了一个字符串变量,那么原始字符串与复制字符串共享相同的字符。
Java设计者认为共享带来的效率远胜于提取或拼接字符串所带来的小便利
14. 字符串相等性判断
操作 | 操作对象 | 操作结果 |
equals方法 | 字符串常量/变量 | 字面值是否相等 |
== 关系运算符 | 字符串常量/变量 | 内存地址是否相等 |
说明:
只有字符串常量是共享的,而 + 或者 substring等操作产生的字符串并非共享。
因此,不能用 == 测试字符串的相等性
15. 格式化输出——System.out.printf(自查手册)
a) System.out.println(x)://以x对应的数据类型所允许的最大非0数字位数打印输出
16. StringBuffer 和 StringBuilder
StringBuffer
为什么StringBuffer可以变长?
和String内部是一个字符数组一样,StringBuffer也维护了一个字符数组。但是,这个字符数组,留有冗余长度
比如说new StringBuffer("the"),其内部的字符数组的长度,是19,而不是3,这样调用插入和追加,在现成的数组的基础上就可以完成了。
如果追加的长度超过了19,就会分配一个新的数组,长度比原来多一些,把原来的数据复制到新的数组中,看上去 数组长度就变长了
17. 流程控制:建议不要使用一些偏僻的语法,编写流程以简洁明了为第一要务
a) 块可以嵌套,但嵌套的块之间不能含有同名变量
b) switch:注意每一个case后都要有break,否则将从第一个满足条件的case执行,直至遇到break;
c) “伪”goto——带标签的break语句:跳至带标签的语句块的末尾
d) continue:跳过当前循环的剩余部分,直接跳到循环首部
e) 带标签的continue:跳转到与标签匹配的循环首部
18. 大数值:BigInter & BigDecimal类实现任意精度的整数和浮点数运算
19. 数组
1. 数组的默认初始化
2. foreach loop:
int[][] collection=newint[100][100];
/* collection必须是数组或者实现了Iterator接口的对象 */
for (int[] row : collection) {
for (intvalue: row) {
System.out.println(value);
}
}
3. 数组的显式初始化与匿名数组
int[] array = {1,1,1,1,1};
/* 匿名数组:在不创建新变量的情况下重新初始化一个数组 */
array = new int[] {2,2,2,2,2};
4. Java数组长度允许为0 ( !=null)
5. 数组拷贝
public static<T>T[]copyOf(T[] original, intnewLength){
return (T[])copyOf(original,newLength,original.getClass());
}
6. Java数组与C++数组的比较
Java | int[] a = new int[100]; | Java与下类似 |
C++ | int* a = new int[100]; | 在堆上分配100个单元存放指针; |
C++ | int a[100]; | 在栈中分配100个4个字节大小的内存单元,存放数组元素 |
7. public static voidmain(String[] args):命令行参数以字符串数组的形式传给main方法
20. 不规则数组
Java中的多维数组实际上是个伪概念,Java只有一维数组。当一维数组中的元素又是数组时,即构成了所谓的“二维数组”。多维数组被解释为“数组的数组”。因此,每个数组元素的长度可以是不一样的,即所谓的“不规则数组”。