包装类(Wrapper)
-
包装类的分类
基本数据类型 包装类 boolean Boolean char Character byte Byte short Short int Interger long Long float Float double Double - integer经典面试题
观察下列代码,求输出结果,并说出为什么
public void method1(){
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);
//false 原因 用==比较对象时,判断的是这两个是不是一个对象
Integer m = 100;//底层Integer.valueOf(1)
Integer n = 100;
System.out.println(m == n);
//true 原因 看java源码,发现在-128~127这个范围内,Integer.valueOf不创建新的对象,因此这两个是同一个对象
Integer x = 128;
Integer y = 128;
System.out.println(x == y);
//false 原因 128超出了范围,会创建新对象,这两个不是同一个对象
Integer a = 128;
int b = 128;
//只要有基本数据类型,则判断的是值是否相等
}
String类
(1)String对象用于保存字符串,也就是一组字符序列
(2)字符串常量对象是用双引号括起的字符序列。例如“你好”
(3)字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
(4)String类实现了接口也Serializable,作用就是String可以串行化接口,能在网络传输
(5)String是final类,不能被其它类继承
(6)String有属性private final char value【】;用于存放字符串的内容,因此我们常说,字符串的本质是字符数组
-
补充
java intern()方法:
intern() 方法返回字符串对象的规范化表示形式。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
-
练习题:
public class StringTest{
Person p1 = new Person();
p1.name = "karry";
Person p2 = new Person();
p2.name = "karry";
System.out.println(p1.name.equals(p2.name));//T
System.out.println(p1.name == p2.name);//T
System.out.println(p1.name == "karry");//T
String s1 = new String("code");
String s2 = new String("code");
System.out.println(s1 == s2);//F
}
字符串的特性:
排雷题(1)
String a = "hello"+"abc";
//创建了几个对象?
//答案:创建了一个对象
//原因:编译器会在底层把该式优化为:String a = "helloabc",所以只创建了一个对象
排雷题(2)
String a = "hello";//创建a对象
String b = "abc";//创建b对象
String c = a + b;
//创建了几个对象?请仔细分析执行过程
//答:一共创建了3个对象,a,b分别在常量池中创建了相应的对象
//c先在指向堆中的(String) value[],然后由value在常量池中创建新的helloabc对象
String类常见方法:
-
简单介绍
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java设计者还提供了StringBuilder和StringBuffer来增强String的功能,并提供效率
-
节选方法:
(1)compareTo:比较两个字符串的大小,如果前者大则返回正数,如果后者答则返回负数;如果长度相同,并且每个字符也相同,就返回0;如果长度相同或者不相同,但是在进行比较时,可以区分大小
public class B{
public static void main(String[] args) {
String a = "jack";
String b = "jabk";
System.out.println(a.compareTo(b));//输出1(c的ascll码-b的ascll码)
}
}
(2)formatStr
字符串拼接
public class B{
public static void main(String[] args) {
String name = "jack";
int age = 18;
char gender = '男';
String formatStr = "我的姓名是%s 我的年龄是%d 我的性别是%c";
String info = String.format(formatStr,name,age,gender);
System.out.println(info);
}
}
-
StringBuffer类
StringBuffer保存的是字符串常量,里面的值可以更改,不用每次更新地址,效率较高
-
String和StringBuffer的相互转换
public class B{
public static void main(String[] args) {
//String-->StringBuffer
String str = "jack";
//用构造器转换
StringBuffer stringBuffer = new StringBuffer(str);
//用append方法转化
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1=stringBuffer1.append(str);
//StringBuffer-->String
StringBuffer stringBuffer2 = new StringBuffer("我怎么这么好看");
//使用StringBuffer中提供的toString方法
String str1 = stringBuffer2.toString();
//使用构造器
String str2 = new String(stringBuffer2);
}
}
-
StringBuilder类:
(1)一个可变的字符列表。此类提供一个与StringBuffer兼容的API,但不保证同步。建议在单线程情况下使用
(2)是final类,不能被继承
(3)没有做互斥处理,单线程使用
-
StringBuilder和StringBuffer的比较:
(1)StringBuilder和StringBuffer非常类似,均代表可变字符序列,而且方法也一样
(2)String:不可变字符序列
StringBuffer:可变字符序列、效率较高、线程安全
StringBuilder:可变字符序列,效率最高,线程不安全
-
使用原则:
(1)如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
(2)如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder
(3)如果字符串存在大量修改操作,并在多线程的情况下,使用StringBuffer
(4)如果我们字符串很少修改,被多个对象引用,使用String