day12_Java常用类的方法(Object类,String类和StringBuffer的区别,Math类、System类)

一、Objcet类

Object是类层次结构的根类
所有类都直接或间接继承自object类

1、构造方法

​ Object类只有一个构造方法,且是无参构造

2、常用方法:

  1. int hashCode():不同对象不同整数,相同对象返回相同整数

  2. public final Class<?> getClass():返回Class类型的对象,获取对象的运行时对象的类

    • 扩展:Class类的String getName():返回当前类的名字
    Student stu = new Student();
    // 链式调用
    System.out.println(stu.getClass().getName());
    
  3. public String toString():返回对象的字符串表示形式,直接输出对象,相当于调用这个对象的toString方法。

    默认返回格式:对象的 class 名称 + @ + hashCode 的十六进制字符串

  4. public boolean equals(Object obj):比较调用这个方法的对象和传入的对象是否相等。

    equals与 == 的区别
    ==:
    ​	基本类型:比较值是否相等
    ​	引用类型:比较的是地址值是否相等
    equals:
    ​	只能比较引用类型,默认情况也是比较地址值是否相等,如果要比较值是否相等的需要重写equals方法。
    自定义的类重写equals方法:
    
    
  5. protected void finalize():垃圾回收器回收对象的时候会调用此方法

    System.gc(); // 运行垃圾回收器
    
  6. protected Object clone():创建并返回此对象的**副本**

    使用clone:

    1. 实现Cloneable接口(不实现报CloneNotSupportedException异常)
    2. 重写clone方法
    3. 需要抛异常(处理异常)
    4. 向下转型

二、String类

String 类不能被继承,因为被final修饰

String的底层是一个字符数组,因为它被final修饰一旦确定了值不可被更改。

概述:

​ java.lang.String类代表字符串。Java程序中所有的字符串文字(例如:“abc”)都可以看作是实现此类的实例。

​ 类String中包括用于检查字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大小写的所有字符串的副本。

特点:

  1. 字符串不变:字符串的值在创建后不能被改变。

    String str1 = "abc";
    String str2 = "abc";
    
    此时str1 等于 str2 ???why?
    因为通过直接赋值的方式创建的String将会被存储到方法区的常量池,系统将会在下一次创建这样的字符串时去常量池查找该值,如果有这个值就把该地址返回给这个String变量。
    

    字符串常量池:

    在这里插入图片描述

  2. 因为String对象是不可改变的,所以它可以被共享。

  3. "abc"等效于 char[] data = {'a','b','c'};

    String str= new String(data);

1、字符串的创建

​ String =创建的字符串存储在常量池中,而 new 创建的字符串对象在堆上:

// String直接创建,在常量池创建值
String str = "abc";
// new对象创建,在堆中创建值
String str = new String("abc");
// 传入char[]
char[] chs = {'a','b','c'};
String str = new String(chs);

