String
最终类
Java中所有的字符串常量都是String类的对象
String类底层是根据不可改变的字符数组来实现的数据存储,String类的内容是无法改变(常量)
java中所有的常量储存在方法区的运行时常量池
当常量池中已经存在引用,如果后续有同名的引用那么共享一个引用(共享)
//创建几个对象
String str = "a" //1
str += "b"//str = new StringBuilder("a").append("b").toString();//4
1 1 "ab" 1
StringBuilder与StringBuffer
从jdk1.0开始String类做拼接用StringBuffer,安全可靠但是拼接效率低。
从jdk1.5开始String类做拼接使用StringBUI类的,不安全但是拼接效率高。
package com.tencent.Pag;
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="a"+"b";s4和s1指向用一个常量池
String s4="a"+"b";
String s5="a";
//s5=s5+"b";
//底层是由 s5=new StringBuilder("a").append("b").toString();
//toString方法底层是new一个新的String类对象返回
//s5指向堆内存
s5=new StringBuilder("a").append("b").toString();
s5+="b";
//s1指向方法区,s2指向堆内存,地址值不一样
System.out.println(s1==s2);//false
//s1和s3指向同一个常量池
System.out.println(s1==s3);//true
//s4和s1指向用一个常量池
System.out.println(s1==s4);//true
System.out.println(s1==s5);//false
System.out.println(s2==s5);//false
}
}
重要方法
1、charAt():根据指定的下标值返回字符串对象对应的字符
2、length():返回字符串对象的长度值
3、toCharArray():把字符串对象的内容转成字符数组
package com.tencent.Pag;
public class StringDemo2 {
public static void main(String[] args) {
//
String str = "sswqed";
//指代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);
}
}
4、new String(char[] cs,int offset,int count):指定字符数组内容转成新的字符串对象
5、compareTo():根据字典比较来确定两个字符串对象的大小
6、str1.compareToIgnoreCase(str2):忽略大小写根据字典比较来确定两个字符串对象的大小
7、concat():底层是根据数组的扩容拼接字符串,把指定字符串拼接到原串的末尾
package com.tencent.Pag;
public class StringDemo3 {
public static void main(String[] args) {
//
String str1 = "abcdef";
String str2 = "bcdef";
//把两个字符串对象内容转到两个字符数组
//根据对应位置的两个字符数组的字符求差值
//如果差值不为零 就当做返回值返回 如果差值为0 挪到下一位继续求差值
//如果每个差值都为0,最后就以两个字符串对象的长度只差当做返回值来返回
//如果方法返回值为整数,说明前面对象大于后面的对象
//如果返回值为负数,说明前面的对象小鱼后面的对象
//如果返回值为0,说明前面的对象和后面的对象内容一致
//根据字典比较来确定对象的大小关系
System.out.println(str1.compareTo(str2));
//可以忽略大小写的比较
System.out.println(str1.compareToIgnoreCase(str2));
String str = "abc";
//把 指定的字符串内容拼接到原串的末尾
//底层是根据数组扩容来进行拼接
//+和concat拼接的区别 1、底层实现不同 2、+可以拼接任意数据,但是concat只能拼接字符串
System.out.println(str.concat("123"));
}
}
8、contains():判断指定内容是不是原串的子串
9、endsWith/startsWith:判断是否是以子串结尾/开头
package com.tencent.Pag;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
public class StringDemo4 {
public static void main(String[] args) {
//
//String str = "sdchfg";
//原串中连续区域---子串
//判断指定内容是否是原串的子串
//System.out.println(str.contains("chfg"));
//
String str = "xxxxxxxx.avi";
//判断是否是以子串结尾
//文件后缀
System.out.println(str.endsWith("ef"));
//判断是否以子串来开头
//火车
//车牌
//身份证号
System.out.println(str.startsWith("xxxx"));
}
}
10、equals():根据字符串对象的地址值和内容来综合判断对象是否相等
11、equalsIgnoreCase():忽略大小写,根据字符串对象的地址值和内容来综合判断对象是否相等
package com.tencent.Pag;
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 length,CharSet charset):可以把字节数组部分内容按照指定码表转成新的字符串对象
package com.tencent.Pag;
import java.io.UnsupportedEncodingException;
public class StringDemo6 {
public static void main(String[] args) throws UnsupportedEncodingException {
//
String str = "定外卖";
//把字符串对象内容转成字节数组
//把字符串对象(字符形式)按照码表转成字节---编码
byte[] bs = str.getBytes("gbk");
//把字节数组转成新的字符串对象
//根据指定码表把字节形式数据转成字符形式的数据---解码
//由于编码和解码使用的码表不一致产生乱码
//String s = new String(bs);
//把字节数组的部分内容转成新的字符串对象
String s = new String(bs,0,3,"gbk");
//
System.out.println(s);
}
}
14、hashcode():计算哈希码值得过程只和对象内容有关系
15、indexOf():根据指定内容返回在对象内容中的第一次出现的下标值
package com.tencent.Pag;
public class StringDemo7 {
public static void main(String[] args) {
/*//
String str1 = "abc";
String str2 = new String("abc");
//重写Object类里的hashcode方法
//哈希吗值得计算过程只和对象的内容有关
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());*/
//
String str = "abcdefgcde";
//返回指定内容第一次出现下标值
//如果没有查找到返回-1
System.out.println(str.indexOf("cde"));
//根据指定的起始下标(包含)来进行查找返回第一次出现的下标值
System.out.println(str.indexOf("cde",5));
}
}
把文字转成数字—编码 转换规律—码表
ASCII(阿斯克码表 底层占一个字节)、ISO8859-1(西欧码表 一个字节)、BIG5(繁体中文两个字节)、GB2312(中文简体 两个字节)—GBK(国标码 两个字节)、Unicode编码体系(UTF-8 三个字节)(UTF-16 两个字节)