CGB2107 2021.8.12 day10 笔记

API

1.概念

预先设好的函数/接口

2.Object   “顶级父类”

1)每个类都使用Object做超类,Java中的所有类都直接或间接继承Object

2)如果一个类没有明确指明父类,那么这个类会默认继承Object类

3)java.lang包是Java核心包,无需导包直接使用

3.常用方法:

1)toString:本方法用于返回对应对象的字符串

                     重写之前打印的是地址值

                     重写之后的效果取决于如何写

2)hashCode() 打印对象的哈希码值

System.out.println(a.hashCode());

本方法的作用:用于返回对应对象的哈希码值

①本方法力求不同对象尽量返回不同的哈希码值

②我们可以大致理解成不同对象的哈希码值就是不同的

③hashCode()与equals() 保持一致,要重写都重写

3)equals() 

作用:比较当前对象与参数对象是否“相等”

本方法底层的判断逻辑是==比较,==比较 比较的是左右两边的值(地址值)

重写之前:比较的是通过==比较   比较的是值 

                  如果是引用类型(比如自定义类Student),比较的为对象名,也就是引用类型变量保存的地址值

                  如果是基本类型,那么直接比较的是基本类型保存的数据值

重写之后:效果取决于如何写

package cn.tedu.api;

import java.util.Objects;

//本类用于测试顶级父类Object
public class TestObject {
    public static void main(String[] args) {
        Student a=new Student("海绵宝宝",3);
        Student b=new Student("海绵宝宝",3);
        //打印对象的属性值
        //重写后:对象的类型与属性值
        /*用于测试toString()*/
        System.out.println(a);
        System.out.println(b);
        /*用于测试hashCode()  打印对象的哈希码值*/
        /*本方法的作用:用于返回对应对象的哈希码值
        * 本方法力求不同对象尽量返回不同的哈希码值
        * 我们可以大致理解成不同对象的哈希码值就是不同的  十进制*/
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(b.hashCode());
        /*用于测试equals()
        * 本方法底层的判断逻辑是==比较,==比较 比较的是左右两边的值
        * a与b是引用类型Student的对象,保存的是两个不同的地址值
        * 所以equals()返回false*/
        System.out.println(a.equals(b));


    }
}
class Student{
    String name;
    int age;

    public Student() {//使用快捷键生成无参构造 generate→constructor→select none
    }
    //使用快捷键生成全参构造
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //在Student类中添加重写的toString() 快捷键 generate→toString()
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //添加重写的equals() generate→equals()与hashCode()
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

String

1.特点

底层是char类型的数组   

String str = “abc”; 等效于:char data[] = {‘a’, ‘b’, ‘c’};


2.创建String的方式

1)创建char[]

char[] value={'a','b','c'};
        String s1=new String(value);

2)String str = “abc”;  高效

有高效的效果!!!!因为数据在堆中的常量池

Object类中equals()的默认实现是通过==来比较的

 但是String重写了Object当中的equals(), 重写后不再按照==比较而是比较两个字符串的具体内容 也就是说,不论创建方式,只要是串的内容一致,equals()就返回true

测试:

package cn.tedu.api;
//本类用于练习String类的使用
public class TestString {
    public static void main(String[] args) {
        //1.创建String的方式一
        /*1.字符串类型底层维护的是char[],存在堆中*/
        char[] value={'a','b','c'};
        String s1=new String(value);//触发String(char[])的含参构造来创建对象
        String s11=new String(value);//触发String(char[])的含参构造来创建对象
        //2.创建String的方式二
        String s2="abc";//写法简 效率高
        String s22="abc";//s2已创建在常量池中 s22不用再创建
        String s3="grg";
        System.out.println(s1==s2);//F  一个在堆中,一个在堆中常量池里
        System.out.println(s1==s11);//F 两个不同的对象,地址值不同
        System.out.println(s2==s22);//T  都在堆中常量池,并且指向同一个,所以地址值相同
        System.out.println(s2==s3);//F 都在堆中常量值,但是数据不同,指向两个地址
        /*Object类中equals()的默认实现是通过==来比较的
        * 但是String重写了Object当中的equals(),
        * 重写后不再按照==比较而是比较两个字符串的具体内容
        * 也就是说,不论创建方式,只要是串的内容一致,equals()就返回true*/
        System.out.println(s1.equals(s2));//T
        System.out.println(s1.equals(s11));//T
        System.out.println(s1.equals(s3));//F

    }
}

3.String类中常用的方法

1)charAt(x)   获取指定下标处的字符

2)concat("xxx")  拼接字符串

3)startsWith()  判定字符串是否以指定元素开头

4)endsWith()  判定字符串是否以指定元素结尾

5)indexOf()   判定指定元素第一次出现的索引

6)lastindexOf()   判定指定元素最后一次出现的索引

7)length()  获取字符串的长度     

      注意:数组的length是属性不是方法

8)split() 按照指定规则分割

9)toUpperCase()  把指定字符串变成全大写字母

10)toLowerCase()   把指定字符串变成全小写字母

11)substring(3)  从指定下标处截取子串  [3,结束]

       substring(1,5)  从指定下标处截取子串  [1,5)

12)  trim()  去除字符串两端多余的空格

13)String.valueOf()  转其他类型为String类型

测试:

package cn.tedu.api;

import java.util.Arrays;
import java.util.Locale;

