• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

java常用类--String类

java常用类--String类

1、String类的字符串在内存中的存储情况

1、String类在堆中的永久带存储着,也就是说GC垃圾回收机制不会主动去回收
2、如果采用String s = "某个字符串",这样的方式创建字符串,系统会主动从内存中找有没有这个字符串对象,如果有,则吧该字符串地址赋值给s,如果没有就新开辟一块空间,然后把地址给s

然后我们来看一段代码

public class Test {
    public static void main(String[] args) {
        String s1 = "aaa";
        String s2 = "aaa";
        System.out.println(s1 == s2);
	}
}
/**
* 输出的结果为true,说明s1和s2地址一样
*/

我们再看一段代码

public class Test {
    public static void main(String[] args) {
        String s1 = "aaa";
        String s2 = new String("aaa")
        System.out.println(s1 == s2);
	}
}
/**
* 输出的结果为false,说明s1和s2地址不一样
*/
结论:
	如果用String s1 = "aaa",这种方式创建的字符串,会自动找内存中已存在的字符串。
	如果用new 对象的形式,那么就会直接在内存中新创建地址。

2、String字符串拼接内存分析

首先,我们来看一段代码

public class Test {
    public static void main(String[] args) {
        String s1 = "s1";
        String s2 = "s2";
        String s3 = "s3";
        String s4 = s1 + s2 + s3;
	}
}

如果采用+的方式,内存分析:

1、栈中创建变量s1,并在堆的永久带中开辟空间,然后把字符串地址给s1
2、同理s2,s3创建变量,并获得字符串地址
3、创建s4变量,然后s4先初始值为null,等待s1+s2+s3结果
4、首先s1+s2在永久带中创建一个新的字符串,把他们的结果拼接一起
5、再继续把s1+s2的值和s3的值拼接一起,并在堆中继续开辟一块空间。

这样创建太浪费内存了,所有有更好的解决办法

public class Test {
    public static void main(String[] args) {
        String s1 = "s1";
        String s2 = "s2";
        String s3 = "s3";
        //这样可以更好的节省空间
        StringBuffer b = new StringBuffer();
        b.append(s1);
        b.append(s2);
        b.append(s3);
	}
}

3、String类的常用方法

返回值类型 方法 描述
char charAt(int index) 返回指定索引处的 char值。
int length() 返回字符串的长度
String[] split(String s) 将字符串按s这样值进行分割,然后返回一个字符串数组
String replace(String target,String replace) 将目标的字符串替换成套替换的字符串

posted on 2021-03-16 13:46  黄文超  阅读(73)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3