• 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(在后面遇到的判断几个类继承前边那个,找出某一个类,就可以使用这个关键字)
     
     
     
  • 相关阅读:
    No configuration found for this host:al
    相对路径和绝对路径
    工具类学习
    JRebel没有自动部署的解决方法
    之前写了http解析高德地图时,json转对象搞了半天 , 今天同事用GSON把json转对象,一句代码就解决了,代码如下
    导入项目时遇到的问题
    解析Http请求调用高德地图的api(货车路径规划)
    二进制中的符号位的区分以及表示
    svn提交及更新时的常见问题
    JDBC 连接池下重构操作
  • 原文地址:https://www.cnblogs.com/tangdiao/p/9476997.html
Copyright © 2020-2023  润新知