Java教程

String类

本文主要是介绍String类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、简单介绍

String代表字符串的类,用final修饰,是一个最终类
字符串是常量,它的值在创建之后不能更改,可以共享。

String s = "a"; //字符串a本身没有发生变化
s = "b";  //只是变量s指向的对象变了。

在这里插入图片描述
在这里插入图片描述
如果字符串是直接赋值的,那么它指向的是方法区的常量池中的字符串的地址。
如果是用new的方法创建的对象,会在堆中开辟空间,将该地址值赋给变量,堆中的空间中存的是方法区的常量池的字符串的对象。

public class StringDemo {
	public static void main(String[] args) {
		String s1 = "ab";
		String s2 = new String("ab");
	//JVM会对这句话进行优化,优化完成之后,这句话就已经变成了String s3 = "ab"
		String s3 = "a" + "b";
	//当进行字符串拼接的时候,在底层会调用StringBuilder类的append方法。
String s4 = "a";  //首先指向的是常量池中“a”的地址
		s4 +="b";    
//此处会在堆内new一个匿名的StringBuilder对象,存放的是“a”在常量池中的地址,遇到加b,会调用StringBuilder的append()方法,把b追加到后面,此时就把原来的地址替换成常量池ab的地址,最后调用StringBuilder的toString()方法。此时会在堆内new一个String的对象,存放常量池中“ab”的地址,最后将新创建的String对象的地址赋给变量即可。
		System.out.println(s1== s2);     false
//false,s1中存的是常量池中的地址s2存的是堆中的地址。
		System.out.println(s1 == s3);    true
		System.out.println(s1 == s4);    false
		System.out.println(s2 == s3);    false
		System.out.println(s2 == s4);    false
		System.out.println(s3 == s4);    false
	}
}
String s = "a";
s+="b";  
//相当于 new StringBuild("a").append("a").toString => new String("ab")

String s4 = "a";
s4+="b"; 
//相当于 new StringBuild("a").append("b").toString() => new String("ab")

Java中String的equals的方法被重写过,比较的是常量池中的值是否一样。

StringBuilder是操作字符串的一个类,代表字符串的类是String
StringBuilder是线程不安全的,但是效率比较高
StringBuffer是线程安全的,但是效率比较低

当字符串个数比较多的时候,拼接的时候建议使用StringBuilder;如果个数比较少的话,可以使用+拼接

String[] ss = new String[100];//100个对象
// 向数组中填充了100个字符串

String s = ""; //1个对象
for(String str  : ss){
s += str; // new StringBuilder(s).append(str).toString();//循环创建300对象
}
StringBuilder sb = new StringBuilder(); //1个对象
for(String str : ss){
sb.append(str); //循环中只有1个对象
}
String s = sb.toString();  // 101个对象                                    
当拼接多个字符串的时候,建议使用StringBuilder。

二、构造方法

String() 创建一个空字符串

String s = null;       没有对象,因为没有地址

String s = “”;       一个对象—存储在常量池中以““形式存储。

String s = new String();     堆中存储一个对象,堆中对象的值为null,s指向的是堆中对象的地址。

String s = new String("");       2个对象,堆中一个,常量池中一个

String s = “null”;       一个对象

String s = new String(“null”);     &nbsp2个对象

String s = “a”;       1个对象

String s = new String(“a”);       2个对象

String s = “a”; s += “b”;       5个对象(堆中a对象,常量池中"a" “b” “ab”,以及临时创建出来拼接的StringBuilder对象,最后只会存活4个对象,临时的StringBuild对象会被销毁)

String(byte[] bytes)       通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。当前系统默认的是JBK(当前用的是Windows的汉语版,所以默认的是GBK)

String(byte[] bytes, Charset charset)       通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。

String(byte[] bytes, int offset, int length)       offset-偏移量—从这个数组的指定位置开始,将指定个字符转化为字符串

String(char[] value)       分配一个新的 String,使其表示字符数组参数中当前包含的字符序列

三、重要方法

charAt(int index)      
获取对应下标上的字符

length()      
获取字符串的长度

compareTo(String anotherString)
按字典顺序比较两个字符串。返回int值。
底层执行
     先将对象字符串和参数字符串分别转化为字符数组
     遍历这两个字符数组,对应位置依次相减----(对象-参数)
      如果差不为0,直接返回这两个字符的差,(比如第一个字符不一样,则直接返回第一个字符差值,不会再往后面比较,第一个不为0,就比较第二个,以此论推)。
     如果某个整个数组遍历完成之后,返回值是对象字符串长度减去参数字符串长度。
     如果这个返回值是个负数,说明参数字符串大,如果返回正数,说明对象字符串大。

compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写。

concat(String str)
将参数字符串连接到对象字符串的结尾,返回一个新的字符串,而不改变原串
底层执行
     将两个字符串转化为字符数组
     合并两个字符数组(创建了一个新数组,新数组的长度等于两个数组长度之和)
     将字符数组转化为字符串显示

如果想改变原串的内容,可以进行一次赋值。

endsWith(String suffix)
判断此字符串是否以指定的字符结尾。
主要是用作筛选的工具

startsWith(String prefix)
测试此字符串是否以指定的字符开始。
主要是用作索引

equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写。

toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
底层执行
     先将字符串转化为字符数组
     遍历数组,判断每一位是否是一个大写字母
     如果是一个大写字母,这一位+32,然后再强转为char类型(经过+32的计算,结果已经成了int类型了),再赋给原位置
     将字符数组转化为字符串。

toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
底层执行
     先将字符串转化为字符数组
     遍历数组,判断每一位是否是一个小写字母
     如果是一个大写字母,这一位-32,然后再强转为char类型(经过-32的计算,结果已经成了int类型了),再赋给原位置
     将字符数组转化为字符串。

indexOf(int ch)
获取指定的字符在这个字符串第一次出现的下标
indexOf(int ch, int fromIndex)
从指定的下标开始向后寻找指定元素出现的位置。返回下标值。
lastIndexOf(int ch)
返回指定字符在此字符串中最后一次出现处的索引。
lastIndexOf(int ch, int fromIndex)
从指定的下标处开始向前寻找元素最后一次出现的位置并且返回。

isEmpty()
当且仅当 length() 为 0 时返回 true。

replace(char oldChar, char newChar)
返回一个新的字符串(不会改变原串的内容),它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
如果原串中没有oldChar,则会返回原串,不会有任何改变。

substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。从指定位置开始,一直到字符串结尾。

substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串,从指定位置开始,到指定位置的前一位结束(包头不包尾

toCharArray()
将字符串转化为字符数组

trim()
去掉字符串前后的空白字符。

valueOf(boolean b)将 boolean 参数
表示为字符串形式。
valueOf(char c)将char 参数表示为字符串形式。
valueOf(char[] data)将char 数组参数表示为字符串形式。
valueOf(double d)将double参数表示为字符串形式。
valueOf(float f) 将float参数表示为字符串形式。
valueOf(int i) 将int参数表示为字符串形式。
valueOf(long l)将long参数表示为字符串形式。
valueOf(Object obj) 将Object参数表示为字符串形式。

这篇关于String类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!