java---String类

String类:

首先说明:
== 判断的事前后两个变量的地址是否一样
String中的equals()方法是判断其内容是否一样
静态变量池是一段静态的集合(数组),存储的是静态常量,这个是String私有的。
堆区是

通过例子来学:

String b="abc";
String a="abc";
System.out.println(a.equals(b));//true
System.out.println(a==b);//true

a和b能全部为true的原因是,String类中存在一静态变量池(因为String 这个类使用颇多)。
如果通过
String s=”abc”
s这个值(abc)就会被存储在静态变量池中,并不会再去创建临时对象。如果后面还有通过Sting直接创建值也为(abc)的对象s1时既( String s1=”abc”),静态变量池会直接把s的地址直接赋值给s1,定不会创立新的临时变量。

String c=new String("abc");
String d=new String("abc");
System.out.println(d==c);//false
System.out.println(c.equals(d));//true

当程序为
String s=new String(“abc”);
1、这个时候一定会创建一个新的对象,内部存储的是abc。
2、这种方式还会在自己内部维护的常量池中也存储一份abc。
3.通过new方法创建的s,是在堆区中开辟了自己的新空间。

String b="abc";
String c=new String("abc");
System.out.println(b==c);//false
System.out.println(c.equals(b));//true

首先通过String b=“abc”;先在静态变量池中存储abc字符串,在通过new的方法创建String对象c

综上所述:

i.当使用的方式是 String s=“abc”; 直接赋值 没有使用 new 关键字,
既:String b="abc";String a="abc";
1.假如静态变量池中没有abc时,先在静态变量池中建立字符串abc,然后s指向静态变量池中的abc的位置。
2.假如静态变量池中有abc时,就直接把s指向静态变量池中的abc的位置。
3.在静态常量池中 堆区中是不存在的

ii.如果都是通过new来创建的对象,值为abc
String c=new String("abc");String d=new String("abc");
那么这两个各自都会在堆区中开辟新的空间,所以地址肯定是不同的,在c创建时,因为静态变量池中没有abc,所以先在静态变量中存储一份abc,再在堆区中开辟自己的空间。

iii.如果一个通过new,一个不通过new创建
String b="abc";String c=new String("abc");
如上,先在静态变量池中存储abc,再在堆区中开辟空间。
(因为new的效率一定低于静态常量池)

判断:

new String(“abc”); 创建了几个对象?? (提示,现在是 new 的是 String 类对象)
答:1个或2个
1个是因为静态变量池中已经存在abc,只用在堆区中创建即可。
2个是因为静态变量池中没有abc,先在静态变量池中存储一份,然后再在兑取中开辟空间。

存在一个函数s1.intern(),可以返回回当前对象在静态常量池中的对象
既 s==s1.intern()为true


(补充):
如何获取字符串中的每个字符

 String a="hello wrold";
        for (int i = 0; i <a.length() ; i++) {
            System.out.println(a.substring(i,i+1));
        }

如何调取指定位置字符

		System.out.println(a.indexOf("l"));//获得字符串中第一个l的位置
        System.out.println(a.lastIndexOf("l"));//获得字符串中倒数第一个l的位置
        System.out.println(a.startsWith("hello "));//判断是否由括号内的字符或字符串开头
        System.out.println(a.endsWith("ld"));//判断是否由括号内的字符或字符串结尾
        System.out.println(b.trim());//去掉首位的特使字符
        System.out.println(b.isEmpty());//判断是否为空
        String c=a.replace("l","w");//替换a中字符串中的指定字符变换为指定字符,返回一个新的字符串

拼接字符串

		String[] names={"bob","coc","dod"};
        String s=String.join(",",names);
        System.out.println(s);//bob,coc,dod
        ```

---
## StringBuffer 和 StringBuilder:
String 类是不可变的:String 类的对象一旦存储了字符串 那么就不能修改其内部存储的字符串
 如果修改了,那么会创建一个新的对象 让原来的指针指向新的对象(原来的对象就成为垃圾对象)
String 类的效率是比较低的 一旦操作就产生新的对象 造成大量的垃圾对象
基于 String 类的不变性,那么 Java 中又提供了两个类
StringBuffer 和 StringBuilder
StringBuffer 和 StringBuilder 都是可变的,可变的是说当前这两个类的对象的内容发生改变了,那
么不会产生新的对象,是在原来的对象的内容上操作;

StringBuffer:
StringBuffer 是一个可变的字符串的类,内容改变不会产生新的对象,是在原始的对象上操作;


## String 和 StringBuffer 以及 StringBuilder 的区别:

String 是不可变的字符串,一旦改变内容会产生新的对象;
StringBuffer 和 StringBuilder 都是可变的字符串,一旦改变内容不会产生新的对象,是原始对象上操作内容;

## StringBuffer 和 StringBuilder 的区别:

StringBuffer 是线程安全的;StringBuilder 是线程不安全的;
在**多线程**的情况下,尽量使用StringBuffer,
再没有多线程的情况下,尽量采用 StringBuilder;
StringBuffer 和 StringBuilder 提供的方法几乎一致,唯一区别就是线程安全的问题;
如果一个字符串频繁的需要修改那么尽量使用 StringBuilder 或者 StringBuffer;

```java
		StringBuffer s=new StringBuffer("abc");
        s.append("efg");
        System.out.println(s);//abcefg
        s.delete(3,5);
        System.out.println(s);//abcg
        s.insert(3,"666");
        System.out.println(s);//abc666g

		StringBuilder b=new StringBuilder("abc");
        b.append("456");
        b.insert(3,"666");
        b.delete(3,4);
        
		StringBuilder sb=new StringBuilder();
        sb.append("i").append("bob").append("!").insert(1,"'m");
        System.out.println(sb);

append() 在尾部添加
insert()插入
delete() 删除

拼接字符串:

        String[] names={"bob","coc","dod"};
        StringBuilder sb=new StringBuilder();
        sb.append("hello");
        for (String name:names) {
            sb.append(name).append(",");
        }
        sb.delete(sb.length()-1,sb.length());
        sb.append("!");
        System.out.println(sb.toString());

在拼接字符串时,java中还有一个类叫StringJoiner

		String[] names={"bob","coc","dod"};
		StringJoiner sj=new StringJoiner(",");
        for (String name:names) {
            sj.add(name);
        }
        System.out.println(sj.toString());//bob,coc,dod
        
		StringJoiner sj=new StringJoiner(",","hello ","!");
        for (String name:names) {
            sj.add(name);
        }
        System.out.println(sj.toString());//hello bob,coc,dod!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值