JavaSE
JavaSE技术范围
JavaSE范围包括Java基础和Java高级部分
基础部分:数据类型、变量、运算符、循环结构、数组、面向对象(以封装、继承和多态展开来讲)
高级部分:多线程基础、常用类于API、枚举类、注解、反射、泛型、IO基础、JVM虚拟机基础
基础部分
数据类型
数据类型分为:基本类型和引用类型
基本数据类型很好理解,即8种基本数据类型:byte、short、int、long、float、double、char、float
默认值是依据作为成员变量时,如果不显示初始化时,在类对象实例化过程中,被填充的默认值
类型 | 空间 | 默认值 |
---|---|---|
byte | 1字节 | 0 |
short | 2字节 | 0 |
int | 4字节 | 0 |
long | 8字节 | 0L |
float | 4字节 | 0.0f |
double | 8字节 | 0.0d |
char | 2字节 | ‘\u0000’ |
boolean | 1字节 | false |
引用类型也很好理解,即:类、接口和数组
在平常的代码书写时,外面用到的直接量即字面量,整数字面量整型(int)和小数字面量双精度浮点型(double)
关于char
/**
* 1.char 占用2个byte空间即 16bit
* 2.char 可以与int进行转换,毕竟int类型的范围包含char
* 3.char 的特殊字符转义字符
* 换行符 \n\r (windows下)
* 制表符 \t
* 4.可以用Unicode来进行char表示 Unicode是16进制表示 '\u0020'
*/
变量
变量分类
变量分为静态变量、成员变量和局部变量
静态变量:一般在类加载过程时,静态变量(static)被放入方法区内
成员变量:一般指实例变量,类的实例变量,对象拥有的
局部变量:指的是方法内声明的变量(基本类型、引用类型),一旦方法结束后,所占空间将被GC回收
局部变量的说明
什么是局部变量:局部变量就是在方法体或代码块中声明的变量,方法执行完或代码块执行完,该变量就会被弹出栈。实际上,局部变量是保存在栈中(虚拟机栈),局部变量表。特别注意的是,形式参数也是局部变量,随方法结束一起消亡。
成员变量的说明
成员变量如果没有初始化,有其默认值:基本类型为其本身的默认值,引用类型的默认值为null
变量提升
变量提升即,在byte、short、char基本类型作运算的时候,会自动被提升为int类型的变量计算,得到的结果类型仍然为int
byte byte1 = 1;
short short1 = 2;
char c1 = '好';
// byte short char类型会自动提升为int类型进行计算
int result = byte1 + short + c1 ;
隐式转换
在变量赋值的时候,如果“=”左右两边是不同的基本数据类型,小的范围自动被隐式转换为大范围
// 左边范围大,隐式转换
long l1 = 1234; // int 转 long,隐式转换
// 这里用到了缓存机制,127在-128~127内,虽然说字面量式int,但是范围在缓存内,也可以式转换
byte byte = 127;
缓存机制
Java底层提供了数值类型的缓存机制,对Byte、Short、Integer、Long这四种包装类进行了数值的缓存
缓存何时生效?通过调用包装类的valueOf()方法时,会用缓存,以Byte为例
public final class Byte extends Number implements Comparable<Byte> {
// 略
private static class ByteCache {
private ByteCache(){
}
static final Byte cache[] = new Byte[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Byte((byte)(i - 128));
}
}
// 这里用到了缓存
@HotSpotIntrinsicCandidate
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
}
Integer的缓存有些特殊,它可以通过JVM启动参数来设置
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {