1,基本数据类型(primitive type)
从低级到高级依次为:
byte(8bit)、char(16bit)、short(16bit)、int(32bit)、long(64bit)、float(32bit)、double(64bit);(低级向高级是隐式类型转换,高级向低级必须强制类型转换)
boolean(1bit)。
值传递(call by value)
1)char
char型变量中能不能存贮一个中文汉字?为什么?
是能够定义成为一个中文的,因为java中以unicode编码,一个char占2个字节(16位),所以放一个中文是没问题的。
当字符型与整型运算时会自动转换成整型。如:’a’ % 3
中,a的ASCII码为97。
2)float
float f=3.4是否正确?
不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 或f = 3.4f。
原因:
在java里面,没小数点的默认是int,有小数点的默认是 double。
编译器可以自动向上转型,如int 转成 long 系统自动转换没有问题,因为后者精度更高。double 转成 float 就不能自动做了,所以后面的加上个f;
3)int
①java中int占4个字节。
②java整型的字节序是Big-Endian(大端)
a.字节序
指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
通常有Little-Endian(小端)和Big-Endian两种方式。
b.Little-Endian(小端)
指低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。
如:0x12 34 56 78存储为: 0x78 | 0x56 | 0x34 | 0x12(低地址—->高地址)
c.Big-Endian(大端)
如:0x12 34 56 78存储为: 0x12 | 0x34 | 0x56 | 0x78(低地址—->高地址)
4)double
整数型默认为int,带小数的默认为double.
5)long
java中long占8个字节(64bit/8)。
6)byte(8bit)
初始化为null。
byte和short型在计算时会自动转换为int型计算,结果也是int 型。
实现了GBK编码字节流到UTF-8编码字节流的转换:
byte[] src,dst;
dst=new String (src,"GBK").getbytes("UTF-8");
//String (byte[] bytes, String charsetName) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的
//String.getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
2,引用数据类型
String(不可变性)
包装类:Byte,Short,Integer,Long,Character
1)概念
①指针大小
对于某个数据类型的指针:
指针指向数据的起始地址,指针大小就是起始地址的大小,取决于计算机的字长。对于32位机是4字节,64位机是八字节。
②引用传递(call by reference)
java中引用类型的实参向形参的传递,只是传递的引用,而不是传递的对象本身。
2)String
3)Interger
java中引用类型的实参向形参的传递,只是传递的引用,而不是传递的对象本身。
public class Tester{
public static void main(String[] args){
Integer var1=new Integer(1);
Integer var2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
(图片来自牛客网anhoulin用户)。
注意:var1==var2,比较的是地址。
3,数据比较
1)“==”
①包装类型(即对象)
“==”比较的是地址。
②常量池
对于值小于等于127并且大于等于-128的Integer、long类型的数字,使用常量池,因为他们至占用一个字节(-128~127)(byte的范围是-128~127);
超出这个范围,无法直接从cache中读取,每次产生的对象是新的对象。
如:
例子一:
Integer i01=59;
int i02=59;
Integer i03=Integer.valueOf(59);
Integer i04=new Integer(59);
Integer i05=new Integer(59);
首先,对于非new出来的Integer,如果数在-128到127之间,因为常量池的关系,所以i01==i03为true.
java在编译Integer i01 = 59时,翻译为: Integer i01 = Integer.valueOf(59);而valueOf()函数会对-128到127之间的数进行缓存。
第二,对于有new出来的Integer,在heap中开辟了一块新内存放置值为59的Integer对象
在内存中为:
例子二:
对于不在(-128~127)这个范围的数,不能直接从cache中获取对象,则每次对象的地址是新的。
Integer i1 = 128;
Integer i2 = 128;
System.out.print(i1==i2);//输出false
当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。
128不在常量池范围内,故i1与i2不是同一个对象。
例子三:
String i3 = "100";
String i4 = "10"+new String("0");
System.out.println(i3 == i4);//false
String i7 = "100";
String i8 = "10" +"0";
System.out.println(i7 == i8);//true
③基本型和基本型封装型进行“==”运算符的比较
基本型封装型将会自动拆箱变为基本型后再进行比较。
如:Integer(0)和int i = 0比较,Integer(0)会自动拆箱为int类型再进行比较,结果为相等。
④String和char[]
String s = "he";
char c[] = {'h','e'};
System.out.println(s.equals(c));//s为字符串,c为数组对象,故结果为false
2)equals
两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true;
基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。