【Java】认识三大类——String类篇

一、认识String类

1、创建字符串

//直接赋值法
String str = "Hello world!";

//通过new来创建字符串对象
String str = new String("Hello world!");

//通过char数组来创建字符串
char[] data = {'h','e','l','l','o'};
String str = new String(data);

注意:"hello world!"称为字符串字面量。字面量:直接写出来的值都被称为字面量。

2、 字符串的内存布局

String是一个引用数据类型,默认值为null。对象在堆上存储,引用在栈上存储。

String str = "hello";
String str1 = str;

3、字符串相等比较(重点)

字符串比较相等的值时使用equals方法,Java中每个类都有equals方法,它是Object自带的方法,所有类都继承Object类。equals的返回值是一个boolean值。

观察一下代码的输出:

int x = 10 ;
int y = 10 ;
System.out.println(x==y); //true
String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1==str); // false

为什么两个字符串内容相同,而使用 == 得到的结果不同呢?来看内存图分析:

可知:== 本身是进行数值比较的,若用于对象比较,则比较的是两个对象所保存的内存地址是否相等,而并没有比较对象的内容。若想要进行内容比较,则必须采用String类提供的equals方法:

 String str1 = "Hello" ;
 String str = new String("Hello") ;
 System.out.println(str1.equals(str));

思考:假设现在str由用户输入。要判断str内容是否为"hello",用哪一种写法更优?
 

//1
Str.equals("hello");

//2
"hello".equals(str);

答:选②。equals方法是通过对象调用的,是成员方法,必须有对象才可以使用。用户输入可能为null,此时①会产生空指针异常。

4、字符串的常量池(高效)

JVM会对字符串创建一常量池。当使用直接赋值创建字符串时,字面量是第一次出现的话,JVM会创建一个字符串对象扔入常量池中。当字面量多次出现使用时,并不会创建新的对象,而是复用已有对象。故使用字符串时,最好使用直接赋值法,避免产生垃圾空间。

5、理解字符串的不可变性(重点)

String str = "hello";
str = "world";

此时只是str的指向发生了变化,指向了新的字符串world,而对于原字符串hello没有影响。由此可见会形成大量的垃圾空间。因此我们应该尽量避免在代码中用循环对字符变量的引用不断赋值。

一下代码可以体现出字符串的不可变性:

import java.util.Arrays;

public class StringCode {
    static String str = "hello";
    static char[] data = {'a','b','c'};

    public static void main(String[] args) {
        change(str,data);
        System.out.println(str);
        System.out.println(Arrays.toString(data));
    }

    private static void change(String str, char[] data) {
        str = "world";
        data[0] = 'g';
    }
}

 

 

 6、StringBulider类

当需要大量修改字符串内容时,我们常用StringBuilder类。

StringBuilder sb = new StringBuilder("hello");
sb.append(" worle");
sb.append("!!!");
String ret = sb.toString();
System.out.println(ret);

StringBuilder具备一些String类不具备的方法(扩展)

reverse();//反转
delete(int start,int end);//删除 左闭右开
insert(int start,char[] c);//插入

7、关于字符串的一些常规操作

方法名称描述
public boolean equals(Object anobject)  区分大小写的比较
public boolean equalsIgnoreCase(String anotherString)不区分大小写的比较
public int compareTo(String anotherString)比较两个字符串大小关系
public boolean contains(CharSequence s) 判断一个子字符串是否存在
public String replaceAll(String regex,String replacement)  替换所有指定内容
public String replaceFirst(String regex,String replacement)  替换首个内容
public String[] split(String regex)将字符串全部拆分
public String[] split(String regex,int limit)将字符串部分拆分,该数组长度就是limit极限
public String substring(int beginIndex)从指定索引截取到结尾
public String substring(int beginIndex,int endIndex) 截取部分内容
public String trim()去掉字符串中的左右空格,保留中间空格
public String toUpperCase()字符串转大写
public String toLowerCase() 字符串转小写

如有疑问欢迎留言~

(来自不会敲代码的卑微贝贝)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值