String a = "hello";
String a = new String("hello");
上面两种方法是不一样的 直接赋值的地址是在常量池,new出来的是在堆空间指向常量池
执行效率StringBuilder>StringBuffer>String
StringBuilder和StringBuffer的扩容机制为扩大为原来的2倍加2
StringBuffer是加了同步方法的StringBuilder
单例设计模式
饿汉式
//饿汉式 class Bank{ //1.私有化构造器 private Bank(){ } //2.内部创建类的对象 //要求此对象也必须声明为静态的 private static Bank instance = new Bank(); //3.提供公共的静态方法,返回类的对象 public static Bank getInstance(){ return instance; } }
懒汉式
class Order { //1.私有化类的构造器 private Order() { } //2.声明当前类对象 没有初始化 //4.此对象也必须声明为static private static Order instance = null; //3.声明public、static的返回当前类对象的方法 public static Order getInstance() { if (instance == null) { synchronized (Order.class){ instance = new Order(); return new Order(); } } return instance; } }
懒汉式第一次创建可能有线程安全问题需要加同步锁
枚举类只有一个值时时单例模式
ArrayList jdk1.7时候初始数组空间为10 扩容机制为1.5倍 如果大于1.5倍则按需要添加的全部元素空间为数组容量 例如初始为10 一次加20个 直接扩容到30
ArrayList jdk1.8的时候初始为0 在第一次添加的时候比较添加的元素数量和10的大小,如果超出10则为全部元素的数量
vector是线程安全的Arraylist在jdk1.0时候就有了,扩容机制和Arraylist不一样,每次扩容为2倍,初始为0,一般不使用
LinkedList 底层为双向链表 定义静态内部类的节点类Node
LinkedList的添加过程 第一步拿last 然后把调用Node构造方法(如上)创建Node item为元素 last为赋值给prev 再把容器类的最后一个元素last重新赋值为当前Node 如果last为空则说明为第一个元素,赋值给first,否则就将上一个last的next设置为next,双向链表结构
序列化与反序列化
1.需要实现接口:Serializable 2.当前类提供一个全局常量:serialVersionUID 3.除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性 也必须是可序列化的。(默认情况下,基本数据类型可序列化) 补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量