String字符串
概述
**java.lang.String类代表字符串。
API当中说:Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。
其实就是说:程序当中所有的双引号字符串,都是String类的对象。(就算没有new,也照样是。)**
String类的特点
对String在内存存储方面的理解:
**1.字符串一旦创建内容永不可变,每当你觉得字符串变了的时候,必然就是创建了新的字符串 。【重点】
2.正因为字符串不可改变,所以字符串是可以共享使用的。
3.字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。
4.双引号括起来的字符串存储在字符串常量池中。
5.字符串的比较必须使用equals方法。
6.String已经重写了toString()和equals()方法。**
String字符串常量池
在JDK当中双引号括起来的字符串,例如:"abc","def",都是直接存储在“方法区”的“字符串常量池”当中的。为什么SUM公司把字符串存储在一个“字符串常量池”当中呢?因为字符串在实际开发中使用太频繁,为了执行效率,所以把字符串放到了方法区的字符串常量池当中。
**对于基本类型来说,==是进行数值的比较。
对于引用类型来说,==是进行【地址值】的比较。**
// i变量中保存的是100这个值
int i = 100;
//s变量中保存的是字符串对象的内存地址。
//s引用中保存的不是"abc",而是指向"abc"这个数据的内存地址
String s = "abc";
//分析以下两行代码,一共创建了几个对象。
String s1 = new String("hello");
String s2 = new String("hello");
//一共3个对象:方法区字符串常量池中有一个"hello",堆内存当中两个String对象。
String字符串的构造方法
String s = " " ;
String s = new String(" ");
String s = new String(byte数组);
String s = new String(byte数组,起始下标,长度);
String s = new String(char数组);
String s = new String(char数组,起始下标,长度);
举例:
public static void main(String[] args) {
//创建字符串对象最常用的一种方式
String s1 = "hello world!";
//s1这个变量中保存的是一个内存地址。//按说以下应该输出一个地址。
//但是输出一个字符串,说明string类已经重写了toString()方法。
System.out.println(s1); //helloworld!
System.out.println(s1.toString());//hello world!
//这里只常据常用的构造方法。
byte[] bytes = {97,98,99};//97是a,98是b,99是c
String s2 = new String(bytes);
//输出一个引用的时候,会自动调用toString()方法,默认Obiect的话,会自动输出对象的内存地址
//通过输出结果我们得出一个结论:String类已经重写了toString()方法。
// 输出字符串对象的话,输出的不是对象的内存地址,而是字符串本身。
System.out.println(s2.toString());//abc
System.out.println(s2);//abc
//String(字节数组,数组元素下标的起始位量,长度)
// byte数组中的一部分转换成字符串。
String s3 = new String(bytes,1,2);
System.out.println(s3);//bc
//char数组全部转换成宇符串
char[] chars ={'你','好','呀','朋','友'};
String s4 = new String(chars);
System.out.println(s4); // 你好呀朋友
//将char数组的一部分转换成字符串
String s5=new String(chars,2,3);
System.out.println(s5); // 呀朋友
}
String字符串的23个常用方法
public static void main(String[] args) {
//1. char charAt(int index)
//获取指定索引位置的单个字符串
char c = "你好".charAt(1); // "你好"是一个字符串String对象,所以可以直接调用String类的方法。
System.out.println(c); // 输出:好
//2. int compareTo(String anotherString)
//字符串之间比较大小不能直接使用><,需要使用compareTo方法。
int result ="abc".compareTo("abc");
System.out.println(result);// 输出:0 解释:(等于0)代表前后一致 10-10=0
int result2="abcd".compareTo("abce");
System.out.println(result2);//输出:-1 解释:(小于0)前小后大 8-9=-1
int result3="abce".compareTo("abcd");
System.out.println(result3);//输出:1 解释:(大于0)前大后小 9-8=1
//拿着字符串第一个字母和后面字符串的第一个字母比较。能分胜负就不再比较了。
System.out.println("xyz".compareTo("yxz"));//输出:-1
//3. boolean contains(CharSequence s)
// 判断前面的宇符串中是否包含后面的子字符串。
System.out.println("HelloWorld.java".contains("java")); //输出:true
System.out.println("http://www.baidu.com".contains("https://")); //输出:false
//4. boolean endsWith(String suffix)
// 判断当前字符串是否以某个字符串结尾。
System.out.println("test.txt".endsWith(".java"));// 输出:false
System.out.println("test.txt".endsWith(".txt")); // 输出: true
System.out.println("fdsajklfhdkjlsahfjkdsahjklfdss".endsWith("ss")); //输出: true
//5. boolean equals(Object anObject)
//比较两个字符串必须使用equals方法,不能使用“==”
//equals方法有没有调用compareTo方法?老版本可以看一下。JDK13中并没有调用compareTo()方法
// equals只能看出相等不相等。
//compareTo方法(第二个方法)可以看出是否相等,并且同时还可以看出谁大谁小。
System.out.println("abc".equals("abc")); //输出: true
//6. boolean equalsIgnoreCase(String anotherString)
// 判断两个字符串是否相等,并且同时忽略大小写。
System.out.println("ABc".equalsIgnoreCase("abc"));//输出: true
//7. byte[] getBytes()
// 字符串对象转换成字节数组
byte[] bytes = "abcdef".getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]); // 输出: 97 98 99 100 101 102
}
//8. int index0f(String str)
//判断某个子字符串在当前字符串中第一次出现处的索引(下标)。 如果没有返回-1
System.out.println("oraclejavac++.netc#phppythonjavaoraclec++".indexOf("java"));// 输出:6
//9. boolean isEmpty()
// 断个字持事是否为“空字符串”,底层源代码调用的应该是字符串的lenath()方法。
// String s = " " ;
String s = "a";
System.out.println(s.isEmpty()); // 输出:false
//10. int length() 判断字符串长度
//面试题:判断数组长度和判断字符串长度不一样
//判断数组长度是length属性,判断字符串长度是length()方法。
System.out.println("abc".length());//输出: 3
System.out.println("".length());//输出: 0
//11. int lastIndexOf(String str)
// 判断某个子字符在当前字特串中最后一次出理的索引(下标)
System.out.println("oraclejavac++javac#phpjavapython".lastIndexOf("java"));//输出:22
//12. String replace(CharSequence target,CharSequence replacement) 替换。
//String的父接口就是:CharSequence
String ss ="http://www.baidu.com".replace("http://","https://");
System.out.println(ss);//输出:https://www.baidu.com/
// 把以下字符串中的"="替换成":“
String ss2 ="name=zhangsan&password=123&age=2".replace("=",":");
System.out.println(ss2);//输出: name:zhangsan&password:123&age:20
//13. String[] split(String regex)
// 拆分字符串
String[] ymd = "1980-10-11".split("-");//”1980-10-11"以“-”分隔符进行拆分。
for(int i=0; i<ymd.length; i++) {
System.out.println(ymd[i]);
}
String param="name=zhangsan&password=123&age=20";
String[] params = param.split("&"); //以“&”分隔符进行分割
for(int i = 0; i <params.length; i++) {
System.out.println(params[i]);
}
String str = "aaa bbb ccc";
String[] array2 = str.split(" "); //根据空格来切
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
//14. boolean startsWith(String prefix)
// 判断某个字符串是否以某个子字符串开始。
System.out.println("http://www.baidu.com".startsWith("http")); //输出: true
System.out.println("http://www.baidu.com".startsWith("https")); //输出: false
//15. String substring(int beginIndex)参数是起始下标。
// 截取字符串
System.out.println("http://www.baidu.com".substring(7));//输出:www.baidu.com
//16. String substring(int beginIndex, int endIndex)
// beginIndex起始位置(包括)
// endIndex结束位置(不包括)
System.out.println("http://www.baidu.com".substring(7,10));//输出:www
//17. char[] toCharArray()
// 将字符串转换成char数组
char[] chars="你好呀朋友".toCharArray();
for(int i = 0; i< chars.length; i++){
System.out.println(chars[i]);
}
//18. String toLowerCase()
//转换为小写
System.out.println("AUIHGBUAYH".toLowerCase()); //输出:auihgbuayh
//19. String toUpperCase()
//转换为大写
System.out.println("HDHGhuhfi".toUpperCase()); // 输出:HDHGHUHFI
//20. String trim()
//去除字符串前后空白
System.out.println(" hello world ".trim() ); //输出:hello world
//21. String中只有一个方法是静态的,不需要new对象
//这个方法叫做valueOf()
//作用:将“非字符串”转换成“字符串”
String a = String.valueOf(true);
String b = String.valueOf(100);
String cc = String.valueOf(3.14);
//22. String concat(String str)
// 将当前字符串和参数字符串拼接成为新的字符串
String str11 = "heallo";
String str22 = "wordl";
String str33 = str11.concat(str22);
System.out.println(str33); //输出:heallowordl
//23. String replace(CharSequence oldString,CharSequence newString)
//将所有出现的老字符串替换成为新的字符串,返替换后的结果成为新字符串
//CharSequence意思就是说可以接受字符串类型
String str1 = "How do you do?";
String str2 = str1.replace("o","*");
System.out.println(str2); //输出:H*w d* y*u d*?
String lang1 ="会不会玩,傻逼,傻逼";
String lang2 = lang1.replace("傻逼","**");
System.out.println(lang2); //输出:会不会玩,**,**
}