1,数据类型
java数据类型分为基本类型(原始类型、原生类型)和引用类型两种。
1.1 基本类型
包括布尔类型、数值类型、returnAddress类型。
1.1.1 布尔类型
boolean,取值false和true。虚拟机对其支持非常有限,没有专用的字节码指令,所有java源代码中的涉及到的boolean运算,编译后都使用int代替。boolean数组,在虚拟机层面,作为和byte数组一样处理。
1.1.2 数值类型
分为整型和浮点两种,和C\C++不同,其存储大小、字节序(大端)、符号固定,和机器无关,在所有平台上都一样。
整型包括:
byte: 8位(bit)有符号二进制补码整数
short: 16位(bit)有符号二进制补码整数
int: 32位有符号二进制补码整数
long: 64位有符号二进制补码整数
char: 16位无符号二进制整数
浮点(IEEE 754)包括:
float: 32位,单精度
double: 64位,双精度
1.1.3 returnAddress类型:
指向一条虚拟机指令的操作码,在JAVA语言中并不存在相应的类型,程序员无法直接使用。
1.2 引用类型
分为三种引用类型:类类型、数组类型、接口类型
引用在某种语义上等同于C\C++中的指针,指向一个相应类型(类、数组、接口)实例对象。
当一个引用类型不指向任何对象时,其值为一个特殊值:null。引用的默认值就是null。
2,变量
2.1 定义和初始化
c\c++区分变量的声明和定义,但java不区分,只有定义(或声明)。
局部变量未初始化就使用,在java中会报编译错。
2.2 常量
java中用关键字final表示常量。const作为java的保留关键字,但目前并没有使用,java必须使用final.
3, 字符串
java中没有内置字符串类型,所有的字符串都是标准库String类的实例。
String类是一个final类,其对象是不可变字符串,意味着无法对String类对象(字符串)做任何修改,也就意味着对字符串的修改会导致新字 符串对象的创建,这显然是耗时耗空间的事情。之所以设计成final,其意图是可以让字符串常量共享。字符串的本质是Unicode字符序列,如果两个字 符串常量对象有着相同的字符序列,那么这两个对象可以指向同一个字符序列 - 即内存中(常量池)中只需要保存这个字符序列的一个副本。
字符串可以和其他任何对象以及基本类型进行拼接,比如"this is " + obj,本质是调用obj.toString方法将obj转换成一个string对象,然后进行拼接。
字符串拼接时会创建新的String对象,时间空间效率都比较差,因此最好用StringBuffer和StringBuilder来创建,这两者的接 口一样,前者效率略低,但可用于多线程环境中(同步导致性能降低)。 StringBuffer不是final类,可自由添、删、改而不会导致创建新对象。
在使用StringBuffer时,默认的构造函数会分配16个char的空间,如果append的字符串超过这个大小,就会导致空间的重新分配和原有字符串的拷贝,因此,在字符串大于16 char时,应尽量使用指定空间大小的构造函数。
4,数组
数组是一种引用类型,在java中有两种定义风格:int[] a 和 int a[],java程序员一般使用前者。java中数组长度可以为0。
初始化:
int[] a = new int[10];
int[] a = {1, 2, 3, 4, 5};
int[] a = new int[]{1, 2, 3, 4, 5};
拷贝:
int[] a = {1, 2, 3, 4, 5};
int[] b = a; // 并没有做元素拷贝,只是简单的将b和a指向(引用)同一个数组。
int[] c = Arrays.copyof(a, a.lenth); //生成一个新的数组对象,将a的元素拷贝到这个对象中,然后让C指向这个对象。
java中并没有“真正的”多维数组,只有一维数组,多维数组被解释为数组的数组。