String类

1.堆内存

凡是new出来的对象都存在堆内存(数组和封装类)

2.栈内存

存放方法和局部变量(方法内部声明的变量),其实也可以理解所有变量声明都在栈里面,最后用了一个指针去指向堆内存的地址。

3. String类

  1. String中存储的都是常量,当遇到+号后,需要用到StringBuilder。
    在这里插入图片描述
    2.StringBuilder是线程不安全的,但速度快。StringBuffer是线程安全的,速度没有StringBuilder快。
    3.常量优化机制(?)

举例分析:堆,栈,以及String的概念

public class StringTest {
    public static void main(String[] args) {
        String s2=new String("abc");
    }
}
  1. 主函数main进栈内存,里面声明了一个s1的变量(变量在主函数里,自然也就在栈内存里面)。

  2. 这个时候我们调用了new String(),在堆内存开辟出一个空间。"abc"会在字符串常量池创建一个对象。

  3. 开辟的堆内存会拷贝字符串常量池中"abc"的副本。俩者不在同一个内存地址上。
    在这里插入图片描述

  4. 栈内存的s2然后指向堆内存开辟的空间。
    在这里插入图片描述

4.例题

在这里插入图片描述

  • 直接看函数change,传了两个形参。
    其实可以等价于String str=ex.str 和 char ch[]=ex.ch;
  • 第一句str=“test ok”,这一句其实就是在字符串常量池里面新建了一个"test ok"。str指向字符串常量池。而ex.str仍指向堆内存。所有str指向的地方改变跟ex.str没有关系。
  • 第二句,char ch[]指向,ex.ch已经在堆内存开辟好的地址。所以ch改变,ex.ch也改变。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值