JavaAPI,介绍一些常用的类

这一块的内容,主要是有关Java中的API,并且介绍一些简单的类

常用类

Java中有一些常用的类,主要有这些:红色和蓝色字体的多掌握一下,这里主要带着帮助文档列举几个(Object类、String类)
在这里插入图片描述

  • API:应用程序编程接口

Object类

  • Object类的成员方法

在这里插入图片描述

  • Object:是类Object结构的根,每个class都有Object作为超类
    所有对象(包括数组)都实现了这个类的方法
    每个类都直接或间接的继承自Object类

  • Object类中的方法:hashCode()
    public int hashCode()返回对象的哈希值。 支持这种方法是为了散列表,如HashMap提供的那样 。
    注意: 哈希值就是根据哈希算法计算出来的一个值,这个值跟地址有关系,但是不是实际的地址值。你可以简单的理解为就一种地址。

      public final 类<?> getClass() 返回此Object的运行时类。 返回的类对象是被表示类的static synchronized方法锁定的对象
      
      Student是一个继承自Object类的子类
    
public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student.hashCode());//685325104
        Student student1 = new Student();
        System.out.println(student1.hashCode());//460141958

        Student student2 = student;
        System.out.println(student2.hashCode());//685325104

        System.out.println("**************************");

        Student student3 = new Student();
        System.out.println(student3.getClass());//class com.bigdata.shujia15.Student

        System.out.println("**************************");

        Class c = student3.getClass();
        System.out.println(c.getName());//com.bigdata.shujia15.Student

        System.out.println("**************************");

        System.out.println(student3.getClass().getName());//com.bigdata.shujia15.Student
        
    }
}
  • Object类中的方法:toString(),代码中顺道介绍为什么要重写toString方法
    public String toString() 返回对象的字符串表达形式,一般来说,toString方法返回一个对象的字符串
    Integer类中提供了一个静态的方法:
    public static String toHexString(int i)返回整数参数的字符串表示形式,作为16位中的无符号整数
public class StudentTest2 {
    public static void main(String[] args) {
        Student2 student2 = new Student2();
        System.out.println(student2.hashCode());//685325104
        System.out.println(student2.getClass().getName());//com.bigdata.shujia15.Student2
        System.out.println(student2.toString());//com.bigdata.shujia15.Student2@28d93b30

        System.out.println("****************");

        //toString方法的值等价于以下内容,然而这样的输出没有意义,所以JVM中为我们重写了toString方法
        //student2.getClass().getName()+"@"+Integer.toHexString(student2.hashCode())

        System.out.println(student2.getClass().getName()+"@"+Integer.toHexString(student2.hashCode()));

        //重写之后的toString方法
        student2.setName("祥哥");
        student2.setAge(21);
        System.out.println("重写之后的方法:"+student2.toString());
    }
}
//685325104
//com.bigdata.shujia15.Student2
//Student2{name='null', age=0}
//****************
//com.bigdata.shujia15.Student2@28d93b30
//重写之后的方法:Student2{name='祥哥', age=21}
  • Object中的方法:equals(这个方法,要重写)
    public boolean equals(Object obj) 指示一些其他的对象是否等于此,这个方法,默认情况下,比较的是地址值,但是呢,比较地址值是没有意义的,更多情况下,我们比较对象中成员变量的值是否一样,所以想到的是重写方法

    ==:
    基本类型:比较的是值是否相同
    引用类型:比较的是地址值是否相同
    equals:
    引用类型:默认情况下,比较的是地址值。不过,根据情况重写,可以自己重写,也可以自动生成

public class StudentTest3 {
    public static void main(String[] args) {
        Student3 s1 = new Student3("张三",21);
        Student3 s2 = new Student3("李四", 22);

        System.out.println(s1==s2);//false
        Student3 s3 = s1;
        System.out.println(s1==s3);//true

        System.out.println("********");

        System.out.println(s1.equals(s2));//false
        System.out.println(s1.equals(s1));//true
        System.out.println(s1.equals(s3));//true

        System.out.println("********");

        Student3 s4 = new Student3("王五", 23);
        System.out.println(s1.equals(s4));//false

        System.out.println("********");

        Demo demo = new Demo();
        System.out.println(s1.equals(demo));//false
    }
}

  • Object中的方法:finalize()、clone()
    protected void finalize()
    throws Throwable当垃圾回收器确定不再有对该对象的引用时,垃圾回收器在对象上调用该对象。一个子类覆盖了处理系统资源或执行其他清理的finalize方法。简单来说,它就是用于垃圾回收的,但是呢,什么时候回收不确定
    protected Object clone()
    throws CloneNotSupportedException创建并返回此对象的副本。返回的是这个实例的一个克隆。

    public interface Cloneable一个类实现Cloneable接口,以指示Object.clone()方法,该方法对于该类的实例进行现场赋值是合法的,也就是必须要实现Cloneable接口才能使用clone方法

