String类
String类的概念和不变性
-
API中的String类的描述,发现String 类代表字符串
-
Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
-
字符串是常量,在创建之后不能更改
-
其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
-
源码分析,String类底层采用的是字符数组:
private final char value[]
private 修饰说明value只能在String类内部使用,而且又没有提供get方法,所以外部无法获取value数组,就无法改变数组中元素的值
final修饰说明value是常量,一旦创建,就不能被改变,value一旦被初始化成某个数组,将永远指向这个数组,不可能再指向其它的数组了* String类特点: * 一切都是对象,字符串事物 "" 也是对象 * 类是描述事物,String类,描述字符串对象的类 * 所有的 "" 都是String类的对象 * 字符串是一个常量,一旦创建,不能改变
public class StringDemo {
public static void main(String[] args) {
//引用变量str执行内存变化
//定义好的字符串对象,不变
String str = "abc";
System.out.println(str);
str = "edf";
System.out.println(str);
}
}
String类创建方式和比较
- 创建对象的数量比较
- String s3 = “abc”;
- 在内存中只有一个对象。这个对象在字符串常量池中
- String s4 = new String(“abc”);
- 在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
- String s3 = “abc”;
public class StringDemo2 {
public static void main(String[] args) {
//字符串定义方式2个, 直接= 使用String类的构造方法
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1);
System.out.println(str2);
System.out.println(str1==str2);//引用数据类型,比较对象的地址 false
System.out.println(str1.equals(str2));//true
}
}
String类重写了父类Object的equals方法,有自己的判别方式
String类构造方法
-
a: 常见构造方法
* public String():空构造
* public String(byte[] bytes):把字节数组转成字符串
* public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
* public String(String original):把字符串常量值转成字符串* 定义方法,String类的构造方法 * String(byte[] bytes) 传递字节数组 * 字节数组转成字符串 * 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 * 平台 : 机器操作系统 * 默认字符集: 操作系统中的默认编码表, 默认编码表GBK * 将字节数组中的每个字节,查询了编码表,得到的结果 * 字节是负数,汉字的字节编码就是负数, 默认编码表 ,一个汉字采用2个字节表示 * * String(byte[] bytes, int offset, int length) 传递字节数组 * 字节数组的一部分转成字符串 * offset 数组的起始的索引 * length 个数,转几个 , 不是结束的索引
public static void function(){
byte[] bytes = {97,98,99,100};
//调用String类的构造方法,传递字节数组
String s = new String(bytes);
System.out.println(s);
byte[] bytes1 ={65,66,67,68,69};
//调用String构造方法,传递数组,传递2个int值
String s1 = new String(bytes1,1,3);
System.out.println(s1);
}
}
String类的内部方法
* int length(): 返回字符串的长度
* String substring(int beginIndex,int endIndex): 获取字符串的一部分
* String substring(int beginIndex): 获取字符串的一部分
* boolean startsWith(String prefix): 判断一个字符串是不是另一个字符串的前缀,开头
* boolean endsWith(String prefix): 判断一个字符串是不是另一个字符串的后缀,结尾
* boolean contains (String s): 判断一个字符串中,是否包含另一个字符串
* int indexOf(char ch): 查找一个字符,在字符串中第一次出现的索引,被查找的字符不存在,返回-1
* byte[] getBytes(): 将字符串转成字节数组,此功能和String构造方法相反,byte数组相关的功能,查询编码表
* char[] toCharArray(): 将字符串转成字符数组,功能和构造方法相反
* boolean equals(Object obj): 方法传递字符串,判断字符串中的字符是否完全相同,如果完全相同返回true
* boolean equalsIgnoreCase(String s): 传递字符串,判断字符串中的字符是否相同,忽略大小写