简述三个特殊类

一、String类

1.1实例化。

    String类的实例化方法有两种:1.直接赋值,2.构造方法。

    1.直接赋值法:

 

//这样的赋值方式只会开辟一块内存空间,并且若字符串是第一次出现则自动入池,供下次使用。

 

2.构造方法:

 

String str=new String("hello world");

//这样会开辟两块堆内存空间,其中一块会成为垃圾空间,并且不会自动保存到对象池中,可以使用intern()方法手工入池。

1.2.字符串比较

字符串比较一般有两种方法:1.“==”,2.equals;

“==”:进行的是数值的比较,比较的是两个字符串对象的内存地址数值。

equals:进行的是两个字符串内容的比较,并且区分大小写。最好写成“hello”.equals(str);(因为字符串常量是String的匿名对象,所以可以调用String的equals方法)防止用户输入为null,则会产生NullPointerExceptio。

1.3字符串常量不可更改

字符串常量的内容不可更改,更改的只是对象的指向而已!

String str = "hello" ;
str = str + " world" ;
System.out.println(str); // hello world

 

这样会产生大量的垃圾空间,所以代码中不能进行多次字符串相加。

 

原则:
1. 字符串使用就采用直接赋值。
2. 字符串比较就使用equals()实现。

3. 字符串别改变太多。

1.4 两个SB类

      正如1.3中所说的,String类的常量一旦声明不可变更,这样在进行字符串连接操作(即+操作)时,会产生许多垃圾空间,当多个PC端运行这种代码时,会大量的内存空间被占用,是机器挂掉,为了解决String类不可变更这一特性,方便字符串的修改,两个SB类应用而生。

    1:StringBuffer类

StringBuffer类中的append方法就代替了String类中的+操作。

public synchronized StringBuffer append(各种数据类型 b)

附张简易内存图说明一下下

StringBuffer 类这么好用,下面就来说说它和String类之间是如何转换的。

String类------>StringBuffer 类:

a:StringBuffer类的构造方法:new StringBuffer(String str)

b:StringBuffer类的append()方法:str.append(任何参数类型)

StringBuffer------>String类:

调用toString()方法: sb.toString()

下面说说StringBuffer类中特有的方法:

a:字符串反转:

public synchronized StringBuffer reverse()

b:删除指定范围的数据:

public synchronized StringBuffer delete(int start,int end)

c:插入数据:

public synchronized StringBuffer insert(int offset,各种数据类型 b)

StringBuffer中这三个方法也不难记,根据它可以改变字符串内容即可区分它和String类中的方法

     2:StringBuffer与StringBuilder的区别

这两者的内容都可以修改,不过前者使用的是同步处理,属于线程安全操作,而后者使用的是异步处理,属于线程不安全操作。

二.Object类 

Object类是java默认提供的类,所有类会默认继承它,故它可接受所有类的对象(向上转型)。

1.三大方法:

public Object()  //这是Object类的构造方法,用来为子类提供实例化对象服务

public String toString()  //普通方法,用来取得对象信息

public boolean equals(Object obj)  //普通方法,用来做对象比较

 在使用对象直接输出时,默认输出的是一个地址编码,就是因为Object类的toString方法,而输出String类对象的时候却能输出对象内容,这是因为String类覆写了toString方法,所以在你编写的类中,要想输出你想要的信息,则需覆写toString方法。

 

在进行对象比较时,Object类所提供的equals方法是这样的

public boolean equals(Object obj) {
        return (this == obj);
    }

"=="只是进行值的比较,若对象的属性有多个,则不能得出正确答案。例如:

        Person person = new Person("zhangsan",10);
        Person person1 = new Person("zhangsan",10);
        System.out.println(person.equals(person1));  //false

 若想得到正确答案,则需在Person类中覆写equals方法:

public boolean equals(Object obj) {
        if(obj == null){
            return false;
        }
        if(this == obj){//判断当前对象是否传入的对象相同
            return true;
        }
        if(!(obj instanceof Person)){//判断obj是否为Person子类,若不是则返回false
            return false;
        }
        Person person = (Person) obj;//要想使用子类属性,需要向下转型
        return (this.name.equals(person.name))&&(this.age.equals(person.age));
    }

 这样就可以把自己类中的属性进行一一对比,从而得到相应的答案。

除此之外,Object类还可以接受引用数据类型(类,接口,数组),也接受所有类。

三.包装类

由于Object类接受一切类对象,而不接受基本数据类型,故此,包装类应运而生。包装类的基本原理就是将基本数据类型封装到类中,就可以使用Object类接收了。

java本身就提供了两种包装类类型:

对象型(Object的直接子类):Boolean.Character(char);

数值型(Number的直接子类):Byte. Double. Short. Long. Integer(int).Float;

在进行基本数据类型与包装类转换时,存在着装箱与拆箱这两组概念:

装箱:将基本数据类型变为包装类对象,利用每一个包装类提供的构造方法实现装箱处理

Integer num = new Integer(55);  //装箱

拆箱:将包装类中包装的基本数据类型取出,利用Number类中提供的六种方法

int data  = num.intValue();  //拆箱

在JDK1.5之后提供自动拆装箱机制:

        Integer i = 55;// 自动装箱
        i++; // 自动拆箱

 在这里有一个坑:

        Integer num1 = 55;
        Integer num2 = 55;
        Integer num3 = 200;
        Integer num4 = 200;
        System.out.println(num1 == num2); // true
        System.out.println(num3 == num4); // false
        System.out.println(num3.equals(num4)); // true

这是为什么呢?因为,对于Integer var = ?在-128-127之间赋值,Integer对象是在常量池中产生的,会复用已有对象,所以在此区间可以用 == 赋值,但在这个区间外的值都是在堆上产生,不会复用已有对象,故需用equals方法来判断。所以在相同类型的包装类对象之间值比较,全部使用equals方法比较。 

字符串与基本数据类型转换

例:String类转变为int型

        String str = "123";
        int num = Integer.parseInt(str);

 其余基本类型与int型相似

其他类型转为String类

a:使用“+”号连接空白字符串;

b:new String(所有数据类型)

使用String类中提供的Valueof()方法,将字符类型变为String类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值