提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一.String类的简单解释
- 二.String类的方法介绍
- 2.1 字符串的声明
- 2.2 字符串的比较
- 第一种比较方法
- 第二种的比较方式
- 第三种比较方式
- 第四种比较的方式
- 2.3字符串的查找。
- 2.4 字符串的转换
- 数值和字符串转化
- 大小写转换
- 字符串转数组
- 2.5字符串替换
- 2.6 字符串拆分
- 2.7 字符串截取
- 三.字符串的重头戏
- 3.1 字符串的不可变性
- 3.2 StringBuilder和StringBuffer
前言
熬到这儿,我们总算熬出头了,这篇文章就打算带大家认识一下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更安全,大家先这么记着,毕竟还没学习线程。