目录
Java基础
一、数据类型
基本类型
-
byte/8
-
char/16
-
short/16
-
int/32
-
float/32
-
long/64
-
double/64
-
boolean/~
boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的。
包装类型
参考
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
Integer x = 2; // 装箱
int y = x; // 拆箱
缓存池
new Integer(123) 与 Integer.valueOf(123) 的区别在于:
- new Integer(123) 每次都会新建一个对象;
- Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用;
- Integer a = 1 <==> Integer a = Integer.valueOf(1);
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
基本类型对应的缓冲池如下:
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range \u0000 to \u007F
二、String
1.常量优化机制
Java有常量优化机制:
1.如果常量池中有创建的对象,则仅仅是将地址指向这个常量即可。
2.如果是几个字符组成的字符串,变成字符串常量的时候,也是遵循上一条规定;
String s1 = “a”+“b”+“c”;
String s2 = “abc”;
System.out.println(s1== s2);
结果是ture,这表明,s1和s2共用一个内存地址,这体现了Java中的常量优化机制。
但是:
1.常量优化只是针对常量,如果有变量的话就不能被优化
判断定义为String类型的s3和s2是否相等
Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。
字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。
字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。
String s1 = “ab”;
String s2 = “abc”;
String s3 = “c” + s1;
//在堆内存中创建一个StringBuffer对象~~~
//然后调用他的tostring()方法称为String对象
//s3即引用的就是这个String对象
System.out.println(s3 == s2);false
System.out.println(s3.equals(s2));true
String s3 = s1+“c”;这一句话,是在StringBuffer缓冲区中进行创建一个StringBuffer对象,将两者相加。但是对s3进行赋值时不能够直接将缓冲区的对象地址取来而是用toString方法变成另外的堆内存,然后赋值给s3,所以,s3和s2的地址值已经不同了。
2.String对象的不可变性
参考
这就涉及到了Java中String对象的不可变性,什么叫不可变性呢,简单的说就是一旦一个String对象被创建并被赋值(初始化)这个对象的值就不会变化。
一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。
3.参数传递
4.String x = "abc"和String y = new String(“abc”)的区别
1.判断定义为String类型的s1和s2是否相等
String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2);true
在内存中有一个常量池,
当我们创建常量时;系统先看常量池中有没有这个常量,如果有,则不创建直接引用这个常量
所以,s1和s2引用的是一个常量 ,记录的是一个地址值
== 判断引用数据类型的地址是否相等
System.out.println(s1.equals(s2));true
public boolean equals(Object anObject)
将此字符串与指定的对象比较。当且仅当该参数不为 null,
并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
2.下面这句话在内存中创建了几个对象
String s1 = new String(“abc”);
new 进堆内存
常量池一个对象“abc”
堆内存一个对象“abc”的一个副本
这样就创建了两个对象
3.判断定义为String类型的s1和s2是否相等
String s1 = new String(“abc”);记录的是堆内存对象的地址
String s2 = “abc”;记录的是常量池内对象的地址
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//true