第十三章 常用类

包装类(Wrapper)

  • 包装类的分类

    基本数据类型包装类
    booleanBoolean
    charCharacter
    byteByte
    shortShort
    intInterger
    longLong
    floatFloat
    doubleDouble
  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值