一、String
(一)String内存结构
(1)这两行代码,在JVM中创建了几个对象?
public class StringTest01{
public static void main(String [] args){
String s1 = "abcdef";
String s2 ="abcdef"+"xy";
}
}
接下来,我们看内存图。
所以,这两行代码在JVM中创建了3个字符串对象。
接下来我们再来看一个
String s3 = new String("xy");
它的内存结构是什么样的呢?
所以,我们就得出了凡是双引号括起来的都是在字符串常量池中,凡是new出来的都会在堆内存中开辟空间。
所以我们之前学过的
User u1 = new User(123,"张三");
它的张三这个字符串是由堆内存指向了方法区的。
(2)分析一下输出是否相等
packageString;
Public class StringTest01{
public static void main(String[]args){
Strings1="hello";
Strings2="hello";
System.out.println(s1.equals(s2));
}
}
答案是相等的。
我们来看一下它的内存图
我们再来看一下的是否相等?
String s3 = new String("123");
String s4 = new String("123");
System.out.println(s3==s4);
System.out.println(s3.equals(s4));
因为String已经重写了equals方法,所以equals比较的是里面的存储的数据。
然后==对于引用来说,比较的是内存地址。
(二)String的构造方法
(1)String(byte[] bytes)参数可以传入数组,并且解码。
- String(byte[] bytes)
- 通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。
packageString;
public class String Test02{
public static void main(String[]args){
byte[]b1={97,98,99};
String s1 = new String(b1);
System.out.println(s1);
}
}
(2)String在传入数组的时候也可以同数组进行切割。
- String(byte[] bytes, int offset, int length)
- 通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
String s2 = new String(b1,1,2);
System.out.println(s2);
(3)String()也可以传入char类型的数组
- String(char[] value, int offset, int count)
- 分配一个新的 String ,其中包含字符数组参数的子阵列中的字符。
char[]c1={'我','是','中','国','人'};
System.out.println(c1);
String charString= new String(c1);
System.out.println(charString);
String charString2= newString(c1,2,3);
System.out.println(charString2);
(三)String中的方法
(1)"中国人"这个本身就是String类型的所以可以直接调用charAt方法。
- char
- charAt(int index)
- 返回 char指定索引处的值。
packageString;
public class String Test03{
public static void main(String[]args){
char c="中国人".charAt(1);
System.out.println(c);
}
}
(2)
int result="abc".compareTo("abc");
System.out.println(result);
int result2="abcd".compareTo("adce");
System.out.println(result2);
int result3="abce".compareTo("abcd");
System.out.println(result3);
System.out.println("xyz".compareTo("yxz"));
拿着字符串第一个字母和后面字符串的第一个字母比较,能分胜负就不比较了。
(3)判断前面的字符串中是否包含后面的子字符串
- boolean
- contains(CharSequence s)
- 当且仅当此字符串包含指定的char值序列时才返回true。
System.out.println("zhaoxiaodong".contains("zhao"));
System.out.println("langfangshifan".contains("tigaoban"));
(4)判断此字符串是否以指定的后缀结尾。
System.out.println("zhaoxiaodong".endsWith("dong"));
System.out.println("langfangshi.fan".endsWith("fan"));
(5)判断两个字符串是否相等,并且忽略大小写
System.out.println("ABc".equalsIgnoreCase("abC"));
(6)将字符串对象转换成字节数组
- byte[]
- getBytes()
- 使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。
byte [] bytes ="abcdef".getBytes();
for (int i =0;i<bytes.length;i++){
System.out.println(bytes[i]);
}
(7)判断某个子字符串第一次出现的字符串内的索引。
System.out.println("abc".indexOf("a"));
(8) 判断是否为空
String s1 = "a";
System.out.println(s1.isEmpty());
(10)int length()
判断数组长度和判断字符串长度是不一样的。判断数组长度是length属性,判断字符串长度是Length()方法
Ststem.out.println("abc".length());
(11)判断指定字符串最后一次出现的字符串中的索引
- int
- lastIndexOf(String str)
- 返回指定子字符串最后一次出现的字符串中的索引。
System.out.println("abc.java".lastIndexOf("java"));
(12)替换
String的父结构就是CharSequence
- replace(CharSequence target, CharSequence replacement)
- 将与字面目标序列匹配的字符串的每个子字符串替换为指定的字面替换序列。
String newString ="http://www.baidu.com".replace("http","https");
System.out.println(newString);
(13) 拆分字符串
- String[]
- split(String regex)
- 将此字符串分割为给定的 regular expression的匹配。
String[] ymd ="1998-9-3".split("-");
for (int i=0;i<ymd.length;i++){
System.out.println(ymd[i]);
}
(14)判断某个字符串是否以某个子字符串开始
- boolean
- startsWith(String prefix)
- 测试此字符串是否以指定的前缀开头。
System.out.println("abc.java".startsWith("abc"));
(15)截取字符串
System.out.println("http://www.baidu.com".substring(7));
(16)截取指定字符串
System.out.println("http://www.baidu.com".substring(7,10));
包含7但不包含10
(17)将字符串转换为char数组
- char[]
- toCharArray()
- 将此字符串转换为新的字符数组。
char [] chars ="我是中国人".toCharArray();
for(int i=0;i<chars.length;i++){
System.out.println(chars[i]);
}
(18)转换为小写
- toLowerCase()
- 将所有在此字符 String使用默认语言环境的规则,以小写。
System.out.println("ABC".toLowerCase());
(19)转换为大写
- toUpperCase()
- 将所有在此字符 String使用默认语言环境的规则大写。
(20)去除前后空白
(21) 将非字符串转换为字符串
String中只有一个方法是静态的,不需要new对象。将非字符串转换为字符串
String str = String.valueOf(true);
System.out.println(str);
总结:String类在内存结构的时候,在方法区会有一个专用的字符串常量池,并且两个字符串的内容一样,不会再开辟内存空间,他们两个变量指向的内存地址是一样的。