Java之线程总结、String类
1、线程的总结
1)栈管运行,堆管存储
2)线程的生命周期
jdk5.0之前
jdk4.0之后 有一个枚举类型来表示生命周期的状态 java.lang.Thread.State
3)
需要考虑非静态的是否唯一,如果不唯一改成静态
4) 饿汉式线程安全,不同线程运行同时读取静态变量地址,而懒汉式存在线程安全问题
面试官问我:饿汉模式,懒汉模式线程安全吗?我用这个直接绝杀!_饿汉模式是线程安全的吗-CSDN博客
5)Java是抢占式的,高优先级抢占低优先级
6)
7)
2、String类
1) 为了GC能够及时回收字符串常量池里不用的数据,后面的版本都将字符串常量池放到了堆中,方法区此时使用本地物理内存。
2)当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,并不是在原有的基础上进行更改,例:s2后面获得的是新的一个string对象,s1还是指向原来的地址;
当对现有的字符串进行拼接时,需要重新开辟空间保存拼接的字符串,不能在原来的位置修改;
对现有字符串中的内容进行替换时,需要重新开辟空间保存修改后的字符串,并不是在原有的位置修改。
String是final修饰的,为常量,不可更改。
3) 当常量池中没有对应的字面量时,使用第二种方法需创建两个对象,分别是堆空间中new的对象以及字符串常量池中生成的字面量。s1和s2的地址值不同,但内容相同
4)常量+常量 :结果放在字符串常量池中,返回此字面量的地址。此时的常量可能是字面量也可能是final修饰的变量
变量+常量 或 变量+变量:都会通过new的方式新建一个String对象返回堆空间中此对象的地址,该String对象指向常量池中的相同内容字符串,如果常量池中没有则新建。
调用字符串的intern():返回字符串常量池中字面量的地址,以上图为例,s2.intern()中value值为0x5566
5)方法中基本数据传数据值 引用数据传地址值
字符串具有不可变性,当在方法中给字符串变量重新赋值时,会使得方法中的字符变量重新指向新常量的地址,全局变量仍指向原地址不变。
方法中的str是一个新的局部变量
6)bufferReplace里第二行text已经指向了一个新的对象,此时在方法中操作不影响全局地址
String和StringBuffer的详解,联系和区别_stringbuffer和string-CSDN博客
7)根据底层逻辑
8)确定生成的父类对象不能强转成子类,但子类可以转成父类对象,然后再判断该类型是否为某一子类