在java.lang包下,String表字符类型,字符串是常量(保存在常量池),它们的值在创建之后不能更改,但它们可以被共享。
String s1 = "abc"; String s2 = "abc"; // 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
String在jdk8及以前内部使用的就是字符数组,jdk9及以后内部使用的就是字节数组
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
// String底层是靠字符数组实现的。
字符数组和字节数组区别
String.getBytes()是将字符串转化为一个字节数组,而String.toCharArray()是将一个字符串转化为一个字符数组。
【例如】
字节:byte bys[] =“国庆60周年”.getBytes();
字符:char chs[]=“国庆60周年”.toCharArray();
【那么字节数组和字符数组有什么区别呢?】
字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下1个字节等于8位二进制。
字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。
- ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
- UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
- Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
- 符号:英文标点为一个字节,中文标点为两个字节
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bs) | 根据字节数组的内容,来创建字符串对象 |
public String(String original) | 根据传入的字符串内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方式创建字符串对象,内容就是abc |
public boolean equals(Object anObject) :
public boolean equalsIgnoreCase (String anotherString):
public boolean contains(String str) :
public int length () :返回此字符串的长度。
举例:s.length() 获取s中的字符的数量。
public String concat (String str):将指定的字符串连接到该字符串的末尾。
举例:s1.concat(s2) 把s2连接到s1的末尾 等价于 s1 += s2
public char charAt (int index) : 返回指定索引处的 char值。
举例:s1.charAt(5) 获取s1中索引为5的字符。
遍历:
for(int i=0; i<s.length(); i++) { s.charAt(i); // 就是指定索引处的字符值 }
public int indexOf (String str): 返回指定子字符串第一次出现在该字符串内的索引。
举例:s1.indexOf(s2) 查找s2在s1中第一次出现的位置,如果不存在,返回-1。
public String substring (int beginIndex) :
public String substring (int beginIndex, int endIndex) :
public char[] toCharArray ():
public byte[] getBytes ():
public String replace (String oldStr, String newStr) :
public String[] split(String regex):
创建字符串对象两种方式的区别
通过构造方法创建:通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
直接赋值方式创建:以String s3 = "abc";
方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
==和equals区别:
cpublic class FacialObject { public static void main(String[] args) { char[] chs = {'a','b','c'}; String s1 = new String(chs); String s2 = new String(chs); String s3 = "abc"; String s4 = "abc"; //my //正确答案 System.out.println(s1 == s2); //F //F System.out.println(s1 == s3); //T //F System.out.println(s3 == s4); //T //T System.out.println(s1.equals(s2)); //F //T System.out.println(s1.equals(s3)); //F //T System.out.println(s3.equals(s4)); //T //T /* 此处+左右两边都是字符串常量对象, 在编译期间JVM就能计算出结果字符串"Hello World", 而该字符串"Hello World"在常量池空间中已经有了, 不会再重新创建新的字符串处理对象"Hello World"了 */ s5="Helloword"; s6="Hello"+"word"; System.out.println(s5 == s6); //T System.out.println(s5.equals(s6)); //T /* s8是变量,JVM在编译期间无法确定最终的结果的,【如果在s8前添加final关键字,则结果为TT】 简单理解: 在使用+进行字符串拼接时,只要+左右两边出现了字符串变量, 那就相当于new +中有字符串变量进行拼接时,内部使用StringBuilder完成字符串拼接后, 再把StringBuilder通过new String的方法,转换成String对象 */ s7="Helloword"; s8="Hello"; s9=s8+"word"; System.out.println(s7 == s9); //F System.out.println(s7.equals(s9)); //T } }