2、获取功能的方法

  1. int length() 返回此字符串的长度。
  2. boolean equals(Object anObject)将此字符串与指定的对象比较。
  3. String concat(String str)将指定字符串连接到此字符串的结尾。
  4. char charAt(int index)返回指定索引处的 char 值。
  5. int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。
  6. int lastIndexOf(String str返回指定子字符串在此字符串中最右边出现处的索引。
  7. String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。
  8. String substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个子字符串。
  9. String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。如果有尾随的空字符串,不会加入到切割后的字符串数组当中。
  10. contains(CharSequence chars)判断是否包含指定的字符系列。
  11. boolean startsWith(String prefix)测试此字符串是否以指定的前缀开始。
  12. boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束

3、转换功能的方法

  1. char[] toCharArray()将此字符串转换为一个新的字符数组。
  2. byte[] getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
  3. String replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
  4. String toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
  5. String toLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
  6. String trim()返回字符串的副本,忽略前导空白和尾部空白。

4、静态方法

  1. static String join(CharSequence delimiter, CharSequence... elements)返回由 CharSequence elements的副本组成的新String,该副本与指定的 delimiter的副本连接在一起.

    String str = String.join("拼接符","元素1","元素2",...);
    String str = String.join("-","a","b","c");
    // str = "a-b-c"
    

StringBuffer类和StringBuilder类

StringBuffer和StringBuilder的方法类似

StringBuffer类

线程安全,可变的符号序列。字符串缓冲区就像一个String,但可以修改值, 并且不产生新的未使用对象。

多线程的情况下为了保证线程安全使用StringBuffer

StringBuilder类

一个可变的字符序列。此类提供与StringBuffer的API,但不保证同步(线程不安全)

StringBuilder不能安全的使用**多线程。如果需要同步,那么建议使用StringBuffer**

如果不需要保证线程安全的话建议优先使用StringBuilder

  1. 构造方法:
    • StringBuilder():构造一个没有字符的字符串构建器,初始容量为16个字符。
    • StringBuilder(CharSequence seq):构造一个包含与指定的相同字符的字符串构建器CharSequence。
    • StringBuilder(int capacity):构造一个没有字符的字符串构建器,由capacity参数指定初始容量。
    • StringBuilder(String str):构造一个初始化为指定字符串内容的字符串构建器。长度为16+传入字符串长度
  2. 成员方法:

    ​ 底层是一个char[]如果长度不够,会自动扩容

    • public StringBuffer append(String s) :将指定的字符串追加到此字符序列。
    • public StringBuffer reverse():将此字符序列用其反转形式取代。
    • public delete(int start, int end):移除此序列的子字符串中的字符。
    • public insert(int offset, String str):将 str 参数的字符串插入此序列中。
    • replace(int start, int end, String str)
      使用给定 String 中的字符替换此序列的子字符串中的字符。
    3、String与StringBuilder的转换
    • String -> StringBuilder
    // 第一种
    String str = "abc";
    StringBuilder sb=new StringBuilder(str);
    // 第二种
    String str = "abc";
    StringBuilder sb=new StringBuilder();
    sb.append(str)
    
    • StringBuilder -> String
    // 第1种
    StringBuilder sb=new StringBuilder();
    sb.toString();
    // 第2种
    StringBuilder sb=new StringBuilder();
    String str = new String(sb);
    

字符串类型作为参数的注意事项:

String虽然是引用类型,但是在作为参数时,效果与基本类型的传递是一样的(传递的是值,而不是地址)不会影响实参,但是如果通过StringBuffer等可变字符串传递,在方法中调用append()等方法的话会改变实参的值

三、Math类

math类的方法全是静态方法。

  1. abs()返回参数的绝对值。

  2. ceil() 向上取整,类型为双精度浮点型。

  3. floor() 向下取整,类型为双精度浮点型。

  4. round()它表示四舍五入 ,类型为整型

  5. sqrt() 求参数的算术平方根。

  6. random()返回一个[0-1)随机数。

    • Random类

      Random random = new Random();
      int num = random.nextInt(100);
      // 伪随机产生一个[0-100)的整数
      

四、Arrays类

arrays类的方法全是静态方法,需要用类名来调用

  1. public static void sort(需要排序的数组 a, int fromIndex, int toIndex):按升序对数组的指定范围进行排序。

    Arrays.sort(a[],startIndex,endIndex);
    

    参数

    • a - 要排序的数组
    • fromIndex - 要排序的第一个元素的索引(包括在内
    • toIndex - 要排序的最后一个元素的索引(不包括)

    异常

    • IllegalArgumentException- 如果fromIndex > toIndex
    • ArrayIndexOutOfBoundsException- 如果fromIndex < 0toIndex > a.length
  2. Arrays.toString(object[] a):方法,将数组转变为字符串方便输出

  3. Arrays.equls(object[] a,object[] b):,比较两个数组的内容是否相同,Arrays类已经重写了该方法

  4. Arrays.binarySearch(Object[] a, Object key ):方法, 用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点/查找值应该在该数组的位置) - 1)。

  5. Arrays.copyOf(Object[] original, int newLength):便于缩容扩容

    Arrays.copyOfRange(Object[] original,int from,int to):截取从[from,to)位置的元素到新数组。

五、System类

java.lang.System类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。 它不能被实例化。

  • 在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。

