常用类
String
java.lang.String
-
String表示字符串类型,属于引用数据类型,不属于基本数据类型。
-
在Java中随便使用双引号括起来的都是String对象。例如“abc”这是一个String对象
-
Java中规定,双引号括起来的字符串,是不可变的,也就是说“abc”自出生到死亡,不可变
-
在JDK当中双引号括起来的字符串,都是直接储存在“方法区“的”常量池”中的
在实际开发中,字符串使用的太频率。为了执行效率,sun公司就把字符串放到了方法区中的常量池当中
内存分析
String s1 = "abcdef";
String s2 = "abcdef" + "xy";
String s3 = new String("xy");
public class User {
private int id;
private String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class UserTest {
public static void main(String[] args) {
User user = new User(110,"张三");
}
}
String s1 = "456123";
String s2 = "456123";
System.out.println(s1 == s2);//true s1和s2指向相同的字符串常量
String x = new String("xyz");
String y = new String("xyz");
System.out.println(x == y);//false x和y指向不同的String对象 String对象指向了相同的字符串常量
//判断字符串是否相等不能用 ==
System.out.println(x.equals(y));//true String类重写了equals方法
System.out.println("xyz".equals(y));//"xyz"是一个String对象。只要是对象都能调用方法。
垃圾回收器不会释放常量池里的东西
//i中保存的是100这个值
int i = 100;
//s中保存的是s的内存地址
String s = "abc"
面试题
/*
分许以下程序一共创建了几个String对象
*/
public class StringTest03 {
public static void main(String[] args) {
/*
方法区常量池中有一个:"xyz"
堆中有两个String对象
*/
String s1 = new String("xyz");
String s2 = new String("xyz");
}
}
String类中常用的构造方法
- String s = new String(“”);
- String s = “”;//最常用
- String s = new String(char数组);
- String s = new String(char数组,起始下标,长度);
- String s = new String(byte数组);
- String s = new String(byte数组,起始下标,长度);
byte[] bytes = {97,98,99};//97是a,98是b,99是c
String s2 = new String(bytes);
System.out.println(s2);//abc
System.out.println(s2.toString());//abc 结果一致
输出一个引用的时候,会自动调用toString方法,默认Objext的话,会自动输出对象的内存地址
输出字符串对象的话,输出的不是对象的内存地址,而是字符串本身。
//String (字节数组,下标起始位置,长度)
String s3 = new String(bytes,1,2);
System.out.println(s3);//bc
其他类型同理
char[] c = {'我','是','中','国','人'};
String s4 = new String(c);
System.out.println(s4);//我是中国人
String s5 = new String(c,2,3);
System.out.println(s5);//中国人
String s6 = new String("helloWorld");
System.out.println(s6);//helloWorld
常用方法
-
(掌握)boolean . charAt(int index)
char c = "中国人".charAt(1); System.out.println(c);//国
-
(了解)int .compareTo(String anotherString);
字符串之间比较不能直接使用>< , 需要使用compareTo方法
System.out.println("abcd".compareTo("abcd"));//0 前后一致 System.out.println("abcd".compareTo("abce"));//-1 前大后小 System.out.println("abce".compareTo("abcd"));//1 前小后大 //如果第一个能比较出结果 后面无需比较
-
(掌握)boolean .contains(CharSequence s)
//判断前面的字符串是否包含后面的字符串
System.out.println("Helloworld.java".contains("world"));//true
System.out.println("Helloworld.java".contains("worldwide"));//false
-
(掌握) boolean .endsWith(String suffix)
//判断当前字符串是否以某个字符串结尾 System.out.println("Helloworld.java".endsWith("java"));//true System.out.println("Helloworld.java".endsWith("javase"));//false
-
(掌握)boolean .equals(Object anObject)
//比较两个字符串必须使用equals方法,不能使用"==" //相对compareTo更加高效 底层时把两个字符串转换为两个byte数组 然后进行比较 System.out.println("abcd".equals("abcd"));//true System.out.println("abcd".equals("abce"));//false
-
(掌握)boolean .equalsIgnoreCase(String anotherString)
//判断两个字符串是否相等,并且同时忽略大小写 System.out.println("abcd".equalsIgnoreCase("ABCD"));//true
-
(掌握) byte[] .getBytes(String charsetName)
byte[] bytes = "abcd".getBytes(); for (int i = 0; i < bytes.length; i++) { System.out.print(bytes[i] + " "); }//97 98 99 100
-
(掌握) int .indexOf(String str)
//判断某个字符串在当前字符串第一次出现处的索引(下标)。 System.out.println("javac++c#pythonphp".indexOf("c++"));//4
-
(掌握)boolean .isEmpty()
//判断某个字符串否为空 底层代码为判断字符串的长度是否为零 System.out.println("".isEmpty());//true 空返回true 非空返回false
-
(掌握)int .length()
面试题:判断数组的长度是length属性,判断字符串长度是length()方法
System.out.println("abc".length());//3
-
(掌握)int .lastIndexOf(String str)
//判断某个字符串在当前字符串最后一次出现处的索引(下标)。 System.out.println("javac++c#pythonphpjava".lastIndexOf("java"));//18
-
(掌握)String .replace(char oldChar, char newChar)
String .replace(CharSequence target, CharSequence replacement)
//只能换单个字符 System.out.println("我是一只小小小小niao".replace('n','鸟'));//我是一直小小小小鸟iao //换字符串 System.out.println("我是一只小小小小niao".replace("niao", "鸟"));//我是一直小小小小鸟 System.out.println("我是一只小小小小niao".replace("小小", "鸟"));//我是一直鸟鸟niao
-
(掌握) String[] .split(String regex)
String[] ymd = "2020-07-29".split("-");//"2020-07-29"以"-"为分割符进行拆分。 for (int i = 0; i < ymd.length; i++) { System.out.println(ymd[i]); }//2020 07 29
-
(掌握)boolean .startsWith(String prefix)
//判断当前字符串是否以某个字符串开始 System.out.println("Helloworld.java".startsWith("Hello"));//true System.out.println("Helloworld.java".startsWith("ow"));//false
-
(掌握)String substring(int beginIndex)
System.out.println("http://www.baidu.com".substring(7));//www.baidu.com
-
(掌握)String substring(int beginIndex, int endIndex)
beginIndex包括 endIndex不包括
System.out.println("http://www.baidu.com".substring(11,16));//baidu
-
(掌握)char[] toCharArray()
char[] chars = "我是中国人".toCharArray();//将"我是中国人"转化为一个char数组 for (int i = 0; i < chars.length; i++) { System.out.println(chars[i]); }
-
(掌握)String toLowerCase()
//将一个字符串转换为小写 System.out.println("ABCDedGhijklMn".toLowerCase());//abcdedghijklmn
-
(掌握)String toUpperCase()
//将一个字符串转换为大写 System.out.println("ABCDedGhijklMn".toUpperCase());//ABCDEDGHIJKLMN
-
(掌握)String trim()
System.out.println(" abcd cdef ".trim());//abcd cdef
-
(掌握)static String valueOf()
String方法中唯一一个静态方法 可以把不是String类型的数组转化为String
String s = String.valueOf(3.1415926); System.out.println(s);//3.1415926 String s1 = String.valueOf(new Customer()); System.out.println(s1);//突然暴躁 //如果Customer没有重写toString方法 它会对象的地址 //Customer类 class Customer { //重写toString方法 @Override public String toString() { return "突然暴燥"; } }
拓展println:底层调用的是String.valueof()方法 当输出的是对象时,String.valueof()会调用toString方法
所以能够打印到控制台上的全部都是字符串
要记的东西真是又臭又长,无奈😔
加油!