一、Java的基本数据类型
java为数值、字符值、布尔值数据提供了八种基本数据类型
类型名(封装类) | 范围 | 大小(字节) |
---|---|---|
byte(Byte)字节 | -128~127(2的7次方) | 1字节 |
short(Short) 短整型 | -32768~32767 (2的15次方) | 2 |
int(Integer)整型 | 4字节 | |
long(Long)长整型 | 8 | |
float (Float)浮点型 | 4字节 | |
double(Double) 双精度型 | 8 | |
boolean(Boolean) 布尔型 | ||
char(Character) 字符型 | 2 |
1byte=8bit
代码测试基本数据类型范围
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
整型默认的常量值: int类型
Long a1 = 21 //这时自动将a1转换成Int类型的数据(主动)
Long a2 = 210000000000 //这时提示报错,因为a2的数值大于了int的取值范围
Long a2 = 210000000000L //正确
浮点型默认的常量值:double类型
float a1 = 1.1; //报错
float a1 = 1.1f; //正确
double a = 1.1; //正确
double a = 1.1d; //正确
char a = 97;
syso(a); //输出为字符a
char b = 65;
syso(b); //输出为A
二、String类型
String类型不是基本数据类型,是引用类型
String对象的简单方法
方法 | 描述 |
---|---|
length() | 返回字符串中的字符数 |
charAt(index) | 返回字符串s中指定位置的字符 |
concat(s1) | 将本字符串和字符串s1连接,返回一个新的字符串 |
toUpperCase() | 返回一个新字符串,其中所以的字母大写 |
toLowerCase() | 返回一个新字符串,其中所以的字母小写 |
trim() | 返回一个新字符串,去掉两边的空白字符串 |
调用规则:
String s = "Hello Java";
s.方法名();
三、基本数据类型和引用数据类型
1、基本数据类型和引用数据类型的区别:
每个变量都代表一个存储值的内存位置。当声明一个变量时,就是在告诉编译器这个变量可以存放什么类型的值。
对于基本类型变量来说,对应内存所存储的值是基本类型值。 对引用类型变量来说,对应内存所存储的值是一个引用,是对象的存储地址。
2、如果一个引用类型的数据域与没有引用任何对象,那么这个数据域的默认值是null;
数值类型数据域的默认值是0;boolean类型数据域的默认值是false; char类型数据域的默认值是‘\u0000’。
但是java没有给方法中的局部变量赋默认值
例如:1
报错:系统会提示你 变量a 没有进行初始化
例如:2
由此可见:java不会给方法中的局部变量赋值,但是会给全局变量赋值
四、java编译器和java解释器
Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种字节码就是JVM的“机器语言”。
Java解释器:是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。
JVM负责运行字节码:JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。
五、“==”和equals()
“==”
在java中,主要有两个作用。
1、基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。
2、引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。
equals()
1.Object里面的equals()方法
比较的也是地址,和“==”效果一样
2.String里面重写了equals()方法
重写后比较的就是 字符串的内容是否一样
五、常量池
详情分析常量池
常量池分类
常量池大体可以分为:静态常量池,运行时常量池。
1.静态常量池 存在于class文件中,比如经常使用的javap -verbose中,常量池总是在最前面把?
2.运行时常量池呢,就是在class文件被加载进了内存之后,常量池保存在了方法区中,通常说的常量池指的是运行时常量池。所以呢,讨论的都是运行时常量池
字符串常量池
最最最流行的、最典型的就是字符串了
典型范例:
> String a = "abc";
> String b = new String("abc");
> System.out.println(a == b);
>
> 结果:false
这个是第一个需要理解的地方,a指向哪片内存,b又指向哪片内存呢?
对象储存在堆中,这个是不用质疑的,而a作为字面量一开始储存在了class文件中,之后运行期,转存至方法区中。
它们两个就不是同一个地方存储的。知道了它之后我们就可以通过实例直接进一步了解了
实例
String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // true
System.out.println(s1 == s4); // false
System.out.println(s1 == s9); // false
System.out.println(s4 == s5); // false
System.out.println(s1 == s6); // true
分析:
1、s1 = = s2 很容易可以判断出来。s1 和 s2 都指向了方法区常量池中的Hello。
2、s1 = = s3 这里要注意一下,因为做+号的时候,会进行优化,自动生成Hello赋值给s3,所以也是true
3、s1 = = s4 s4是分别用了常量池中的字符串和存放对象的堆中的字符串,做+的时候会进行动态调用,最后生成的仍然是一个String对象存放在堆中。
4、s1 = = s9 在JAVA9中,因为用的是动态调用,所以返回的是一个新的String对象。所以s9和s4,s5这三者都不是指向同一块内存
5、s1 = = s6 为啥s1 和 s6地址相等呢? 归功于intern方法,这个方法首先在常量池中查找是否存在一份equal相等的字符串如果有的话就返回该字符串的引用,没有的话就将它加入到字符串常量池中,所以存在于class中的常量池并非固定不变的,可以用intern方法加入新的