Why transient

Arralist是动态数组,扩容的时候会自动增长设定的长度值,如果自动增长的值是100,而实际只放了一个元素,那就会序列化其余的99个null元素,为了保证在序列化的时候不会将这么多null同时进行序列化,Arralist把元素数组设置为transient。

transient Object[] elementData

为了防止一个包含大量空对象的数组被序列化,为了优化存储,所以Arralist使用transient来声明elementData

Java提供了基本数据类型,这种数据的变量不需要使用new创建,他们不会在堆上创建,而是直接在栈内存中存储,因此会更加高效。

Java是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无法将int 、double等类型放进去的。因为集合的容器要求元素是Object类型。为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

自动装箱都是通过包装类的valueOf()方法来实现的.自动拆箱都是通过包装类对象的xxxValue()来实现的。

Integer integer=Integer.valueOf(1); 
int i=integer.intValue();

我们可以得出结论,当我们把基本数据类型放入集合类中的时候,会进行自动装箱。

Java中的String有没有长度限制?

在Java中,所有需要保存在常量池中的数据,长度最大不能超过65535,这当然也包括字符串的定义咯。(这种String长度的限制是编译期的限制,也就是使用String s= “”;这种字面值方式定义的时候才会有的限制),String在运行期有没有限制呢,答案是有的,就是我们前文提到的那个Integer.MAX_VALUE ,这个值约等于4G,在运行期,如果String的长度超过这个范围,就可能会抛出异常。

public String(char value[], int offset, int count)

参考文章:

在Java中,==比较的是对象应用,而equals比较的是值

如果一个类想被序列化,需要实现Serializable接口。否则将抛出NotSerializableException异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种。

      if (obj instanceof String) {
            writeString((String) obj, unshared);
        } else if (cl.isArray()) {
            writeArray(obj, desc, unshared);
        } else if (obj instanceof Enum) {
            writeEnum((Enum<?>) obj, desc, unshared);
        } else if (obj instanceof Serializable) {
            writeOrdinaryObject(obj, desc, unshared);
        } else {
            if (extendedDebugInfo) {
                throw new NotSerializableException(
                    cl.getName() + "\n" + debugInfoStack.toString());
            } else {
                throw new NotSerializableException(cl.getName());
            }
        }          

在类中增加writeObject 和 readObject 方法可以实现自定义序列化策略。


使用序列化与反序列化也同样会破坏单例:


挑战10个最难回答的Java问题

1,为什么等待和通知是在 Object 类而不是 Thread 中声明的?

  • wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。

  • 每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。

  • 在Java中,所有对象都有一个监视器,我们可以指定监视器(这是我们称之为等待的对象)

2,为什么Java中不支持多重继承?

  • 第一个原因是围绕钻石形继承问题产生的歧义(编译器将无法决定它应该调用哪个 foo()。这也称为 Diamond 问题,因为这个继承方案的结构类似于菱形)

  • 多重继承确实使设计复杂化并在转换、构造函数链接等过程中产生问题(Java 可以通过使用接口支持单继承来避免这种歧义)

results matching ""

    No results matching ""