Java API 之 Object

Object
顶级父类。任何一个类都将 Object 作为父类,也就意味着任何一个对象都可以赋值给 Object 对象。Object 类也是 Java 中唯一的一个没有父类的类。
(方法默认是 public 的,下面的是返回值类型)
   
     重要方法
clone()  --- 如果一个对象要想被克隆,那么这个对象对应的类必须实现 Cloneable 接口。
finalize() --- 通知 GC 回收垃圾,GC不一定启动,有跟没有都没多大区别
 
 
这里需要明确一个常识:
bin  二进制
oct  八进制
dec 十进制
hex 十六进制
 
练习:定义一个类表示用户
package cn.tedu.object;

public class ObjectExer1 {

    public static void main(String[] args) {
        
        User u1 = new User();
        u1.setUsername("lili");
        u1.setPassword("123");
        
        User u2 = new User();
        u2.setUsername("lili");
        u2.setPassword("123");
        
        System.out.println(u1.equals(u2));
    }
    
}

class User{
    
    private String username;
    private String password;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    //hashCode的重写:
    //如果两个对象equals为true,那么哈希码一致
    //不同对象的哈希码要不同并且要做到散列分布
    @Override
    public int hashCode() {
        final int prime = 31;//31 位有效位
        int result = 1;//奇数为1
        result = prime * result + ((password == null) ? 0 : password.hashCode());
        result = prime * result + ((username == null) ? 0 : username.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        if (username == null) {
            if (other.username != null)
                return false;
        } else if (!username.equals(other.username))
            return false;
        return true;
    }
    
    
    
}
String
最终类。代表字符串的类,所有的字符串都是 String 产生的对象。字符串是一个常量,定义好之后不可改变。
因为字符串是一个常量,所以它是共享的。 --- 只要值相同,用的都是同一个字符串
 
 
package cn.tedu.string;

public class StringDemo {

    public static void main(String[] args) {
        
        String str = "abc";
        str = "def";
        System.out.println(str);
        
        //s1指向方法区
        String s1 = "ab";
        //s2指向堆内存,堆内存指向方法区
        String s2 = new String("ab");
        //字符串在方法区中只存放一份,后续使用到值相等的字符串的时候使用的是同一个
        String s3 = "ab";
        //"a"和"b"是两个字面量
        //字面量在参与运算的时候为了提高效率在编译时期就会运算
        //String s4 = "a" + "b"; -> String s4 = "ab";
        String s4 = "a"+"b";//结果是true
        
        //实际上底层是利用了StringBuilder中的append方法来完成
        String s5 = "a";
        //s5 = new StringBuilder(s5).append("b").toString();
        //s5最后指向堆内存,堆内存再指向方法区
        s5 = s5 + "b";//结果是false,不会优化
        System.out.println(s1 == s2);//false
        System.out.println(s1 == s3);//true
        System.out.println(s1 == s4);//true
        System.out.println(s1 == s5);//false
    }
    
}

 

 

所以在append()方法后面需要加上一个 toString() 方法,将StringBuilder 的返回类型转为 String 类型的!!

 
String[] strs ={……一百个元素……};//1
//将字符串数组中的所有元素进行拼接
//使用 + 进行拼接,整个过程要产生 301 个对象
for(String s : strs)
    str += s;//每拼接1次额外产生3个对象,拼接100次要额外产生300个对象
 
//使用 StringBulider 进行拼接 --- 整个过程中要额外产生 102 个对象
StringBuilder sb = new StringBuilder();  //1
for(String s : str)
    sb.append(s); //每拼接1次要额外产生 1 个对象,拼接100次要额外产生100个对象
String str = sb.toString();//1
 
如果拼接的字符串个数比较多,建议使用StringBuilder;如果个数比较少的话,就用+
 
练习:
1. 输入字符串,然后再输入 2 个数字(一个表示起始位置,一个表示结束位置),按照指定的数字截取一个字符串
解析:使用 String str = new String(cs, begin, end); 进行截取
 
2. 输入一个字符串,统计字符串中字母、数字和其他字符的个数
解析:使用 char c = str.charAt(i); 一个一个的比较,分别计数。
 
3. 输入一个字符串,将其中的数字提取出来并求和
dsho353sdhiha89dnso4  -> 3+5+3+8+9+4 = 32
解析:同上,也是使用 char c = str.charAt(i); 是数字就加上(-'0')
 
4. 输入一个字符串,将其中的数字提取出来并进行升序排序
解析:同上,也是使用 char c = str.chatAt(i); 只是不是数字相加了,而是放入数组中,然后调用 Array.sort(arr)
 
5. 输入一个字符串,统计其中每一个字符出现的次数
解析:需要设置一个boolean 类型的数组作为标记,count = 0 作为每一个的计数,然后外层循环从头到尾,内层循环控制从这一个向后,判断是否相等,相等就输出!!
 
注意:在 String 中提供了一系列操作而不改变原数组的方法
 
instanceof  ---- 判断对象和类的关系的
只要前边的对象是后边的类/子类/接口/子接口的实例,就返回 true(在后面遇到的判断几个类继承前边那个,找出某一个类,就可以使用这个关键字)
 
 
 
posted @ 2018-08-14 19:32  唐雕  阅读(288)  评论(0编辑  收藏  举报