==和equals的区别
注意==比较基本类型时不管类型,比如int a = 10 和 float b = 10.0f a==b //true
Java数据类型
Java中主要有八种基本数据类型:
1、整型:byte、short、int、long
2、字符型:char
3、浮点型:float、double
4、布尔型:boolean
String是引用数据类型
1字节:byte、boolean ; 2字节:short char; 4字节:int、float; 8字节:long、double;
注意String不是基本类型变量,它是引用类型变量;小数默认是double类型;整数默认是int类型
float型最后带上f或F long型最后带上l或L
深拷贝和浅拷贝
浅拷贝:浅拷贝会在堆上创建一个新的对象,对于原对象内部的引用类型的属性,拷贝对象会直接复制引用类型属性的引用地址,即拷贝对象和原对象共用一个引用类型的属性,对于基本类型的属性值相同但是不共用。
深拷贝:完全创建一个新的拷贝对象出来,内部属性都是新的不共用
如何实现深拷贝?就是让类内部的引用属性也重写clone方法
创建对象的四种方式
new
clone()方法,也就是对象的浅拷贝深拷贝、
反序列化、
反射的newInstance()方法
String、StringBuilder、StringBuffer
jdk8及之前用char数组存储字符串 jdk9之后,改用byte数组存储字符串 原因是避免内存浪费
String是不可变的字符串;StringBuffer和StringBuilder(线程不安全)都是可变字符串 初始底层长度为16 扩容:2倍+2
String底层用final char[] ; StringBuffer和StringBuilder底层用char[]
String具有不可变性,任何对字符串的修改都会导致重新指定一块内存区域赋新值;字符串常量池中不会存储相同内容的字符串
-
操作少量的数据: 适用
String
-
单线程操作字符串缓冲区下操作大量数据: 适用
StringBuilder
-
多线程操作字符串缓冲区下操作大量数据: 适用
StringBuffer
为什么String是不可变的?
字符串常量池 是 JVM 为了提升性能和减少内存消耗针为字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。