数据类型包装类,String,对象的复制
来源:互联网 发布:wp部署软件 编辑:程序博客网 时间:2024/06/08 00:04
StringBuffer与StringBuilder原理与区别
包装类都是不可变类(不只是String),实际可变是因为改变后不再是原来的对象,而是新建的一个符合预期的对象
Obejct类有一个getClass()方法:返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。public class Art {Art() {System.out.println("Art");System.out.println(getClass().getName());}}public class Drawing extends Art {Drawing() {System.out.println("Drawing");System.out.println(getClass().getName());}}public class Cartoon extends Drawing{Cartoon(){System.out.println("Cartoon");System.out.println(getClass().getName());}public static void main(String[] args) {Cartoon x = new Cartoon();Drawing one = (Drawing)x;Art two = (Art)x;if(one == two){System.out.println("==");}else {System.out.println("!=");}System.out.println(x.toString());System.out.println(one.toString());System.out.println(two.toString());}}//输出Artcom.cignacmc.knowledge.inheritance.CartoonDrawingcom.cignacmc.knowledge.inheritance.CartoonCartooncom.cignacmc.knowledge.inheritance.Cartoon==com.cignacmc.knowledge.inheritance.Cartoon@182f0dbcom.cignacmc.knowledge.inheritance.Cartoon@182f0dbcom.cignacmc.knowledge.inheritance.Cartoon@182f0db结论:当调用getClass()时,返回这个对象<span style="color:#ff0000;">真实的</span>Class对象。从3个继承对象相等的情况和输出可知,这三个对象有相同的this指针,即内存地址一致。而getClass()返回的就是this指针所代表的最真实的Class的对象,也即最上层的子类。
与toString不同的是,getClass()返回的是class对象,从而可以使用这个对象的方法知道更多该对象的信息。
//实现对象的复制方法class A implements Cloneable{protected Object clone() throws CloneNotSupportedException {return super.clone();}int a;}public class Nntknow {public static void main(String[] args) throws CloneNotSupportedException {A a=new A();a.a=3;A b=(A)a.clone();System.out.println(b.a);}}
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
所以除非在自己的类内重写equals方法或在使用String等数据类型包装类时,equals跟==差不多没什么用。
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例
主数据类型包装类Integer,Short等等提供很多与String互相转换的函数。
主数据类型包装类一个很重要的意义是很多容器只能接受类,而不能接受主数据类型,包装类提供了数据到类的转变(虽然好像java5.0之后能自动包装)
public type typeValue()
Integer类
static int
parseInt(String s)
将字符串参数作为有符号的十进制整数进行解析。将字符串转换为数字
static String
toString(int i)
返回一个表示指定整数的
String
对象。将数字转换为字符串Character类:
好像没什么有用的函数。
String类:
String s3 = new String("abc"); //↑ 创建了两个对象,一个存放在字符串池中,一个存在与堆区中; //↑ 还有一个对象引用s3存放在栈中
String s1 = "abc"; //↑ 在字符串池创建了一个对象 String s2 = "abc"; //↑ 字符串pool已经存在对象“abc”(共享),所以创建0个对象,累计创建一个对象
局部变量str2,str3存储的是存储两个拘留字符串对象(intern字符串对象)的地址。 * * 第三行代码原理(str2+str3): * 运行期JVM首先会在堆中创建一个StringBuilder类, * 同时用str2指向的拘留字符串对象完成初始化, * 然后调用append方法完成对str3所指向的拘留字符串的合并, * 接着调用StringBuilder的toString()方法在堆中创建一个String对象, * 最后将刚生成的String对象的堆地址存放在局部变量str3中。 * * 而str5存储的是字符串池中"abcd"所对应的拘留字符串对象的地址。 * str4与str5地址当然不一样了。 * * 内存中实际上有五个字符串对象: * 三个拘留字符串对象、一个String对象和一个StringBuilder对象。 */ String str2 = "ab"; //1个对象 String str3 = "cd"; //1个对象 String str4 = str2+str3; String str5 = "abcd"; System.out.println("str4 = str5 : " + (str4==str5)); // false
相同点:只要是String,其内部就是不能改变的,如改变字符串中某个字符(虽然有这个函数replace,但它是改变后新创建一个对象返回。原对象还是不能改变),要操作内部,就使用char数组。
不同点:
我们知道使用StringBuffer等无非就是为了提高java中字符串连接的效率,因为直接使用+进行字符串连接的话,jvm会创建多个String对象,因此造成一定的开销,(String用StringBuilder进行字符串连接,具体连接过程如上代码)。由于Stringbuffer用append函数进行字符串连接,而String用‘+'号进行连接,可以简单记为append连接后并没有新创建对象,’+'则有。
StringBuffer线程安全,而Stringbuilder线程不安全
- 数据类型包装类,String,对象的复制
- Java面向对象 String 基本数据类型对象包装类
- String类,StringBuffer类,基本数据类型对象包装类总结
- 黑马程序员 --- String类 StringBuffer 基本数据类型对象包装类
- java基础-API-String类、基本数据类型对象包装类
- Java基础——String+基本数据类型对象包装类
- java基础-String、基本数据类型对象包装类
- 6.3 基本数据类型的对象包装类
- 基本数据类型的面向对象----包装类
- 黑马程序员—Java的String类以及Java基本数据类型对象包装类
- Java的String类以及Java基本数据类型对象包装类
- 基本数据类型的包装对象
- 基本数据类型对象包装类
- 基本数据类型对象包装类
- 基本数据类型对象包装类
- 基本数据类型对象包装类
- 基本数据类型对象包装类
- 基本数据类型对象包装类
- 初识AngularJS
- 18-Python网络编程
- ./configure详解
- JAVA学习笔记整理一(基础知识)
- 欢迎使用CSDN-markdown编辑器
- 数据类型包装类,String,对象的复制
- 高效使用xcode
- android开发第一次心的
- Android开发60条技术经验总结
- leetcode(10),Roman to Integer(python)
- Viewpager+Fragment 实现滑动切换显示内容
- Toy Army
- 微软MAC地址数据库惊爆安全门
- linux kernel的中断子系统之(八):softirq