4.5~4.6·Java进阶内容

常用API 

Math

System 

注:System.exit(0)代表JVM虚拟机正常停止,System.exit(1)代表JVM虚拟机异常停止哦

 runtime

Object

1.本身是Java里面最顶层的类,一个类没有继承特定的类,那默认继承Object类,Object类只有无参构造方法,没有其他的构造方法

2.默认继承Object后,子类每调用自身的构造方法的时候就会先调用super(),也就是Object类的无参构造方法哦

3.当父类里面的方法到子类里面就不太好用的时候,我们可以对父类的方法进行重写哦

比如toString,equals方法等等(可以用快捷键完成哦)

Student.java 

package myAPI;

public class Student{
    private String name;
    private int age;


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "{" +
            " name='" + getName() + "'" +
            ", age='" + getAge() + "'" +
            "}";
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (age != other.age)
            return false;
        return true;
    }

}

 test.java

package myAPI;

public class test{
    public static void main(String[] args) {
        Object obj = new Object();
        Student stu = new Student("wlc", 18);
        String str1 = stu.toString();

        // object类中的toString方法返回的是地址值
        // 如果我们打印一个对象,默认调用toString
        // 想要看到里面的属性值,就要重写toString方法
        // 在重写的方法中,把对象的属性值进行拼接就可以return啦
        System.out.println(stu);


        Student stu1 = new Student("w", 18);
        Student stu2 = new Student("w", 18);

        boolean result1 = stu1.equals(stu2);
        System.out.println(result1);
        
    }
}

 equals的应用

package myAPI;

public class test{
    public static void main(String[] args) {
        String str = "abc";
        StringBuilder sb = new StringBuilder("abc");

        System.out.println(str.equals(sb));
        System.out.println(sb.equals(str));
    }
}

在String里面的equals方法的API形式如下哦

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        return (anObject instanceof String aString)
                && (!COMPACT_STRINGS || this.coder == aString.coder)
                && StringLatin1.equals(value, aString.value);
    }

1.先判断是不是同一个对象

2.在判断两个比较的对象是不是都是String类型的,如果不是就返回false,如果是的话就再执行下面的判断语句啦

然后第二题的话,我们要找StringBuilder里面的equals方法,但是它没有这个方法,那还可以被调用的话,那肯定是父类Object继承过来的呗,你现在又没有对这个类里面equals方法进行重写,那默认比较的就是这两个对象的地址值啦,而不是比较他们的属性值哦

Answer:false,false

浅克隆、深克隆

克隆对象实例

User.java 

package myAPI;

import java.util.StringJoiner;

public class User implements Cloneable{
    private int id;
    private String username;
    private String password;
    private String path;        // 游戏图片
    private int[] data;         // 游戏进度

    public User() {
    }

    public User(int id, String username, String password, String path, int[] data) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.path = path;
        this.data = data;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPath() {
        return this.path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public int[] getData() {
        return this.data;
    }

    public void setData(int[] data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "{" +
            " id='" + getId() + "'" +
            ", username='" + getUsername() + "'" +
            ", password='" + getPassword() + "'" +
            ", path='" + getPath() + "'" +
            ", data='" + arrToString() + "'" +
            "}";
    }

    // 将对应地址下的数组显示出来
    public String arrToString(){
        StringJoiner sj = new StringJoiner(",","[","]");
        for(int i = 0 ; i < data.length ; i++){
            sj.add(data[i] + "");
        }
        return sj.toString();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }
}

test.java 

package myAPI;

public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] data = { 1, 2, 3, 4, 5 };
        User u1 = new User(1,"wlc", "123", "gril11", data);

        User u2 = (User) u1.clone();
        System.out.println(u1);
        System.out.println(u2);
    }
}

对象克隆(浅深克隆) 

浅 

深 

package myAPI;

import com.google.gson.Gson;

public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] data = { 1, 2, 3, 4, 5 };
        User u1 = new User(1,"wlc", "123", "gril11", data);

        // 这边的clone方法是浅拷贝
        User u2 = (User) u1.clone();
        System.out.println(u1);
        System.out.println(u2);

        // 利用外包来实现深拷贝,或者也可以自己去重写clone方法哦
        Gson gson = new Gson();
        gson.toJson(u1);
        // System.out.println(u1);
        String s = gson.toJson(u1);
        User u = gson.fromJson(s, User.class);
        System.out.println(s);
        System.out.println(u);
    }
}