class Student44 implements Cloneable{
    private String name;
    private int age;

    public Student44(){}

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

    public int getAge() {
        return age;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student44 student44 = (Student44) o;
        return age == student44.age &&
                Objects.equals(name, student44.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

    public String getName() {
        return name;
    }

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

    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class StudentTest4 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student44 student44 = new Student44("张三",21);
        System.out.println(student44.toString());

        Object clone = student44.clone();

        //向下转型
        Student44 sclone = (Student44)clone;
        System.out.println(student44.getName()+"---"+student44.getAge());
        System.out.println(sclone.getName()+"---"+sclone.getAge());

        Student44 s = student44;

        System.out.println("***********************");
        s.setName("李四");
        s.setAge(22);

        //可以看出来,使用clone方法克隆,new出来是一个全新的对象
        System.out.println(student44.getName()+"---"+student44.getAge());
        System.out.println(sclone.getName()+"---"+sclone.getAge());
        System.out.println(s.getName()+"---"+s.getAge());
    }
}
//李四---22
//张三---21
//李四---22

String类

  • String类概述

    • 字符串是由多个字符组成的一串数据(字符序列)
    • 字符串可以看成是字符数组
  • 通过查看API,发现

    • String类代表字符串
    • Java程序中所有字符串文字(例如“abc”)都可以实现为此类的实例
    • 字符串字面值“abc”也可以看成一个字符串对象
    • 字符串是常量,一旦被赋值,就不能被改变

构造方法

- public String()
- public String(byte[] bytes)
- public String(byte[] bytes,int offset,int length)
- public String(char[] value)
- public String(char[] value,int offset,int count)
- public String(String original)

public class StringDemo1 {
    public static void main(String[] args) {
        String s = new String();
        System.out.println("s:"+s);
        System.out.println("s的长度"+s.length());
        System.out.println("******************");

        //public String(byte[] bytes) 将字节数组转化成字符串
        byte[] b = new byte[]{11,22,33,44,55,66,77,88,99};
        String s1 = new String(b);
        System.out.println("s1:"+s1);
        System.out.println(s1.length());
        System.out.println("******************");

        //public String(byte[] bytes,int offset,int length)
        //将字节数组的一部分截取成字符串
        String s2 = new String(b,1,4);
        System.out.println("s2:"+s2);
        System.out.println(s2.length());
        System.out.println("******************");

        //public String(char[] value) 将字符数组转化成字符串
        char[] c = new char[]{'a','b','c','d','e','f','g'};
        String s3 = new String(c);
        System.out.println("s3:"+s3);
        System.out.println(s3.length());
        System.out.println("******************");

        //public String(char[] value,int offset,int count)
        //将字符数组的一部分转化成字符串
        String s4 = new String(c,1,4);
        System.out.println("s4:"+s4);
        System.out.println(s4.length());
        System.out.println("******************");

        //public String(String original)
        //将字符串常量转化成字符串对象
        String abcde = new String("abcde");
        System.out.println(abcde);
        System.out.println(abcde.length());

        String s6 = "asdfghj";
        String s7 = new String(s6);
        System.out.println("s7:"+s7);
        System.out.println(s7.length());
        
    }
}

  • 字符串的特点:一旦被赋值,就不能被改变
    面试题:
    但我们发现下面这个例子,s从Hello,变为了HelloWorld
public static void main(String[] args) {
        String s = "Hello";

        s += "World";
        System.out.println("s:"+s);//HelloWorld
    }

但实际上,我们可以发现,当我们创建“Hello”的时候,是在方法区里面的字符串常量池创建了一个空间,“World”也开辟了一个空间,“HelloWorld”也是一个新的空间,s是从“Hello”的地址,变成了“HelloWorld”的地址,但本身的字符串是不发生改变的
在这里插入图片描述

  • String s = new String(“hello”) 和 String s = "hello"的区别
    • == 比较的是引用类型的地址值
    • equals默认比较的是地址值,但是String重写了equals方法,所以比较的是内容
    • 前者会创建两个对象,后者创建一个对象
public static void main(String[] args) {
        String s1 = new String("hello");
        String s = "hello";

        System.out.println(s == s1);//false
        System.out.println(s1.equals(s));//true
    }

图解:
首先是在栈里面创建了一个s1对象,然后在堆里面开辟了一个空间,赋值了hello,存进了方法区的字符串常量池,s1指向的是堆内存里面的位置;接着在栈里面开辟了s2空间,指向的是方法区中字符串常量池的位置。
在这里插入图片描述

  • 看程序写结果
public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1==s2);        //false
        System.out.println(s1.equals(s2));  //true

        String s3 = new String("hello");
        String s4 = "hello";
        System.out.println(s3==s4); //false
        System.out.println(s3.equals(s4)); //true

        String s5 = "hello";
        String s6 = "hello";
        System.out.println(s5==s6); //true
        System.out.println(s5.equals(s6)); //true
    }
  • 看程序写结果
    • 字符串如果是变量相加,是先开辟空间,再拼接
    • 字符串如果是常量相加,是先加,再去常量池中查找,如果找到就返回,否则就创建
