包装类、String

包装类

包装类的分类

  1. 针对八种基本数据类型相应的引用类型一包装类
  2. 有了类的特点,就可以调用类中的方法



包装类和基本数据类型转换

课堂测试

下面的代码是否正确,为什么?

Double d = 100d;
Float f = 1.5f;
Object obj1 = true? new lnteger(1) : new Double(2.0);//三元运算符[是一个整体] 一真大师
System.out.println(obj1);  //输出1.0而不是1
Object obj2;
if(true){
  obj2 = new Integer(1):
}
else{
  obj2 = new Double(2.0):
}
System.out.println(obj2);  //输出1

面试题

看看下面代码,输出什么结果?为什么?

public class Homework04 {
    public static void main(String[] args) {
        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i==j);   //False

        Integer m = 1;  //底层Integer.valueOf(1);
        Integer n = 1;  //底层Integer.valueOf(1);
        //所以这里主要看范围-128~127就是直接返回缓存里的Integer对象
        //超出范围则new一个Integer对象
        System.out.println(m==n);   //True

        Integer x = 128;  //底层Integer.valueOf(128);
        Integer y = 128;  //底层Integer.valueOf(128);
        System.out.println(x==y);   //False
    }
}
Integer i1 = new Integer(127):
Integer i2 = new Integer(127);
System.out.println(i1==i2);//F

Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3==i4);//F

Integer i5 = 127;//底层Integer.value0f(127)
Integer i6 = 127;
System.out.println(i5==i6);//T

Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7==i8);//F

Integer i9 = 127;//底层Integer.value0f(127)
Integer i10 = new Integer(127);
System.out.println(i9==i10);//F

//只要有基本数据类型,判断的是值是否相同
Integer i11 = 127;
int i12 = 127;
System.out.println(i11==i12);// T

Integer i13 = 128;
int i14 = 128;
System.out.println(i13==i14);//T

String类

  1. String 对象用于保存字符串,也就是一组字符序列
  2. 字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"、"boy"等
  3. 字符串的字符使用Unicode字符编码,一个字符占两个字节(不区分英文和汉字)
  4. String类较常用构造方法(其它看手册)
  • String s1 = new String0:
  • String s2 = new String(String original)
  • String s3 = new String(char[] a):
  • String s4 = new String(char[] a,int startlndex,int count)

String类实现了Serializable接口(说明可以串行化,进行网络传输);实现了Comparable接口(说明String对象可以比较);实现了CharSequence接口;继承了Objecet类
String底层实际上是用final char value[] 来存放字符串的。final是指value[]的地址不能改变,但是数组内容可以改变。

两种创建String对象的区别

方式一: 直接赋值 String s ="hsp”;
方式二: 调用构造器 String s2 = new String("hsp”);

  1. 方式一: 先从常量池查看是否有”hsp”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
  2. 方式二: 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp"则重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址
  3. 画出两种方式内存分布图

字符串的特性

  1. String是一个final类,代表不可变的字符序列
  2. 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的


创建了2个字符串常量对象,s1指向常量池"hello",s1又指向常量池"haha".s1只是存放String对象的地址,可以被修改。String对象内容不能修改,"hello"不能改为"haha",而是s1从存放hello的地址改为了存放haha的地址。

创建了几个对象?

3个

总结:常量相加”ab“+”cd“看的是池、变量相加a+b,是在堆中

String类的常见方法

String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java设计者还提供了StringBuilder 和 StringBuffer 来增强String的功能并提高效率。[后面我们还会详细介绍StringBuilder 和 StringBuffer]

StringBuffer类

String VS StringBuffer

  1. String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低 //private final char valuell;
  2. StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用更新地址,效率较高//char[] value; // 这个放在堆

String拼接

如果是常量之间的拼接:"happy"+"wei",结果就是池里的"happywei";如果是变量的拼接"happy"+s1(s1指向池里的"wei"),则结果不是常量池里的"happywei",而是堆中的对象,对象里的value成员指向池里的"happywei"。

posted @ 2024-02-25 22:55  不会des  阅读(3)  评论(0编辑  收藏  举报