1.基本数据类型
-
byte/8
-
short/16
-
int /32
-
long/64
-
float/32
-
double/64
-
boolean/~
-
char/16
boolean没有具体的长度类型 在jvm中会将它默认变为int类型
2.包装类型
- Byte
- Short
- Integer
- Long
- Float
- Double
- Boolean
- Character
Integer x = 2; // 装箱 调用了 Integer.valueOf(2) 自动装箱
int y = x; // 拆箱 调用了 X.intValue() 自动拆箱
3.缓存池
在一定范围内会创建一个缓冲池,在这个缓存池范围内下次进行取值 就不用再进行new对象
-
/** * Returns an {@code Integer} instance representing the specified * {@code int} value. If a new {@code Integer} instance is not * required, this method should generally be used in preference to * the constructor {@link #Integer(int)}, as this method is likely * to yield significantly better space and time performance by * caching frequently requested values. * * This method will always cache values in the range -128 to 127, * inclusive, and may cache other values outside of this range. * * @param i an {@code int} value. * @return an {@code Integer} instance representing {@code i}. * @since 1.5 */
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);如果这个数值在-128-127直接 虚拟机直接从缓冲池拿 不然就要new一个全新的对象
valueOf() Integer=i会触发自动拆箱
new一个对象 必然会在堆上创建一个对象 毋庸置疑
Integer i=0;
Integer j=1;
System.out.println(i==j);//始终为false
}
基本类型对应的缓冲池如下:
- 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
4.String
1.final修饰的类 表示这个类不可以被继承–>为什么不可以被继承
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
XXX
}
final主要还是作用于性能和安全性:
性能:(1)final关键字使得所有的方法和属性都是final的,可以让java虚拟机找到内联的机会 将函数进行内联
优化 可以提升50%性能
(2)正因为String是final才会引入String的缓冲池技术,当缓冲池里面有一个对象是缓存的,有若干个变量去在
指向这个唯一的对象,如果String是可变的,那么将导致这些变量所指向的都会混乱。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WYzJQw9a-1575890757267)(C:\Users\Administrator\Desktop\个人收藏\1575887180097.png)]
安全性:(1)java一直是一个安全性的操作系统,很多危险操作都不允许开发者去尝试,比如说病毒,病毒涉及到底层,这里就要说到java大名鼎鼎的native调用,其底层偏向于操作系统,而String是我们用得比较多的对象如果String不定义成Final类型,很容易继承之,然后生成不必要的类,还有可能威胁底层系统安全,所以定义成final必然有它的好处.
(2)正因为String不可变,例如我们在连接数据库 数据库连接信息和socket编程之中都需要String来参与,如果String是可变的 ,如果图谋不轨的人改变字符串指向的对象的值,造成安全漏洞。
(3)final导致String是线程安全的,不需要额外的进行线程同步操作,进一步提升了性能.无法被其他线程共享并修改
(4) 因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串
/** Cache the hash code for the string */private int hash; // Default to 0
三、运算
1.参数传递
(1)java 的参数是以值传递的形式传入方法中,而不是引用传递。
值传递:指的是在类中定义一个变量,传递到函数中,只是当前值的一个副本,对原来的值没有任何影响
引用传递(其实也是值传递):指的是在函数中传入对象,传递进去的是此对象在堆上的地址 如果在函数中对此变量做另一次new操作 那么剩下的操作对原来的操作没有影响 所作出的更改可以对改变量所指向的对象产生直接影响.
2.参数类型转换
1.java不支持向下类型转换
例如:double不可以向float向下转型
(2)java存在隐式类型转换 short i=1 不可以 但是 short i+=1可以 因为内部优化为(short)(i+1)可以通过编译
3.Switch
java7实现对String的支持 不支持对long的支持 因为switch的设计初衷就是轻量化 尽量是比较小范围值的比较 支持的有:
- 基本数据类型:int,byte,short,char
- 基本数据类型封装类:Integer,Byte,Short,Character
- 枚举类型:Enum(JDK 5+开始支持)
- 字符串类型:String(JDK 7+ 开始支持)