String不变性的理解
1)String类是被final进行修饰的,不能被继承;
2)在用+号连接字符串的时候会创建新的字符串;
3)String s=new String(“helle world”);可能创建两个对象也可能创建一个对象。如果静态区中有“hello world”字符串常量对象的话,则仅仅在堆中创建一个对象。如果静态区没有“hello world”对象,则在堆和静态区中都创建对象。
4)在java中,通过使用“+”符合来链接字符串的时候,实际底层会转成通过StringBuilder实例的append()方法实现。
有重写这些方法。当equals方法被重写,通常有必要重写hashCode方法,才能保证相等。
如:object1.equal(object2)为true, object1.hashCode==object2.hashCode()为true
两个对象内容相等,那么hashCode指向的是同一个内容,返回的哈希值是相同的;
object1.hashCode==object2.hashCode()为false时,object1.equal(object2)为false
两个hashCode不等,那么两个对象的内容必然不同(每个对象的哈希值是唯一的);
object1.hashCode==object2.hashCode()为true时,object1.equal(object2)不一定为true;
比如hashmap,hashCode是数组的下标,但是会产生hash冲突,比如一个数组下标后连接一个链表;
重写equals不重写hashcode会出现什么问题??
在存储散列集合时(如set类),如果原对象.equals(新对象),但没有对hashcode重写,即两个对象拥有不同的hashcode,则在集合中会存储两个值相同的对象,从而导致混淆,因此在重写equals方法时,必须重写hashcode方法。
需要重写equals方法和hashcode,必须保证对象的属性改变时,其hashcode不能改变。
Java序列化定义
将哪些实现Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象,序列化可以弥补不同操作系统之间的差异。
Java序列化的作用
(1)Java远程方法调用(RMI)
(2)对javaBeans进行序列化
如何实现系列化和反序列化
实现序列化
(1)实现Serializable接口
1)该接口只是一个可序列化的标志,并没有包含实际的属性和方法;
2)如果不在该方法中添加readObject()和writeObject()方法,则采取默认的序列化机制,如果添加了这两个方法之后还想利用java默认的序列化机制,则在这两个方法中分别调用defaultReadObject()和defaultWriteObject()两个方法;
3)为了保证安全性,可以使用transient关键字进行修饰不必序列化的属性。因为在反序列化时,private修饰的属性也能查看到。
(2)实现ExternalSerializable方法
自己对要序列化的内容进行控制,控制哪些属性被序列化,哪些不能被序列化;
实现反序列化
(1)实现Serializable接口的对象在反序列化时不需要调用对象所在类的构造方法,完全基于字节;
(2)实现ExternalSerializable接口的方法在反序列化时会调用构造方法;
注意事项
(1)被static修饰的属性不能被序列化;
(2)对象的类名、属性都会被序列化,方法不会被序列化;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-62103-7.html
芝麻糊还有肉末
不吃你这套