public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        System.out.println(s3==s1+s2);  //false
        System.out.println(s3.equals(s1+s2));  //true

        //经过编译,自动转化成System.out.println(s3 == "helloworld");
        System.out.println(s3 == "hello"+"world"); //true

        System.out.println(s3.equals("hello"+"world")); //true        
    }

判断功能

一些方法

	boolean equals(Object obj)
    boolean equalsIgnoreCase(String str)
    boolean contains(String str)
    boolean startsWith(String str)
    boolean endsWith(String str)
    boolean isEmpty()
注意事项:
    String s = "";
    String s = null;
    public static void main(String[] args) {

        //创建字符串对象
        String s1 = "helloworld";
        String s2 = "Helloworld";
        String s3 = "HelloWorld";

        //boolean equals(Object obj) 比较字符串的内容是否相同,区分大小写
        System.out.println(s1.equals(s2)); //false
        System.out.println(s1.equals(s3)); //false
        System.out.println("**********************");

        //boolean equalsIgnoreCase(String str)
        // 比较字符串的内容是否相同,忽略大小写
        System.out.println(s1.equalsIgnoreCase(s2)); //true
        System.out.println(s1.equalsIgnoreCase(s3)); //true
        System.out.println("**********************");

        //boolean contains(String str)
        //判断大的字符串中是否包含小的字符串
        System.out.println(s1.contains("Hello"));
        System.out.println(s1.contains("lowo"));
        System.out.println("**********************");

        //boolean startsWith(String str) 测试此字符串是否以指定的前缀开头。
        System.out.println(s1.startsWith("h")); //true
        System.out.println(s1.startsWith("he")); //true
        System.out.println(s1.startsWith("world")); //false
        System.out.println("**********************");

        //boolean endsWith(String str)测试此字符串是否以指定的后缀结尾。
        System.out.println(s1.endsWith("world")); //true
        System.out.println(s1.endsWith("hello")); //false
        System.out.println("**********************");

        //boolean isEmpty() 判断字符串是不是空
        System.out.println(s1.isEmpty());

        System.out.println("**********************");

        String s4 = "";
        String s5 = null;
        System.out.println(s4.isEmpty()); //true
        //因为s5的对象都没有,所以不能够调用方法,空指针异常
//        System.out.println(s5.isEmpty()); //NullPointerException


        System.out.println("asd".equals(s1));

//        System.out.println(s5.equals("asd"));

        //比较字符串的内容,推荐这种
        System.out.println("asd".equals(s5));
    }
}

获取功能

int length():获取字符串的长度

        char charAt(int index)
        int indexOf(int ch)
        int indexOf(String str)
        int indexOf(int ch,int fromIndex)
        int indexOf(String str,int fromIndex)
        String substring(int start)
        String substring(int start,int end)
public static void main(String[] args) {

        String s = "helloworld";

        // int length():获取字符串的长度
        System.out.println(s.length());
        System.out.println("*******************");

        //char charAt(int index)
        //返回char指定索引处的值。 指数范围为0至length() - 1
        System.out.println(s.charAt(7));
        System.out.println("*******************");

        //int indexOf(int ch)
        //返回指定字符第一次出现的字符串内的索引。
        System.out.println(s.indexOf('l')); //2
        System.out.println("*******************");

        //int indexOf(String str)
        //返回指定子字符串第一次出现的字符串内的索引。
        System.out.println(s.indexOf("ello")); //1
        System.out.println("*******************");


        //int indexOf(int ch,int fromIndex)
        //返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
        System.out.println(s.indexOf('l',4)); //8
        System.out.println(s.indexOf('p',4)); //-1
        System.out.println(s.indexOf('l',40)); //-1

        //int indexOf(String str,int fromIndex)
        //返回指定子串的第一次出现的字符串中的索引,从指定的索引开始

        System.out.println("*******************");

        //String substring(int start)
        //返回一个字符串,该字符串是此字符串的子字符串。
        // 子字符串以指定索引处的字符开头,并扩展到该字符串的末尾
        //截串
        //最大可以传的数值到length的值
        System.out.println(s.substring(3)); //loworld
        //System.out.println(s.substring(11));//StringIndexOutOfBoundsException
        System.out.println("*******************");

        //String substring(int start,int end)
        //返回一个字符串,该字符串是此字符串的子字符串。
        // 子串开始于指定beginIndex并延伸到字符索引endIndex - 1 。
        // 因此,子串的长度为endIndex-beginIndex 。
        //左闭右开
        System.out.println(s.substring(1,3)); //el
        System.out.println(s.substring(4,8)); //owor
    }

感谢阅读,我是啊帅和和,一位大数据专业即将大四学生,祝你快乐。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊帅和和。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值