String
最终类
java中所有的字符串常量都是String类的对象
String类底层是根据不可改变字符数组来实现数据存储,String类对象的内容无法改变(常量)
Java中所有的常量存储方式在方法区的运行时常量池
当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用(共享)
StringBuilder与StringBuffer
从JDK1.0开始String类做拼接使用的是StringBuffer,安全可靠但是拼接效率较低
从JDK1.5开始String类做拼接使用的是StringBuffer,不安全但是拼接效率较高
package cn.r.string;
public class StringDemo1 {
public static void main(String[] args) {
//字符串常量存储在方法区的运行时常量池中
//s1指向方法区常量池
String s1="ab";
//s2指向堆内存
String s2=new String ("ab");
//当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用
//s3和s1指向同一个常量池
String s3="ab";
//byte b=128-1;
//当参与运算的都是常量那么在编译时期就会进行优化直接计算结果再进行赋值
//String s4="ab";s4和s1指向同一个常量池
String s4="a"+"b";
String s5="a";
//s5=s5+="b";
//有String类不能直接拼接
//所以底层是由 s5=new StringBuilder("a").append("b").toString();
//toString方法底部是new一个新的String类对象返回
//s5指向堆内存
s5+="b";
//s1指向方法区,s2指向堆内存,地址值不一样
System.out.println(s1==s2);//false
//s3和s1指向同一个常量池,地址值一样
System.out.println(s1==s3);//true
//s4和s1指向同一个常量池,地址值一样
System.out.println(s1==s4);//true
//s1指向方法区,s5指向堆内存,地址值不一样
System.out.println(s1==s5);//false
//s2和s5指向堆内存,地址值不一样
System.out.println(s2==s5);//false
}
}
运行结果:
重要方法
1.charAt():根据指定的下标值返回字符串对象对应的字符
2.length():返回字符串对象的长度值
3.toCharArray():把字符串对象的内存转换成字符数组
4.new String(char[] cs,int offset,int count):指定字符数组内容转换成新的字符串对象
package cn.r.string;
public class StringDemo2 {
public static void main(String[] args) {
//
String str="huttfgftgsdf";
//指代String类对象的下标来返回对应的字符
/*System.out.println(str.charAt(2));//可以获取字符串对象中任意一个字符
//遍历字符串对象的内容
//length()---返回字符串对象的长度值
//length属性---返回数组长度值
for(int i=0;i<str.length();i++){
System.out.println(str.charAt(i));
}*/
//把String类对象的内容转换成字符数组
char [] cs=str.toCharArray();
//把字符数组内容转换成字符串对象
//String s=new String(cs);
String s=new String(cs,1,3);
System.out.println(s);
}
}
运行结果:
5.compareTo():根据字典比较来确定两个字符串对象的大小
6.compareToIgnoreCase():按字典顺序比较两个字符串,忽略大小写
String str1="AbcsRg";
String str2="abcsrg";
//把两个字符串对象内容转到两个字符数组
//根据对应位置的两个字符数组的字符求差值
//如果差值不为0就当做返回值来返回,如果差值为0挪到下一位继续求差值
//如果每个差值都为0,最后就以两个字符串对象的长度之差当做返回值来返回
//如果方法返回值为正数,说明前面对象大于后面的对象
//如果方法返回值为负数,说明前面对象小于后面的对象
//如果方法返回值为0,说明前面对象和后面的对象的内容一致
//根据字典比较来确定对象的大小关系
System.out.println(str1.compareTo(str2));
//可以忽略大小写比较
System.out.println(str1.compareToIgnoreCase(str2));
7.concat():底层是根据扩容来拼接字符串,把指定的字符串拼接到原串的末尾
String str="abc";
//把指定字符串内容拼接到原串的末尾
//底层是根据数组扩容来进行拼接
//+和concat拼接的区别?
//1.底层实现不同2.+可以拼接任意数据,但是concat只能拼接字符串
System.out.println(str.concat("123"));
8.contains():判断指定内容是否是原串的子串
String str="sdgvcd";
//原串中连续区域---子串
//判断指定内容是否是原串的子串
System.out.println(str.contains("dgvd"));
9.startsWith/endsWith:判断是否以子串开头/结尾
String str="1xxxxxxx.avi";
//判断是否以子串来结尾
//文件后缀.doc.txt.zip
System.out.println(str.endsWith(".avi"));
//判断是否以子串来开头
//火车(G-高铁)、D(动车)、T(特快)、Z(直达)
//车牌(渝---重庆)、(川---四川)、(鲁---山东)
//身份证号(前6位---户籍所在地)
System.out.println(str.startsWith("1xxx"));
10.equals():根据字符串对象的地址值和内容来综合判断对象是否相等
11.equalsIgnoreCase():忽略大小写进行比较
package cn.r.string;
public class StringDemo5{
public static void main(String[]args){
//
String str1="abc";
String str2=new String("Abc");
//instanceof---判断对象和类之间的关系
//instanceof,左边是对象,右边是子类、本类、父类
//对Object类里equals方法进行重写
//重写之后根据对象的地址值以及对象的内容来综合判断
System.out.println(str1.equals(str2));
//忽略大小写进行比较---验证码
System.out.println(str1.equalsIgnoreCase(str2));
}
}
12.getBytes():把字符串对象内容转成字节数组
13.new String(byte[] bs,int offset,int length,CharSet charset):可以把字节数组部分内容按照指定码表转成新的字符串对象
package cn.r.string;
import java.io.UnsupportedEncodingException;
public class StringDemo6{
public static void main(String[]args)throws UnsupportedEncodingException{
//
String str="订外卖";
//把字符串对象内容转成字节数组
//把字符串对象(字符形式)按照码表转成字节---编码
byte[] bs=str.getBytes("gbk");
//把字节数组转成新的字符串对象
//根据指定码表把字节形式数据转成字符形式数据---解码
//由于编码和解码使用的码表不一致产生乱码
//Strings=newString(bs,"gbk");
//把字节数组的部分内容转成新的字符串对象
String s=new String(bs,0,4,"gbk");
//
System.out.println(s);
}
}
14.hashcode():计算哈希码值过程只和对象内容有关系
String str1="abc";
String str2=new String("abc");
//重写Object类里hashcode方法
//哈希码值的计算过程只和对象的内容有关系
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
15.indexOf():根据指定内容返回在对象内容中的第一次出现下标值
String str="adsfbdsf";
//返回指定内容第一次出现下标值
//如果没有查找到返回-1
System.out.println(str.indexOf("df"));
//根据指定的起始下标(包含)来进行查找返回第一次出现的下标值
System.out.println(str.indexOf("dsf",5));