System类的成员变量:

  1. public static final InputStream in;
    

    “标准”输入流。 此流已打开并准备好提供输入数据。该流通常对应于**键盘输入**或由主机环境或用户指定的另一输入源。

    // main方法的args接收参数。用于控制台运行java程序。
    // 1、先将HelloWorld.java文件编译为class文件 :
    javac HelloWorld.java
    // 2、通过java命令运行class文件
    //HelloWorld表示HelloWorld的class文件,后面的hello和world代表传递的参数,之间使用空格隔开的
    java HelloWorld hello world
    

    例子:

    public class HelloWorld{
    	public static void main(String[] args){
    		if(args.length == 0){
    			System.out.println("此main方法没有传递参数!");
    			return;
    		}
    		System.out.println("此main方法传递de参数!");
    		for(String arg : args){
    			System.out.print(arg+"\t");
    		}
    	}
    }
    

    在这里插入图片描述

    //在jdk1.5之后java引入了Scanner类便于用户输入
    Scanner sc = new Scanner(System.in);
    
    在读取前一般需要使用 hasNext()hasNextLine()判断是否还有输入的数据:
    String str = sc.next(); 
    next():
      //1、一定要读取到有效字符后才可以结束输入。
      //2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
      //3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
      //4、next() 不能得到带有空格的字符串。
        
    str = sc.nextLine(); 
    nextLine()//1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
      //2、可以获得空白。
        
    如果要输入 intfloat 等类型的数据,在Scanner类中也有支持,但是在输入之前最好先使用 hasNextXxx()方法进行验证
    int i1 = sc.nextInt(); // 接收输入整数
    float f1 = sc.nextFloat(); // 接收输入的浮点数
    double d1 = sc.nextDouble(); // 接收输入的双精度浮点数
    long l1 = sc.nextLong();
    Byte b1 = sc.nextByte();
    Short s1 = sc.nextShort();
    booleam bool1 = sc.nextBoolean();
    BigInteger big1 = sc.nextBigInteger();
    
  2. public static final PrintStream out;
    

    “标准”输出流。 此流已打开并准备接受输出数据。 通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地。

    对于简单的独立Java应用程序,编写一行输出数据的典型方法是:

    System.out.println(data)
    
  3. public static final PrintStream err;
    

    “标准”错误输出流。 此流已打开并准备接受输出数据。 通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地。

    按照惯例,此输出流用于显示应立即引起用户注意的错误消息或其他信息

成员方法:

  1. public static void gc()运行垃圾回收器。

  2. public static void exit(int status)终止当前正在运行的java虚拟机,参数用作状态码;根据惯例,非 0 的状态码表示异常终止。

    public static void main(String[] args){
        System.out.println("我正在学java");
        System.exit(0);
        System.out.println("我正在学java");
        System.out.println("我正在学java");
        System.out.println("我正在学java");
    }
    // 正常情况会打印四句"我正在学java",但是遇到System.exit(0);将会终止当前运行的虚拟机(java程序是运行在jvm上的),所以java程序也会终止运行。
    
  3. static long currentTimeMills()基于系统时间返回当前时间的毫秒数,从1970年1月1日0:0:0到当前时间。

     // 打印输出10000个helloworld需要花费的毫秒数
    public static void main(String[] args){
        //获取当前时间的毫秒值
        long start = System.currentTimeMillis();
        for(int i = 0 ; i < 10000 ; i++){
            System.out.println("第"+i+"个hello world");
        }
        // 获取打印完成后的毫秒数
        long end = System.currentTimeMillis();
        //输出结果自己测试
        System.out.println("这段程序共用了"+(end - start)+"毫秒");
    }
    

    补充:

    public static long nanoTime(): 返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。 仅当计算在Java虚拟机的同一实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。

    区别:

    • System.nanoTime()的精确度更高一些,如今的硬件设备性能越来越好,如果要更精密计算执行某行代码或者某块代码所消耗的时间,该方法会测量得更精确。
    • 记录当前时间,用System.currentTimeMills()单独获取System.nanoTime()没有什么意义,因为该值是随机的,无法表示当前的时间。
    • System.currentTimeMills()得到的值是基于系统时间的,值可以人为地进行修改。能够和Date类方便地转换
    • 如果需要根据时间差来过滤某些频繁的操作,用System.nanoTime()会比较合适。
  4. public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

    参数说明:
    src - 源数组。
    srcPos - 源数组中的起始位置。
    dest - 目标数组。
    destPos - 目标数据中的起始位置。
    length - 要复制的数组元素的数量。
    异常
    IndexOutOfBoundsException - 如果复制会导致访问数组边界外的数据。
    ArrayStoreException - 如果由于类型不匹配, src阵列中的元素无法存储到 dest阵列中。
    NullPointerException - 如果 src或 dest是 null。
    
    
    public static void main(String[] args){
        int[] arr = {11 , 12 , 13 , 14 , 15};
        int[] arr2 = {1, 2 , 3 , 4 , 5};
    
        System.arraycopy(arr, 1, arr2, 2, 2);
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(arr2));
        //输出结果为:
        //[11 , 12 , 13 , 14 , 15]
        //[1 , 2 , 12 , 13 , 5]
    }
    

rc或 dest是 null。


```java
public static void main(String[] args){
    int[] arr = {11 , 12 , 13 , 14 , 15};
    int[] arr2 = {1, 2 , 3 , 4 , 5};

    System.arraycopy(arr, 1, arr2, 2, 2);
    System.out.println(Arrays.toString(arr));
    System.out.println(Arrays.toString(arr2));
    //输出结果为:
    //[11 , 12 , 13 , 14 , 15]
    //[1 , 2 , 12 , 13 , 5]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值