这是JAVA学习总结的第一课。我希望用一种最易懂的方式将java语言的特点包括一些细节都记录下来。学习总结不是指导我们如何学习一门语言,而是让我们看清java语言与其他语言的不同,特别是与C/C++。如果想要详细的学习java,可以看thinking in java 或者 java in core更合适。本学习总结仅仅是本人巩固java基础的笔记而言。对java有一定了解的同学可以看看这个专题,看看其中是否有一些点你不熟悉或者遗忘了呢?
1. java语言的可移植性比C/C++更好,它在语法层就尽量避免了与OS和硬件有关。
比如:在java中规定了基本类型的字节长度:int(4字节),short类型(2字节), long类型(8字节),byte类型(1字节),float类型(4字节),double类型(8字节),char类型(2字节)。这些与OS层和具体硬件没有关系,我觉得对于一门高级语言这点特别重要,更加有利于开发者书写鲁棒型的代码。
2. char类型用于表示单个字符,占2个字节(必须明确哦,只占用2个字节)。unicode编码单元可以表示为16进制值,而现在的unicode编码已超过16位,范围从U+000000到U+10FFFF(20bit)。每一个符号是一个代码点,在java中用utf-16对其进行编号,分为基本多语言级别,和16个附加级别,辅助字符采用一对连续的代码单位进行编码。也就是在java中增补字符集用4个字节表示,普通的字符用2个字节表示。从这里就可以知道,char类型是无法存储增补字符集的。String中的length()方法也是计算字符串中的代码单元,而并非几个代码点,这个需要特别的强调。
3. java中boolean只有两值:true与false。整型值与布尔值之间无法进行转换(这个与C/C++不一样)。
4. “>>”与"<<"进行二进制位左右移。>>>将用0填充高位,>>运算符用符号位填充高位。没有<<<操作符。
这里特别注意的是:对于移位运算符右侧参数需要进行模类型长度(32/64)运算。所以1<<35与1<<3是一样的结果,都是8。
5. java中的基本类型默认的转换规则:
(1) 有double, 转double
(2) 有float, 转float
(3) 有long, 转long
(4) 都没有,那么都转为int
以上这些规则是按优先级从大到小来的。
7. 空串与null不一样
8. 代码点与代码单元
前面说过的String的length()方法返回的是多少个代码单元数量。
要找代码点要用codePointCount()。
要返回位置n的代码单元:char first = greeting.charAt(0);
代码点:offsetByCodePoints(0, i);
codePointAt(index);
isSupplementaryCodePoint(cp);
9. 大数值处理用BigInteger和BigDecimal。
11. 数值int[],String[], 与C/C++不同,创建一个数字数组时,所有元素都初始化为0。boolean数组中元素都初始化为false。对象数组的元素则初始化为一个特殊值null,表示未存放任何对象。String[] names = new String[10]; names中有10个元素,元素为引用,指向null对象,赋值改变引用。
12. for each 循环的使用。
for (变量:集合) {}
13. 数组初始化以及匿名数组
int[] a = {2,3,4};
int[] a = new int[]{17, 19, 20};
可以创建长度为0的数组,new elementType[0];长度为0与null不同。
多维数组:double[][] a = new double[5][]; 这个在java中是允许的;
a中的5个元素是double[]型的
java中的double[][] a = new double[10][6];
等于C++中的下面操作:
double** a = new double*[10]; <-10个指针数组
for (int i = 0; i < 10; i++)
a[i] = new double[6];
不同于C++中的double (* balance)[6] = new double[10][6];
在java中a[]中元素仍可指向其它不同长度一维数组。
14. 在java中,不能在嵌套的两个块中声明同名变量。但C++中可用
for (int i = 0; i < n; i++)
for (int i = 0; i < k; i++) 这样在java中就是错误的。
15. final实例:指该引用值不能改变,不代表所指向的对象不能改变。