学习目标
回顾JavaSE
学习内容
1.String str = “i” 和String str = new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。
String str = "i"
的方式JVM会将其分配到常量池
中,
而String str =new String("i")
JVM会将其分配到堆内存
中。
2.Java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:
String
、StringBuffer
、StringBuilder
。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象
,每次操作都会生成新的 String 对象
,再将指针指向新的 String 对象
,
而 StringBuffer 、 StringBuilder 可以在原有对象的基础上进行操作
,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于:
StringBuffer 是线程安全的
,
而 StringBuilder 是非线程安全的,
但StringBuilder 的性能却高于 StringBuffer
,
所以在单线程环境下推荐使用StringBuilder
,
多线程环境下推荐使用 StringBuffer。
3.Java中为什么要用 clone?
在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始值是由 A 对象确定的。
在 Java 语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但clone()方法是其中最简单,也是最高效的手段。
4.深克隆和浅克隆?
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
5.new一个对象的过程和clone一个对象的区别?
new 操作符的本意是分配内存
。程序执行到 new 操作符时,首先去看new 操作符后面的类型
,因为知道了类型,才能知道要分配多大的内存空间。
分配完内存之后
,再调用构造函数
,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。
clone 在第一步是和 new 相似的
,都是分配内存
,调用 clone 方法时,分配的内存和原对象(即调用clone 方法的对象)相同
,然后再使用原对象
中对应的各个域
,填充新对象的域
,填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。