字串常量池和堆区字符串对象实例
:::
- String底层是 byte[] <—— 已经不是char[]了
- 简单总结一下:直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中;使用new关键字初始化字符串时,是在堆栈区存放变量名和内容;字符串的拼接操作在程序运行时,才在堆中创建对象。一般,可以认为使用”==”比较的是引用,equals比较的是内容。
:::info
- 形参传递的是堆中地址值 ::: ![QQ$}][8WE1OYPARQ[AP617.png
- 题目中的形参str只是原引用ex.str的一个引用副本,传的是一个副本地址值,这个值与ex.str地址值是不一样的,但是它们同时指向了堆中的对象new String(“good”),当你在函数中改变形参也就是地址的副本值也就是这句str=”test ok”只是将副本地址指向常量”test ok”,并没有改变原ex.str的指向方向,它还是指向对象new String(“good”)的 :::info
Java类加载机制 :::
虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化。我们不要去纠结这里的顺序,一般来说我们只需要知道,静态方法一般在最后。
- 类实例创建过程: 父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数。
类实例销毁时候,首先销毁子类部分,再销毁父类部分 :::info
单例模式 ::: 使用场景:应用于全局使用的类,避免频繁创建和销毁带来的开销
单例模式的设计要素
- 私有构造函数(确保只有单例类自己能创建实例)
- 私有静态变量(单例类实例)
- 公有静态函数(公共接口)
构建单例设计方案:
- 懒汉式 2. 饿汉式 3.同步懒汉式 4.双检查锁实现 5.静态内部类 6.枚举 :::info try catch finnaly :::
- 如果finally块中有return语句的话,它将覆盖掉函数中其他return语句。 :::info Servlet Hierarchy ::: :::info 里氏替换原则 见javase :::
:::info Float 和 Double :::
- Double精度高于float
声明float时需要强制转型
float f = (float) 2.0
; 因为默认情况下小数为double类型 :::info .java —> .class字节码文件 ::: ====================点击查看图解================= :::info static方法 :::子类不能override父类的static方法,只能重载
- 子类重载static(注意不是重写)后,Father f = new son(); f.staticMethod()调用的不是子类的静态方法而是父类的静态方法
多态
Collection
List``Queue``Set
都继承了Collection
接口,但它们元素的组织方式各不相同,为了解决这个问题,**Collection**
接口实现了**Iterable**
接口,所以 Collection 体系下的集合都可以通过**Iterable**
的方法获取**Iterator**
迭代器对象,并且每次获取到的都是新的,做到线程隔离。