String类介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

熬到这儿,我们总算熬出头了,这篇文章就打算带大家认识一下java中的String的字符串。以及它有的一些操作。因为我们字符串的应用十分广泛,因此java专门提供了,这个String类。我们接下来就会针对这个类进行说明。


一.String类的简单解释

如大家所想,一个类嘛,归根究底就是会有构造方法和具体方法的,让我们看看String这个类会有些什么不一样的东西呢?
我们先来看看String类的构造方法,是不是大概能看懂,大概能懂就行,不需要全懂。
在这里插入图片描述

再来看看String类下的具体方法,你看看这么方法,全部都供你使用,别急,这些方法全都是你的,都不会跑,哈哈,也别烦恼,你用的多了,就自然而然就对这个些方法熟练了。
在这里插入图片描述
说完了一个类的方法,我们就要看看,我们一个类的属性了。
在这里插入图片描述
根据上面的这个String类的属性来说,我们大概就知道,我们一个字符串大概由俩部分组成的,一个是char 类型的数组和hash 的这个值,咱们就是说,我们先不用不知道这个东西是什么,只需要知道String内部的构造就是这样的,你如果不信的话,我们可以用程序去看一下,一个String类的内部究竟存储了什么。

String s1="HelloWorld";
在这里插入图片描述

看完以上这些,你大概对String的类,有了大概的印象,我们下面就对字符串的一些方法做一些详细的解释。


二.String类的方法介绍

这个阶段,我会针对字符串一些常用的操作,去介绍,但并不完全完整,这点需要我们共同去学习和熟练的掌握,要是小伙伴们。发现了一些新的方法,一定要告诉我哦。


2.1 字符串的声明

这主要是去使用一个字符串,这里介绍三种,当然主要的也就这三种。

 public static void main(String[] args){
	//第一种,直接去声明
	String s1="helloworld";
	//第二种,声明一个对象
	String s2=new String("helloworld");
	//第三种,根据字符数组,生成字符串
	char[] array = {'h','e','l','l','o','w','o','r','l','d'};
	String s3=new String(array);
}

2.2 字符串的比较

这可是字符串拿手好戏,毕竟字符串比较的话,我们也经常使用字符串比较的方法,我这里注意介绍

第一种比较方法

我们不采取字符串常量去用 == 等号
我们直接使用 == 比较,代码如下:

    public static void main(String[] args) {
        
        String s3=new String("helloworld");
        String s4 =new String("helloworld");
        System.out.println(s3==s4);
    }

这里的运行结果是FALSE,简单来说来说,比较的类型是引用类型变量,我们直接用等号进行比较,比较的是指向的对象,俩个不同的对象,当然就是不相同的。

在这里插入图片描述

第二种的比较方式

   public static void main(String[] args) {
        String s1="helloworld";
        String s2="helloworld";
        String s3=new String("helloworld");
        String s4 =new String("helloworld");
        System.out.println(s3.equals(s4));

    }

这里我们调用了string类的equals方法,我们比较的其实是字符串内容是否相等,显然s3和s4的字符串内容是相等的。下面再给大家看一下,equals方法的内容,你看了之后,就知道里面的内容是怎么比较的了。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

第三种比较方式

前面两种都是在比较相不相等,我们接下来介绍的这种,单纯比较字符串的大小
conpareTo方法,代码如下:

    public static void main(String[] args) {
        String s1="hello";
        String s2="helloworld";
        System.out.println(s1.compareTo(s2));
        //打印出来是一个负数。

    }
}

下面是compareTo的具体方法,让我们看看是怎么进行比较的,具体的比较规则,就是拿出来一个一个的进行比较,不相等返回一个负数,相等返回一个0

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

第四种比较的方式

这种方式跟第三种一样,就是比较字符串的大小,但是这种方法不会区分大小写,看看那个比较大。

public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ac");
String s3 = new String("ABc");
String s4 = new String("abcdef");
System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}

2.3字符串的查找。

我列举一下这些方法,关于字符串查找的方法哈

方法功能
char charAt(int index)返回index位置上字符,如果index为负数或者越IndexOutOfBoundsException异常
int indexOf(int ch)返回ch第一次出现的位置,没有返回-1
int indexOf(int ch, intfromIndex)从fromIndex位置开始找ch第一次出现的位置,没有返回-1
int indexOf(String str)返回str第一次出现的位置,没有返回-1
int indexOf(String str, intfromIndex)从fromIndex位置开始找str第一次出现的位置,没有返回-1
int lastIndexOf(int ch)从后往前找,返回ch第一次出现的位置,没有返回-1
int lastIndexOf(int ch, intfromIndex)从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1
int lastIndexOf(String str)从后往前找,返回str第一次出现的位置,没有返回-1
int lastIndexOf(String str, intfromIndex)从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1
public static void main(String[] args) {
String s = "aaabbbcccaaabbbccc";
System.out.println(s.charAt(3)); // 'b'
System.out.println(s.indexOf('c')); // 6
System.out.println(s.indexOf('c', 10)); // 15
System.out.println(s.indexOf("bbb")); // 3
System.out.println(s.indexOf("bbb", 10)); // 12
System.out.println(s.lastIndexOf('c')); // 17
System.out.println(s.lastIndexOf('c', 10)); // 8
System.out.println(s.lastIndexOf("bbb")); // 12
System.out.println(s.lastIndexOf("bbb", 10)); // 3
}

2.4 字符串的转换

数值和字符串转化

public static void main(String[] args) {
// 数字转字符串
String s1 = String.valueOf(1234);
String s2 = String.valueOf(12.34);
String s3 = String.valueOf(true);
String s4 = String.valueOf(new Student("Hanmeimei", 18));
System.out.println(s1);
System.out.println(s2);
//字符串转数字
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
System.out.println(data1);
System.out.println(data2);

大小写转换

public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());
}

字符串转数组

public static void main(String[] args) {
String s = "hello";
// 字符串转数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
// 数组转字符串
String s2 = new String(ch);
System.out.println(s2);
}

2.5字符串替换

方法内容
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换首个内容
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));

2.6 字符串拆分

方法内容
String[] split(String regex)将字符串全部拆分
String[] split(String regex, int limit)将字符串以指定的格式,拆分为limit组

代码示例: 实现字符串的拆分处理

String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}

代码示例: 字符串的部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}

2.7 字符串截取

方法内容
String substring(int beginIndex从指定索引截取到结尾
String substring(int beginIndex, int endIndex)截取部分内容
代码示例
String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));

三.字符串的重头戏

3.1 字符串的不可变性

这里要说的第一个重点,就是字符串的不可变性,字符串是不可修改的,我们针对String类的所有操作,都会返回一个新的字符串类。为什么这么说呢?你看我下面代码执行所产生的结果。
在这里插入图片描述
这里就直接说明了,在对字符串进行修改的时候,我们最终会返回一个新的对象。


我们在探讨字符串的不可变性之后,我们来思考为什么不可变,当然还是挺简单的,看一下string体的属性你就知道了
在这里插入图片描述
看到私有属性了吗,但仔细去类体里面去寻找,发现并没有提供value的set和get方法,就导致了,外部根本就无法访问,所以说这才是String类的不可变的原因。大家可要记好了。


3.2 StringBuilder和StringBuffer

当然了这里纯属是字符串的小插曲,由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。

当然String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。

StringBuffer的话,目前来说,是比StringBuilder更安全,大家先这么记着,毕竟还没学习线程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘忧记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值