String的解析——字符串对象不可变

类与对象每篇一题答案

Oper_2.java

public class Oper_2 {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        Cat cat2 = new Cat();
    }
}

Cat.java

public class Cat {
    public String name = "咪咪";
    static String name1 = "咔咔";
    static{
        System.out.println(name1 + "在吃饭");
    }
    {
        System.out.println(name + "在吃饭");
    }
}
咔咔在吃饭
咪咪在吃饭
咪咪在吃饭

这个涉及到两个,一个是static执行多少次,一个是静态代码块和代码块那个先执行的问题;
很明显static代码块只执行一次且是首先执行的;

String方法

在介绍String方法之前,我们要明确一个事情,字符串的对象是不可变的;
而我们在使用地时候将str1 = “hello”轻易的就通过str1 = “Java”将str1改变了呀?
其实这只是改变了str1这个引用变量所指向的地址而已,对象并没有改变;
所以,接下来的方法所改变的并非是字符串对象,有的是改变了引用内容,有的是创建了一个新的对象.
在这里插入图片描述

字符串比较

字符串的比较有两种,一种是比较字符串是否相同,第二种是比较字符串的大小,先来介绍第一种;

比较字符串是否相同
比较两个字符串是否相同有两种比较方法,第一种使用比较操作符“==”,第二种是使用方法“.equals”;
首先我们来介绍操作符的比较方式,“==”所比较的指向对象的引用的内容是否相等,举个例子,如果两个引用指向两个字符串,那么引用中的地址肯定是不相等的,那么字符串肯定也就不相等,但是也有例外,看代码:

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        System.out.println(str1 == str2);
    }
}
true

这里看似str1和str2指向了两个对象,其实二者皆指向了“Hello”这一个的对象而已;在Java中如果两个引用所指的字符串是一样的,那么是不会创建新的对象,只是把新的引用的地址内容变为这个对象的地址而已;
而“.equals”则是比较两个字符串的内容是否一样,如果一样输出true,反之为false;
在使用“.equals”方法时值得注意的一点是,如果是一个字符串和一个字符串变量相比较的时候,尽量将字符串放在前面,因为如果字符串变量是空引用的话时会报错的;

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        System.out.println(str1.equals(str2));
        System.out.println("fuled".equals(str2));
    }
}
true
false

比较字符串大小
比较字符串的大小需要用到方法“.compareTo”,其比较的方法是两个字符串的字符一一比较,如果出现不一样的就结束循环,然后根据比较情况返回相对应的整型值;

  • 第一个字符串小于第二个字符串,则返回小于0的值;
  • 第一个字符串等于第二个字符串,则返回0;
  • 第一个字符串大于第二个字符串,则返回大于0的值;

注意这比较是第一对不相等的字符之间的比较,不用管第一对后不相等的字符的大小比较

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "hello";
        System.out.println(str1.compareTo(str2));
        System.out.println(str1.compareToIgnoreCase(str2));
    }
}
-32
0

上述代码中compareToIgnortCase的作用于conpareTo一样,只是compareToIgnoreCase用于不区分大小写的比较;

字符常量池

常量:与变量相对,“hello”这就是常量(字符串的字面值常量)
池:计算机中的术语,目的就是为了降低开销,提高效率;本质是把频繁使用的东西提前保护好,以备用到的时候随时就能用;Java会把一些常用的字符串存放在字符串常量池中
intern(),就是将一个字符串放进字符串常量池;
调用 intern 方法,就会拿着当前这个字符串里的内容在字符串常量池中找,看当前字符串的内容是否存在于池中;如果存在,直接返回该池中的地址,该语句执行过后,对象并没有引用指向,于是该对象就会被垃圾回收机制给回收掉;如果不存在,则当前字符串的内容加到常量池中,返回池中的地址;

public class StringBlogs {
    public static void main(String[] args) {
        String str = new String("hello").intern();
        System.out.println(str == "hello");
    }
}

字符串查找

contains

contains方法是判断一个字符串中是否包含其他一个字符串,其实就是判断这个字符串中有没有以另一个字符串为原型的子字符串;其返回类型是boolean,即包含则返回true,不包含返回false;

public boolean contains (String s){
}
public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "hello Java";
        String str2 = "Java";
        System.out.println(str1.contains(str2));
        System.out.println(str1.contains("Hello"));
    }
}
true
false

indexOf

idexOf是查找子字符串的位置的方法,以它为标准的查找索引的方法有四种,它是从头开始查找,如果找到了就返回子字符串开头的位置,如果找不到则返回-1;
第二个则是从指定位置开始查找,其方法名与第一个方法一样,只是参数不一样,可以说是第一个的重载方法;
第三个是lastIndexOf,是从末尾位置开始查找;
第四个是lastIndexOf的重载方法,从末尾指定位置开始查找;

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "hello Java";
        String str2 = "Java";
        System.out.println(str1.indexOf(str2)); // 6
        System.out.println(str1.indexOf(str2, 7)); // -1
        System.out.println(str1.lastIndexOf(str2)); // 6
        System.out.println(str1.lastIndexOf(str2, 4)); // -1
    }
}

6
-1
6
-1

startsWith