//本类用于练习String常用方法
public class TestString2 {
    public static void main(String[] args) {
        String s="abc";
        char[] value={'a','b','c'};
        String ss=new String(value);
        System.out.println(s==ss);//F
        System.out.println(s.equals(ss));//T
        System.out.println(s.charAt(1));//b,获取指定下标处的字符
        System.out.println(s.concat("ccc"));//abcccc,用于拼接字符串
        System.out.println(s);//拼接字符串不会改变原串
        String s2=s.concat("23");
        System.out.println(s2);
        System.out.println(s.startsWith("a"));
        System.out.println(s.startsWith("y"));
        System.out.println(s.endsWith("c"));
        System.out.println(s.indexOf("b"));
        ss="abbbbb";
        System.out.println(ss.lastIndexOf("b"));
        System.out.println(ss.length());

        String s3="a b c d e";
        System.out.println(s3);
        System.out.println(s3.split(" "));//打印的是地址值
        System.out.println(Arrays.toString(s3.split(" ")));
        String[] s1 = s3.split(" ");
        System.out.println(Arrays.toString(s1));
        for (int i = 0; i < s1.length; i++) {
            System.out.println(s1[i]);
        }
        System.out.println(ss.toUpperCase());
        System.out.println(ss.toLowerCase());
        String s4="abcdefg";
        System.out.println(s4.substring(3));
        System.out.println(s4.substring(1,5));
        String s5="   abcde   vv   ";
        System.out.println(s5.trim());
        System.out.println(String.valueOf(10)+10);


    }

}

4.StringBuilder/StringBuffer

拼接字符串

前提:String类型的数据使用+拼接效率比较低

使用append()方法

练习:

package cn.tedu.api;
//本类用于测试字符串的拼接
public class TestString3 {
    public static void main(String[] args) {
        String a="abcdefghijklmnopqrstuvwxyz";
//        method1(a);
        method2(a);
    }
        //使用方式二拼接字符串
    private static void method2(String a) {
        //1.创建工具类对象
        StringBuffer sb=new StringBuffer();
        StringBuilder sb2=new StringBuilder();
        //2.拼接一万次
        long t1=System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            sb.append(a);
        }
        System.out.println(sb);
        long t2=System.currentTimeMillis();
        System.out.println(t2-t1);
    }


    //使用方法一完成字符串的拼接
    private static void method1(String a) {
        //1.创建一个变量用来保存拼接后的效果
        String result="";
        //2.创建循环执行10000次
        //5.给程序添加一个计时的功能
        //5.1获取循环开始的系统当前时间
        long t1=System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            //3.进行字符串的拼接
            result=result+a;
        }
        //5.2获取循环拼接之后的系统当前时间
        long t2=System.currentTimeMillis();
        //4.打印拼接后的效果
        System.out.println(result);
        //6.打印花费的时间
        System.out.println(t2-t1);
    }
}

5.正则表达式Regex

String类型的

作用:我们指定的规则

package cn.tedu.api;

import java.util.Scanner;

//本类用于测试正则表达式
//提示并接收用户输入的身份证号,并将判断结果输出
public class TestRegex {
    public static void main(String[] args) {
        System.out.println("请输入身份证号:");
        String input=new Scanner(System.in).nextLine();
        //找规律
        String regex="[0-9]{17}[0-9X]";
        //判断用户输入的数据是否符合
        /*input是我们接收到的数据,regex是我们定义的正则表达式,也就是要匹配的规则
        * maches()用来判断input数据是否符合regex定义的规则*/
        if (input.matches(regex)) {
            System.out.println("恭喜您");
        }else{
            System.out.println("不正确");
        }

    }
}
拓展:单个\在java中有特殊含义,认为这是一个转义符号

6.包装类

掌握基本类型与包装类型的对应关系

把基本类型进行包装,提供更加完善的功能。
基本类型是没有任何功能的,只是一个变量,只能存值,而包装类可以有更加丰富的功能

 Integer

有一个高效的效果,Integer   数据在(-128~127)范围内,valueOf(),相同的数据只会存一次,后续再存都是使用之前存过的数据     (三个条件)

parseInt()、parseDouble()......

parseInt()作用为把String类型数据转为int

......

7.自动装箱、自动拆箱

7.1自动装箱:

编译器会自动把基本类型int5,包装成包装类型Integer ,然后交给Integer类型的引用类型变量i3来保存

自动装箱底层发生的代码:Integer.valueOf(5)

valueOf()的方向:int→Integer

Integer i3=5;

7.2自动拆箱:

编译器会自动把包装类型的i1拆掉“箱子”,变为基本类型数据127 ,然后交给基本类型int的变量i4保存

自动拆箱底层发生的代码:i1.intValue();

intValue()的方向:Integer→int

练习:

package cn.tedu.api;
//本类用于测试自动装箱、自动拆箱
public class TestNumber2 {
    public static void main(String[] args) {
        //1.定义包装类型的数据
        Integer i1=new Integer(127);
        Integer i2=Integer.valueOf(127);

        //2.现在的方式:
        /*1.自动装箱:编译器会自动把基本类型int5,包装成包装类型Integer
        * 然后交给Integer类型的引用类型变量i3来保存
        * 自动装箱底层发生的代码:Integer.valueOf(5)
        * valueOf()的方向:int→Integer*/
        Integer i3=5;//不会报错,这个现象是自动装箱
        /*2.自动拆箱:编译器会自动把包装类型的i1拆掉“箱子”,变为基本类型数据127
        * 然后交给基本类型int的变量i4保存
        * 自动拆箱底层发生的代码:i1.intValue();
        * intValue()的方向:Integer→int*/
        int i4=i1;//不会报错,这个现象是自动拆箱

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值