一、前言(可忽略)
作者是一位自学JAVA的小白,通过网上视频学习和自己对String类的理解,现将自己对String类的认知描述如下:(希望能与各位同行好友共同分享自己所学的java知识,同时,也热切期望各位同行前辈能够帮助作者指出不足,让小白的编程技术能更上一层楼,感谢各位同行大佬。
String是一种引用类型,通过存储、引用方法区字符串常量池中对应的字符串的地址来实现存储、赋值等一系列相应的操作,字符串存储在方法区字符串常量池中,在已有的基础上不会新建。垃圾回收器不会释放常量。
二、String变量的认知
String引用变量直接字符串赋值
(深入原理:是将字符串的内存地址赋值给变量,然后String变量通过索引内存地址找到位于字符串常量地址池中的字符串)
(小白理解:String是一种引用类型,通过引用字符串内存地址来调用字符串,JVM不会在已有的基础上新建或者释放字符串)
例一:
public static void main(String[] args) {
String name="hello";
String name1="hello";
System.out.println(name==name1);//比较的是字符串内存地址
输出:
true
例二:
但这种情况不是
String i=new String("abc");
String j=new String("abc");
System.out.println(i==j);
输出
false
因为new是在堆内存创建Sring对象来保存在字符串常量池中的String对象(字符串)的内存地址
i和j保存的是在堆内存中的String对象的内存地址
并不是在字符串常量池中的String对象(字符串)的内存地址
如要使new的对象输出为true,则必须调用String.equals方法
System.out.println(i.equals(j));//true,但可能报空指针异常
//最好这样写:(来自一位资历深厚的程序员,虽不是我)
System.out.println("abc".equals(j));
System.out.println(name);//注意:直接输出String引用变量会直接调用重写toString方法
三、String类的构造方法
String s=new String(""); //s1指向堆内存中new的String对象,由该String对象保存字符串的内存地址,
String s1=""; 通过创建String对象来引用字符串
String s2=new String(char 数组); //将char数组内的元素转换成字符串
String s3=new String(char 数组,offset(起始下标),coute(长度));//将char数组内起始下标为i往后j个长度的元素转换为字符串
String s4=new String(byte 数组);//将byte数组内的元素转换成字符串
String s3=new String(byte 数组,起始下标,长度); //将byte数组内起始下标为i往后j个长度的元素转换为字符串
以上是常用的,实在不行,自己看源码或者API(英文可以找英文,中文不行找语文老师)。
四、String类的基本方法
4.1 toString()方法
public String toString()
作用:将对象转换成字符串,
Exercise string=new Exercise();
System.out.println(string.toString());
输出:该对象的包名.类名@该对象的内存地址
一般使用的话,是输出该对象构造函数的参数,改写toString()方法成我们想要输出的格式
返回需求形式
public String toString()
{
return year+"年"+month+"月"+day+"日";
}
注意:输出String对象不必重写toString()方法,问就是已经写好了(看源码)。
4.2 equals()方法
public boolean equals(Object anObject)
作用:比较两个对象的内存地址是否相等
一般使用的话,是比较两个对象的内容(构造函数的参数)是否相等
@Override
public boolean equals(Object obj) {
if (obj==null||!(obj instanceof Exercise)){
return false;
}
if (obj==this){
return true;
}
Exercise exercise=(Exercise)obj;
if (this.id==exercise.id&&this.name==exercise.name)//比较构造函数的参数
{
return true;
}
return false;
}
注意:比较两个对象不能用“==”,因为java中是看两个对象的内存地址,如比较两个对象是否相同或内容相同,必须重写equals()方法。
String string=new String();
String string1=new String();
System.out.println(string==string1);//false
4.3 equalsIgnoreCase()方法
public boolean equalsIgnoreCase(String anotherString)
参数:anotherString - 与此 String 进行比较的 String。
作用: 忽略字母大小写比较字符串大小
System.out.println("ABC".equalsIgnoreCase("abc")); //忽略字母大小写比较字符串大小
4.4 getBytes()方法
public byte[] getBytes()
作用:将字符串的字符转换成对应的Byte组元素
String string3="abc";
byte []Byte=string3.getBytes();
//将字符串的字符转换成对应的Byte组元素
for (int i = 0; i <Byte.length ; i++) {
System.out.println( Byte[i]);
}
4.5 indexOf()方法
作用:查找某个字符串在当前字符串第一次出现的下标
String string4="ABCDefG";
String string5="G";
System.out.println("ABCDefG".indexOf("G"));//6
//查找某个字符串在当前字符串第一次出现的下标
4.6 lastindexOf()方法
作用:查找某个字符串在当前字符串中最后一次出现的下标
System.out.println("GABCDefG".lastIndexOf("G"));//7
4.7 charAt( )方法
public char charAt(int index)
参数:index-索引,下标
作用:字符串是一个String对象,String对象能调用方法charAt(索引指定处的值)
char c="China".charAt(1);//字符串是一个String对象,String对象能调用方法charAt(索引指定处的值)
System.out.println(c);//h
4.8 compareTo()方法
作用:compareTo方法比较字符串大小(拿着第一个字符串的第一个字符与后面字符串的第一个字符一一对应比较
int result="abc".compareTo("abc");
//compareTo方法比较字符串大小(拿着第一个字符串的第一个字符与后面字符串的第一个字符一一对应比较
System.out.println(result);//=0 前后一致
int result2="abc".compareTo("abcd");
System.out.println(result2);//=-1 前小后大
int result4="abcd".compareTo("abc");
System.out.println(result4);//=1 前大后小
int result3="abcd".compareTo("abce");
System.out.println(result3);//=-1
int result5="abce".compareTo("abcd");
System.out.println(result5);//=1
4.9 contains()方法
作用:判断第一个字符串中是否包含第二个字符串 true包含 false 不包含
System.out.println("Hello World!".contains("Hello"));
//判断第一个字符串中是否包含第二个字符串 true包含 false 不包含
4.10 startsWith()方法
作用:测试字符串是否以某字符串开头
System.out.println("2021-1-5".startsWith("2021"));//true
System.out.println("2021-1-5".startsWith("2020"));//false
4.11 endsWith()方法
作用:判断第一个字符串是否以后面的字符串结尾
System.out.println("I want to learn Java".endsWith("Java"));
//判断第一个字符串是否以后面的字符串结尾 true 是
4.12 isEmpty()方法
作用:判断某个字符串是否为空
System.out.println("程序猿江小白".isEmpty());//false
String string8="";
System.out.println(string8.isEmpty());//true
4.13 replace()方法
作用: 将当前字符串中的某些字符串替换为指定字符串,并重新生成子字符串
System.out.println("ABCGEF".replace("G","D"));//ABCDEF
4.14 split()方法
作用:以某个字符串为分隔符将当前字符串拆分成多个子字符串
String[]ymd="2021-1-2".split("-");
for (int i = 0; i <ymd.length ; i++) {
System.out.println(ymd[i]);
}
/**
* 2021
* 1
* 2
*/
String param="name=zhangliang&password=123&age=20";
//以"="或"|"为分隔符将当前字符串拆分成多个子字符串
String[] string10=param.split("=|&");//| 或
for (int k = 0; k <string10.length ; k++) {
System.out.println(string10[k]);
}
/**
* name
* zhangliang
* password
* 123
* age
* 20
*/
4.15 substring( )方法
作用:截取父字符串,生成子字符串
System.out.println("How should I face with my lost future".substring(13));
//face with my lost future
//从beginIndex开始截取,截取endIndex-beginIndex个长度,到第endIndex-1位字符结束(不包括endIndex位字符)
System.out.println("How should I face with my lost future".substring(0,2));
//Ho
4.16 toCharArray()方法
作用:将字符串转换成char数组
char[]chars1="China".toCharArray();
for (int i = 0; i <chars1.length ; i++) {
System.out.println(chars1[i]);
}
/**
* C
* h
* i
* n
* a
*/
4.17 toLowerCase()方法
作用:将字符串全部以小写字符表示
System.out.println("AMeriCAN".toLowerCase());//american
4.18 toUpperCase()方法
作用:将字符串全部以大写字符表示
System.out.println("chIna".toUpperCase());//CHINA
4.19 trim()方法
作用:去除字符串前后的空白
System.out.println(" time ".trim());//time
System.out.println(" love story ".trim());//love story//
4.20 valueof()方法
作用:将非字符串转换成字符串
/**
* String中唯一的静态方法独苗
* String.valueof
* 作用:将非字符串转换成字符串
*/
String string1=String.valueOf(new StringTest02());
/**
* valueof方法,在参数为一个对象时,如果该对象没有重写toString()底层会自
* 动调用object.toString方法
* 为什么输出引用的时候,会调用toString()方法
* 因为println底层是调用的valueof(),而valueof()底层调用的是obj的toString
* 方法
* System.out.println()打印输出时都是先转换成字符串
*/
System.out.println(string1);
4.21 StringBuffer()方法与StringBuilder()方法
作用:拼接字符串
StringBuffer stringBuffer=new StringBuffer();
//指定初始化容量的StringBuffer对象(字符串缓冲区对象)默认初始化16个长度的byte数组
stringBuffer.append("A");//拼接字符串调用append进行追加,如果byte数组满了会自动扩容
stringBuffer.append("B");
stringBuffer.append("C");
System.out.println(stringBuffer);//ABC
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("a");
stringBuilder.append("b");
stringBuilder.append("c");
System.out.println(stringBuilder);//abc
/**
* StringBuffer与StringBuilder的区别
* StringBuffer中的方法都有:synchronized关键字修饰。表示StringBuffer在多线程环境下运行是安全的
* StringBuilder中的方法没有,表示在多线程环境下是不安全的,但效率较高
*/