ThirteenDay-java String类与StringBuffer,StringBuilder
1、String的常量池的内存图
public class String01 {
public static void main(String[] args) {
//双引号引着的存储在字符串常量池中
String s1="asdf";
String s2="asdf";
System.out.println(s1==s2);//true,s1与s2保存的是相同的地址 故相等
}
}
字符串常量池内存图

String t1=new String("abcd");
String t2=new String("abcd");
System.out.println(t1==t2);//false 如内存图所示,t1与t2保存的两个不同的堆内存中的字符串对象地址
System.out.println(t1.equals(t2));//true 字符串已经重写了equals方法。
代码内存图

2、String 中常用的构造方法:
第一个:String s="";
第二个:String s=new String("");
第三个:String s=new String(char[] c);
第四个:String s=new String(char[] c,起始下标,长度);
第五个:Stirng s=new Stirng(byte[] b);
第六个: String s=new String(byte[] b,起始下标,长度);
3、String类的常用方法(可以用API帮助文档查询)
第一个:char charAt(int index);
第二个:int compareTo(String s);
第三个:boolean contains(String s);
第四个:boolean endsWith(Sting s);
第五个:boolean equals(Object obj);
第六个:boolean equalsIgnoreCase(String s);//不需要管字符串大小写
第七个:byte [] getBytes();//将字符串转换成byte数组
第八个: int indexOf(String s);//判断子字符串在当前字符串中第一次出现的索引。
第九个:boolean isEmpty();//判断当前字符串是否为空串 不能判断是不是null,会出现空指针异常。
注意:判断数组长度是length属性,判断字符串长度是length()方法
第十个:int lastIndenxOf(String s);//判断子字符串在当前字符串中最后一次出现的索引。
第十一个:boolean startsWith(String str);//判断某字符串是不是以A字符串开始的。
第十二个:String substring (int beginIndenx);//截取字符串 参数:起始下标。
第十三个:String substring (int beginIndex,int endIndex);//截取字符串,左闭右开。
第十四个:char[] toCharArray();//将字符串转换成char数组。
第十五个:String toLowerCase();//转化为小写
String toUpperCase();//转化成大写
第十六个:String trim();//去除字符串前后空白。
第十七个:String中只有一个方法是静态的,不需要new对象:valueOf()//将非字符串转换成字符串。
当valueOf()的参数是一个对象的时候,会自动调用该对象的toString方法。
public static void main(String[] args) {
//charAt 返回索引值为几的字符
String s="asdf";
char ch=s.charAt(1);
System.out.println(ch);//s
//compareTo
int result="asc".compareTo("asd");
System.out.println(result);//-1 前面的小于后面的
int result1="asd".compareTo("asc");
System.out.println(result1);//1 前面的大于后面的
int result2="asc".compareTo("asc");
System.out.println(result2);//0 前面的等于后面的
//contains 字符串A是否包含字符串B
System.out.println("asdf".contains("df"));//true
System.out.println("asdf".contains("hj"));//false
//endsWith 字符串A是否以字符串B结尾
System.out.println("budgtf".endsWith("tf"));//true
System.out.println("bgsuag".endsWith("as"));//false
}
4、StringBuffer
在实际开发中,大量使用字符串拼接,会导致创建对象过多,浪费内存空间。
大量字符串拼接操作,建议使用JDK中自带的
Java.lang.StringBuffer
Java.lang.StringBuilder
如何优化StringBuffer?
在创建的时候尽可能给一个准确的容量,尽量减少扩容次数
public static void main(String[] args) {
//初始创建一个容量为16的byte[]数组(字符串缓冲区)
StringBuffer stringbuffer=new StringBuffer();
//采用StringBuffer的append追加方法 进行字符串拼接。
// 如果16为byte数组满了 则进行数组扩容操作
stringbuffer.append(12);
stringbuffer.append("a");
System.out.println(stringbuffer);//12a
}
5、StringBuilder
StringBuffer与StringBuilder的区别?
StringBuffer有关键字synchronized修饰,表示在多线程环境下运行是安全的
StringBuilder没有关键字synchronized修饰,表示在多线程环境下运行是不安全的。
StringBuffer是线程安全的;
StringBuilder是非线程安全的。
public static void main(String[] args) {
//创建一个StringBuilder对象,底层是16位的byte数组
StringBuilder stringbuilder=new StringBuilder();
stringbuilder.append("asd");
System.out.println(stringbuilder);
}
6、拆箱及装箱
提供八种包装类的原因?
因为八种基本数据类型不够用,故有提供八种包装类型
其中除char,boolean类型直接继承Object,其余继承Number,Number继承Object
Java.long,Number中有这些方法(负责拆箱!)
byte byteValue()
返回指定号码作为值 byte ,这可能涉及舍入或截断。
abstract double doubleValue()
返回指定数字的值为 double ,可能涉及四舍五入。
abstract float floatValue()
返回指定数字的值为 float ,可能涉及四舍五入。
abstract int intValue()
返回指定号码作为值 int ,这可能涉及舍入或截断。
abstract long longValue()
返回指定数字的值为 long ,可能涉及四舍五入或截断。
short shortValue()
返回指定号码作为值 short ,这可能涉及舍入或截断。
装箱: 通过构造方法进行装箱 Integer i=new Integer(123);
拆箱:引用类型-->基本类型 float f=i.floatValue();
public static void main(String[] args) {
Integer i=new Integer(123);//基本数据类型转换成--->引用数据类型---装箱
float f=i.floatValue();//引用数据类型转换成--->基本数据类型---拆箱
System.out.println(f);//123.0
}
浙公网安备 33010602011771号