【Java基础】2020.01.07Object类

和自甴很熟 提交于 2020-01-15 16:12:15

Object类常用方法

方法名 功能说明
public boolean equals(Object obj) 比较两个对象的内容是否相等
public final Class getClass() 获取当前对象所属类型,返回Class对象
public String toString() 将当前对象转换成字符串
protected Object clone() 生成当前对象的一个备份,并返回这个副本
public int hashCode() 返回当前对象的散列码

1.equals()方法

Object类中的equals方法

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

Integer类中的equals方法

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

String类中的equals方法

   public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

① == 比较的是两个对象的地址,在Object父类中,equals 等效 ==
② 基本数据类型用==进行比较
③ Object类中的equals方法比较的也是两个对象的地址,但是在很多类中都进行了重写,重写为比较两个对象的内容,如String类,Integer类
例子1:

	public static void main(String[] args) {
		Integer obj1 = new Integer(5);
		Integer obj2 = new Integer(15);
		Integer obj3= new Integer(5);
		Integer obj4 = obj2;
		System.out.println("obj1与obj2比较:"+obj1.equals(obj2));//false
		System.out.println("obj1与obj3比较:"+obj1.equals(obj3));
				//true  Integer 类对equale类进行了重写,比较两个对象的内容是否相等
		System.out.println("obj2与obj4比较:"+obj2.equals(obj4));//true
		System.out.println("**************************");
		System.out.println("obj1与obj2比较:"+(obj1==obj2));//false地址不同
		System.out.println("obj1与obj3比较:"+(obj1==obj3));//false地址不同
		System.out.println("obj2与obj4比较:"+(obj2==obj4));//true,两个引用是同一个地址
	}

例子2:

public static void main(String[] args) {
		Integer obj1 = new Integer(5);
		Integer obj2 = new Integer(15);
		Integer obj3= new Integer(5);
		Integer obj4 = obj2;
		System.out.println("obj1与obj2比较:"+obj1.equals(obj2));//false
		System.out.println("obj1与obj3比较:"+obj1.equals(obj3));
				//true  Integer 类对equale类进行了重写,比较两个对象的内容是否相等
		System.out.println("obj2与obj4比较:"+obj2.equals(obj4));//true
		System.out.println("**************************");
		System.out.println("obj1与obj2比较:"+(obj1==obj2));//false地址不同
		System.out.println("obj1与obj3比较:"+(obj1==obj3));//false地址不同
		System.out.println("obj2与obj4比较:"+(obj2==obj4));//true,两个引用是同一个地址
		
	}

2.toString()方法

Object类中的toString()方法用于获取对象的描述信息,方法返回包含类名和散列码的字符串。
采用一下格式
getClass().getName()+’@’+Integer.toHexString(hashCode())

3.String()类

1、String 类型概述

String类代表字符串, Java程序中的所有字符串文字(例如"abc" ) 都被实现为此类的实例。也就是说,Java程序中所有的双引号字符串,都是String 类的对象。String 类在java.lang包下,所以使用的时候不需要导包!

2、String类的特点

1.字符串不可变,它们的值在创建后不能被更改
2. 虽然String的值是不可变的,但是它们可以被共享
3.字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

3、创建字符串对象两种方式的区别

① 通过构造方法创建
通过new创建的字符串对象,每一次new都会申请一一个内存空间 ,虽然内容相同,但是地址值不同
②直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写) ,无论在程序代码中出现次,JVM都只会建立一个 String对象,并在字符串池中维护。
例子:

		//string 的三种初始化方式
		String str1 = "I am string!";
		String str2 = new String("I am string!");
		String str3 ;

4、不同类型与字符串类型转换

		str3 = "I am string";
		//字符串->整型
		int number = 1;
		String str4 = number + "";
		int number1 = 1;
		String str5 = Integer.toString(number1);
		//整型->字符串
		String str6 ="123";
		int number3 = Integer.parseInt(str6);
		//浮点型-> 字符串
		double number4 = 3.14;
		String str7 = number4 + "";
		String str8 = Double.toString(number4);
		//字符串->浮点型
		String str9 = "1.23";
		double number5 = Double.parseDouble(str9);

5、string常用方法

方法 说明
charAt(int index) 返回指定下标index对应的字符
concat(String str) 连接两个字符串返回组合后的字符串
endsWith(String suffix) 判断字符是否以suffix字符串结尾,true/false
startWith(String suffix) 判断字符是否以suffix字符串开头,true/false
equals(Object obj) 判断两个字符串是否相等,true/false
indexOf(String suffix) 返回子串suffix对应的下标
lastIndexOf(String suffx) 返回子串suffix在字符串中最后一次出现的位置
length() 返回字符串的长度
matches(String regex) 判断字符串是否与正则表达式匹配
replace(char oldChar, char newChar) 字符串中旧的子串oldChar替换成新的子串newChar
split(String regex) 按regex对字符串进行拆分,返回字符串数组
substring(int beginIndex, int endIndex) 截取指示下标范围内的子串,返回子字符串[beginIndex , endIndex)
trim() 去字符串前和后的空格

Demo:

package com.hyg.StringDemo;

public class StringReverseDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(reverse("qwertgyhju"));
	}
	public static String reverse(String string){
		String result = "";
		for(int i = string.length()-1;i>=0;i--){
			result = result+string.charAt(i);
		}
		return result;
	}

}


Demo2:

package com.hyg.StringDemo;

public class StringIndexOfDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string ="helloworld!";
		int i = string.indexOf("l");
		int a = string.indexOf("he");
		int b = string.indexOf("worlde");
		System.out.println("i="+i+" ,a = "+a+",b  = "+b);
		String string1 = string.substring(2);
		String string2= string.substring(2,5);
		System.out.println("string1="+string1+" ,string2= "+string2);
		String str = "  heool world!  ";
		System.out.println(str.trim());
		System.out.println();
	}

}

Demo3:

package com.hyg.StringDemo;

import java.util.Scanner;

public class CharAtDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String string = sc.nextLine();
		sc.close();
		char c;
		int big = 0,small = 0,num = 0;
		for (int i = 0; i < string.length(); i++) {
			c = string.charAt(i);
			if (48 <= c && c <= 57) //数字
				num++;
			if (65 <= c && c <= 90) //大写
				big++;
			if (97 <= c && c <= 122) //小写
				small++;
		}
		System.out.println("大写有"+big+"个,小写有"+small+"个,数字有"+num+"个"+string);
	}

}

6、String 、StringBuffer和StringBuilder的区别

String:任何对它内容的改变,都会产生新的对象,适合操作数量小的字符串。
StringBuffer:任何对它内容的改变,不会产生新的对象,适合操作数量大的字符串,操作速度快,适合多线程操作、常见的方法有append()追加 、reverse() 内容反转。
StringBuilder:任何对它内容的改变,不会产生新的对象,适合操作数量大的字符串,操作速度快,线程不安全、不适合多线程操作。

*注

1、内部类:也可以添加访问修饰符
2、同级类:不可以添加访问修饰符,一个Java文件中可以有多个同级类,但只能有一个公有的类
3、Integer类是对int的包装类

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!