startsWith方法判断字符串是否以指定的字符串开头,返回类型为boolean,是返回true,不是则返回false;
其同样有一个重载方法,作用为以指定位置开始判断字符串是否以指定字符串开头;

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "hello Java";
        String str2 = "Java";
        System.out.println(str1.startsWith(str2));
        System.out.println(str1.startsWith(str2, 6));
    }
}
false
true

有从头开始判断,自然也有判断是否以指定字符串结尾的方法——endsWith

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "hello Java";
        String str2 = "Java";
        System.out.println(str1.endsWith(str2));
        System.out.println(str2.endsWith(str1));
    }
}
true
false

字符串替换

字符串替换的方法有两个,一个hireplaceAll,还有一个是replaceFirst,前者是替换所有指定的内容,后者是替换第一个所指定的内容;
在此需要注意的是,由于字符串对象是不可改变的,所以替换后的内容其实是创建了一个新的对象,新对象的地址赋值给了原来的引用罢了.

import static java.util.Collections.replaceAll;

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "hello Java";
        String str2 = "Java";
        System.out.println(str1.replaceAll(" ", "|"));
        System.out.println(str2.replaceFirst("a", "k"));
    }
}
hello|Java
Jkva

字符串拆分——split

拆分方法split,是比较常用的String方法之一,它的方法能够将字符串拆分成,以指定的字符为拆分点;
其重载的的方法可以根据拆分符然后根据所指定的int值,将字符串拆分成执行的份数;

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "hello Jav a";
        String str2 = "Java";
        String str3 = "192.168.2.1";
        String[] result = str3.split("\\.");
        for(String s : result){
            System.out.print("[" + s + "]");
            System.out.print(" ");
        }
        System.out.println();
        String[] arr = str1.split(" ", 2);
        for(String s : arr){
            System.out.print("[" + s + "]");
            System.out.print(" ");
        }
    }
}
[192] [168] [2] [1] 
[hello] [Jav a] 

字符串截取

substring是字符串截取方法,那能够根据参数的int值为初始位置来截取字符串,例如参数为5,则是从下标5开始截取到结尾;
当然重载的方法可以指定区间,例如(0,5),那么就是截取0到5这个区间的字符;
需要注意的是截取的区间是前闭后开

public class StringBlogs {
    public static void main(String[] args) {
        String str1 = "hello Jav a";
        String str2 = "Java";
        System.out.println(str1.substring(6));
        System.out.println(str2.substring(1, 3));
    }
}
Jav a
av

SringBuffer和StringBuilder

在开头我们介绍过String对象是不可变的,如果涉及到修改方面的话,String就显得有些力穷,为了解决频繁修改字符串的问题,引入了StringBuffer和StringBuilder,这两个类所创建的字符串对象是可以修改的;
注意:String和二者并没有什么关系,只是二者的方法作用于String的方法作用相差无二罢了.
二者的使用方法差不多,基本上就一个线程安全的差别而已,所以接下来就通过线程安全程度不高的StringBuilder来讲解这两个类;同时介绍几个常见的方法;
append
String中的字符串连接使用的是“+”来完成的,而StringBuilder中的连接则是通过方法append来完成的;
二者没有明显区别,唯一的区别也是本质上的区别:“+”是通过产生新的字符串,然后销毁旧的字符串的方式来拼接的;而append则是在原来字符串对象的基础上添加内容;

import java.lang.StringBuilder;
public class StringBlogs {
    public static void main(String[] args) {
        StringBuilder str1 = new StringBuilder("hello");
        StringBuilder str2 = new StringBuilder("Java");
        System.out.println(str1.append(str2));
        System.out.println(str2.append("offer"));
        for(int i = 0; i < 10; i++){
            str1.append(i);
        }
        System.out.println(str1);
    }
}
helloJava
Javaoffer
helloJava0123456789

reverse——反转字符串
reverse可以将字符串反转

import java.lang.StringBuilder;
public class StringBlogs {
    public static void main(String[] args) {
        StringBuilder str1 = new StringBuilder("hello");
        StringBuilder str2 = new StringBuilder("Java");
        System.out.println(str1.reverse());
        System.out.println(str2.reverse());
    }
}
olleh
avaJ

delete——删除指定范围的数据
delete的范围是前闭后开区间;

import java.lang.StringBuilder;
public class StringBlogs {
    public static void main(String[] args) {
        StringBuilder str1 = new StringBuilder("hello");
        StringBuilder str2 = new StringBuilder("Java");
        System.out.println(str1.delete(1,4));
        System.out.println(str2.delete(0, 1));
    }
}
ho
ava

insert——插入数据

public synchronized StringBuffer insert(int offset, 各种数据类型)

第一个参数offset是数据插入的位置;第二个参数是所要插入的数据,它可以使任何类型的数据.

import java.lang.StringBuilder;
public class StringBlogs {
    public static void main(String[] args) {
        StringBuilder str1 = new StringBuilder("hello");
        StringBuilder str2 = new StringBuilder("Java");
        System.out.println(str1.insert(0,"你好"));
        System.out.println(str1.insert(2, 456));
        System.out.println(str2.insert(str2.length(), ",我会学会你!"));
    }
}
你好hello
你好456hello
Java,我会学会你!

每篇一题

请讲述String,StringBuffer和StringBuilder的区别?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值