clone()是浅克隆,要深克隆的话可以借助第三方类哦 

Objects的成员方法 

BigInteger

​​​​​​​ 

 

BigDecimal 

正则表达式

验证手机号码 13112345678 13712345667 13945679027 139456790271

验证座机电话号码 020-2324242 02122442 027-42424 0712-3242434

验证邮箱号码 3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn

package com.itheima.a08regexdemo;

public class RegexDemo4 {
    public static void main(String[] args) {
        /*
            需求
            请编写正则表达式验证用户输入的手机号码是否满足要求。请编写正则表达式验证用户输入的邮箱号是否满足要求。请编写正则表达式验证用户输入的电话号码是否满足要求。
            验证手机号码 13112345678 13712345667 13945679027 139456790271
            验证座机电话号码 020-2324242 02122442 027-42424 0712-3242434
            验证邮箱号码 3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
        */

        //心得:
        //拿着一个正确的数据,从左到右依次去写。
        //13112345678
        //分成三部分:
        //第一部分:1 表示手机号码只能以1开头
        //第二部分:[3-9] 表示手机号码第二位只能是3-9之间的
        //第三部分:\\d{9} 表示任意数字可以出现9次,也只能出现9次
        String regex1 = "1[3-9]\\d{9}";
        System.out.println("13112345678".matches(regex1));//true
        System.out.println("13712345667".matches(regex1));//true
        System.out.println("13945679027".matches(regex1));//true
        System.out.println("139456790271".matches(regex1));//false
        System.out.println("-----------------------------------");

        //座机电话号码
        //020-2324242 02122442 027-42424 0712-3242434
        //思路:
        //在书写座机号正则的时候需要把正确的数据分为三部分
        //一:区号@\\d{2,3}
        //      0:表示区号一定是以0开头的
        //      \\d{2,3}:表示区号从第二位开始可以是任意的数字,可以出现2到3次。
        //二:- ?表示次数,日次或一次
        //三:号码 号码的第一位也不能以日开头,从第二位开始可以是任意的数字,号码的总长度:5-10位
        String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
        System.out.println("020-2324242".matches(regex2));
        System.out.println("02122442".matches(regex2));
        System.out.println("027-42424".matches(regex2));
        System.out.println("0712-3242434".matches(regex2));

        //邮箱号码
        //3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
        //思路:
        //在书写邮箱号码正则的时候需要把正确的数据分为三部分
        //第一部分:@的左边 \\w+
        //      任意的字母数字下划线,至少出现一次就可以了
        //第二部分:@ 只能出现一次
        //第三部分:
        //      3.1         .的左边[\\w&&[^_]]{2,6}
        //                  任意的字母加数字,总共出现2-6次(此时不能出现下划线)
        //      3.2         . \\.
        //      3.3         大写字母,小写字母都可以,只能出现2-3次[a-zA-Z]{2,3}
        //      我们可以把3.2和3.3看成一组,这一组可以出现1次或者两次
        String regex3 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
        System.out.println("3232323@qq.com".matches(regex3));
        System.out.println("zhangsan@itcast.cnn".matches(regex3));
        System.out.println("dlei0009@163.com".matches(regex3));
        System.out.println("dlei0009@pci.com.cn".matches(regex3));


        //24小时的正则表达式
        String regex4 = "([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";
        System.out.println("23:11:11".matches(regex4));

        String regex5 = "([01]\\d 2[0-3])(:[0-5]\\d){2}";
        System.out.println("23:11:11".matches(regex5));
    }
}

爬虫 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test{
    public static void main(String[] args) {
        String str = "wlcwlc43wlc2wlc3";

        // 编写正则表达式
        String regex = "wlc\\d{0,1}";
        // 得到正则表达式对象
        Pattern p = Pattern.compile(regex);
        // 获得文本匹配器的对象
        // 拿着m去读取str,找符合p规则的自串
        Matcher m = p.matcher(str);

        // 利用循环获取
        while(m.find()){
            String s = m.group();
            System.out.println(s);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值