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)确定生成的父类对象不能强转成子类,但子类可以转成父类对象,然后再判断该类型是否为某一子类

 

posted @ 2024-12-16 11:11  Dyj07  阅读(4)  评论(0编辑  收藏  举报