Java的第九篇文章——常用类上(StringBuilder、System、Math)

简介: Java的第九篇文章——常用类上(StringBuilder、System、Math)

第九章 常用类上

学习目标

  • StringBuilder类的方法
  • 方法调用链
  • StringBuilder和String的互转
  • System类
  • Math类
  • 数组相关操作
  • 数组的翻转
  • 数组的最值
  • 数组的扩容
  • 数组二分查找
  • 冒泡排序
  • 直接选择排序
  • 字符串相关操作
  • 字符串翻转
  • 自定义trim
  • 字符串出现的次数
  • 字符出现的次数
  • 哪个字符出现的最多

1.StringBuilder类的常用方法

(1)StringBuilder append(任意类型) 参数追加成字符串,无论参数写的是什么,变成字符串。相当于是字符串里面的 + 运算

public class StringBuilderTest {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder();
        builder.append("123");
        builder.append(32);
        builder.append(true);
        System.out.println(builder);
    }
}

方法调用链, 链式编程 :

链式编程:保证一个方法的返回值是一个对象,再使用这个对象调用的调用方法:对象.方法().方法().方法()......

public StringBuilder append(char[] str),该方法有多种重载(由于参数不一样),其返回值是StringBuilder类,记住StringBuilder是可以改变自身的字符串的。而String类是返回一个新的地址。

public static void builderAppend2(){
    StringBuilder builder = new StringBuilder();
    //方法append() 返回值是StringBuilder
    //return this 返回值是this (谁调用,我是谁)
    builder.append("hehe").append(false).append(1.5).append(1); 
//执行的结果,是builder对象,继续使用builder对象调用方法
    System.out.println("builder = " + builder);
}

(2)StringBuilder insert(int 索引, 任意类型) 可以将任意类型的参数,插入到字符串缓冲区,指定索引。

public class StringBuilderTest {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("1233451");
        builder.insert(1, "ad");
        System.out.println(builder);//结果是1ad233451
    }
}

(3)StringBuilder类的其他方法

  • nt length() 返回字符串缓冲区的长度
  • StringBuilder delete(int start,int end)删除缓冲区中的字符,包含开头索引,不包含结束索引
  • void setCharAt(int 索引,char ch)修改指定元素上的字符
  • StringBuilder reverse() 翻转字符串

1.1 StringBuilder对象和String对象的互转

(1)String对象转成StringBuilder对象 String --> StringBuilder

  • StringBuilder类的构造方法 StringBuilder(String str)
  • append方法 append(String str)
public class StringBuilderTest {
    public static void main(String[] args) {
        stringToStringBuilder();
    }
    public static void stringToStringBuilder(){
        //构造方法
        StringBuilder builder = new StringBuilder("abc");
        //对象的方法append
        builder.append("hello");
    }
}

注:static修饰的方法,也就是静态方法是可以在该类中直接调用的,不用new 对象,可以直接写出方法,在编译的过程中,JVM会根据就近原则,去找该方法。

(2)StringBuilder对象转成String对象 StringBuilder ->String

  • StringBuilder的方法toString()
  • String类的构造方法
/**
     *  StringBuilder -> String
     */
public static void stringBuilderToString(){
        StringBuilder builder = new StringBuilder();
        builder.append("我是字符串的缓冲区");
        //builder对象转成String对象,调用builder对象的方法 toString()
        String str = builder.toString();
        System.out.println(str);
        //String类的构造方法
        String s = new String(builder);
        System.out.println(s);
}

2.System类

System系统类 : 定义在java.lang包中

定义了大量常用的字段(成员变量)和方法,该类不能实例化对象,不能new,类中的成员全部是静态修饰,类名直接调用。

为什么该类不能new对象呢?

答:因为该类的构造器被私有化了!

2.1 System类的方法

(1)static long currentTimeMillis() 返回自1970年1月1日,午夜零时,到你程序运行的这个时刻,所经过的毫秒值,1000毫秒=1秒。

public static void currentTimeMillisTest(){
        long l = System.currentTimeMillis();
        System.out.println(l);
}

(2) static void arrayCopy( Object src,int srcPos,Object dest, int destPos,int length )复制数组的元素。

  • src : 要赋值的数据源,源数组
  • srcPos : 源数组的开始索引
  • dest : 要复制的目标数组
  • destPos : 目标数组的开始索引
  • length : 要复制的元素个数
public static void arrayCopyTest(){
        int[] ints = new int[]{1, 2, 3, 4, 5, 6};
        int[] ints1 = new int[5];
        System.arraycopy(ints,0,ints1,0,5);
        for (int i = 0; i < ints1.length; i++) {
            System.out.print(ints1[i]+",");
        }
}

(3)static Properties getProperties() 返回当前的操作系统属性

public static void getPropertiesTest(){
        /**
         *  static Properties getProperties() 返回当前的操作系统属性
         *  System.getProperty(String 键名)
         *  这是两个不一样的方法
         */
        Properties properties = System.getProperties();
        System.out.println(properties);
        String property = System.getProperty("os.name");
        System.out.println(property);
}

3.Math类

  • static double PI 圆周率
  • static double E 自然数的底数
  • static int abs(int a) 返回参数的绝对值
  • static double ceil(double d)返回大于或者等于参数的最小整数
  • static double floor(double d)返回小于或者等于参数的最大整数
  • static long round(double d)对参数四舍五入
  • static double pow(double a,double b ) a的b次幂
  • static double random() 返回随机数 0.0-1.0之间
  • static double sqrt(double d)参数的平方根
public static void main(String[] args) {
// System.out.println("Math.PI = " + Math.PI);
//  System.out.println("Math.E = " + Math.E);
//static int abs(int a) 返回参数的绝对值
    System.out.println(Math.abs(-6));
//static double ceil(double d)返回大于或者等于参数的最小整数
    System.out.println(Math.ceil(12.3)); //向上取整数
//static double floor(double d)返回小于或者等于参数的最大整数
    System.out.println("Math.floor(5.5) = " + Math.floor(5.5));//向下取整数
//static long round(double d)对参数四舍五入
    long round = Math.round(5.5); //取整数部分  参数+0.5
    System.out.println("round = " + round);
//static double pow(double a,double b ) a的b次幂
    System.out.println("Math.pow(2,3) = " + Math.pow(2, 3));
//static double sqrt(double d)参数的平方根
    System.out.println("Math.sqrt(4) = " + Math.sqrt(3));
// static double random() 返回随机数 0.0-1.0之间
    for(int x = 0 ; x < 10 ; x++){
        System.out.println(Math.random()); //伪随机数
    }
}

4.数组的相关操作

4.1 数组的翻转

所谓的数组的翻转例子 : 原始数组 {1,2,3,4} 翻转后是 {4,3,2,1}

数组的翻转不等于倒叙遍历

数组中元素位置的交换,数组的换位,借助一个变量

核心问题:数组中最远端的元素交换位置

/*
    * front和end标记不断向中间移动,两者对应下标的元素进行一个交换,
    * 当两个的值都一样或front的值大于end的值时,跳出循环
    * */
    public static void arrayReverse(int[] arr){
        int front = 0,end = arr.length - 1;
        //temp变量为中间变量
        int temp = 0;
        while (front < end){
            temp = arr[front];
            arr[front] = arr[end];
            arr[end] = temp;
            front++;
            end--;
        }
    }

4.2 数组的二分(折半)搜索法

数组的基本搜索法 : 判断一个元素是否存在于数组中

  • 遍历数组,查找就可以
  • 二分搜索法提高效率 : 前提是数组必须是有序的

/**
     *
     * @param arr 传进来的数组
     * @param key 想要查找的关键字
     * @return 返回查找到该元素的下标,没有则返回-1
     */
    public static int binarySearch(int[] arr,int key){
        int min = 0,max = arr.length - 1;
        int mid = ( min + max ) / 2;
        while(min <= max){
            if(key < arr[mid]) {
                max = mid - 1;
                mid = ( min + max ) / 2;
            } else if(key > arr[mid]){
                min = mid + 1;
                mid = ( min + max ) / 2;
            }else{
                return mid;
            }
        }
        return -1;
    }

4.3 数组的排序

在无序的数组中,对元素进行排序,默认都是升序

数组排序:元素在内存中的位置交换,效率最低。

选择排序,冒泡 (选择优化),插入排序,折半排序,希尔排序,快速排序

4.3.1 冒泡排序(bubble)

核心思想:元素之间比较换位。冒泡排序的比较方式:相邻元素比较

public static void bubbleSort(int[] arr){
        int temp = 0;
        //flag为标记,标记冒泡没有发生交换,则数组已经有序,不用再进行过多趟的排序
        boolean flag = true;
        for (int i = 0; i < arr.length - 1; i++) {
            flag = true;
            for (int j = 0; j < arr.length - i - 1; j++) {
                if(arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag = false;
                }
            }
            if (flag)
                break;
        }
}

4.3.2 选择排序

优化:不是每次比较完成都要换位,获取到最值,用这个最值在换位值,也就是每趟只是进行一次交换。

public static void selectSort(int[] arr){
        int temp = 0,k = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            k = i;
            for (int j = i + 1; j < arr.length; j++) {
                if(arr[j] < arr[k])
                    k = j;
            }
            temp = arr[k];
            arr[k] = arr[i];
            arr[i] = temp;
        }
    }

4.4 Arrarys工具类

java.util包中定义了类Arrays,数组操作的工具类.类不能创建对象,直接静态调用

Arrays类的静态方法

  • static void sort(数组) 对数组进行升序排列 (目前为止效率最快)
  • static int binarySearch(数组,查找的关键字) 对数组 进行二分搜索法
  • static void fill(数组,填充的元素)
  • static String toString(数组) 返回数组字符串表现形式
  • static List asList(T...t) 元素转成List集合
public static void main(String[] args) {
        int[] arr = {1,5,9,10,15,22,27,30};
        //arrayToString(arr);
       // arraySort(arr);
       // System.out.println(Arrays.toString(arr));
        int index = arrayBinarySearch(arr,5);
        System.out.println(index);
        arrayFill();
    }
    /**
     * fill填充数组
     */
    public static void arrayFill(){
        int[] arr = {1,2,3,4,5};
        Arrays.fill(arr,6);
        System.out.println(Arrays.toString(arr));
    }
    /**
     * static int binarySearch(数组,查找的关键字) 对数组 进行二分搜索法
     * 返回元素在数组中出现的索引
     * 如果元素不存在,返回 (-插入点-1)
     * key : 放在数组中,保证有序的
     */
    public static int arrayBinarySearch(int[] arr,int key){
        int index = Arrays.binarySearch(arr, key);
        return index;
    }
    /**
     *  static void sort(数组) 对数组进行升序排列 (目前为止效率最快)
     */
    public static void arraySort(int[] arr){
        Arrays.sort(arr);
    }
    /**
     * static String toString(数组) 返回数组字符串表现形式
     * toString内部自动遍历数组
     */
    public static void arrayToString(int[] arr){
        String str =  Arrays.toString(arr);
        System.out.println(str);
    }

5.字符串相关操作

5.1 字符串翻转

数组可以转成字符串,字符串也能转成数组 (翻转数字)

/**
     * 翻转字符串的另一个实现
     */
    public static String  stringReverse2(String str){
        //str转成StringBuilder
        //StringBuilder builder = new StringBuilder(str);
       // builder.reverse();
        //字符串缓冲区转成字符串返回
        //return builder.toString();
       return   new StringBuilder(str).reverse().toString();
    }
    /**
     * 翻转字符串
     * 传递字符串,返回翻转后的字符串
     */
    public static String stringReverse(String str){
        //字符串转成数组
        char[] chars = str.toCharArray();
        //翻转数组
        for(int min = 0 ,max = chars.length - 1; min <= max ; max--,min++){
            char temp = chars[min];
            chars[min] = chars[max];
            chars[max] = temp;
        }
        //数组转成字符串
       return new String(chars);
    }

5.2 自定义trim()

功能:去掉字符串两边的空格

" abcd efg " ==>"abcd efg"

String中的基本方法涉及到匹配、分割、获取、替代都有正则表达式可以使用!!!

/**
     *  自定义的方法trim()
     *  "    abcde  fg  "
     *  "abcde  fg  "
     */
    public static String myTrim(String str){
        //去掉字符串开头的空格,方法替换
        str = str.replaceFirst(" +","");
        //判断字符串,是不是以空格结尾
        while (str.endsWith(" ")){ //"abcde  fg1"
            //截取字符串
            str = str.substring(0,str.length()-1);
        }
        return str;
    }

5.3 字符出现的次数

要求 : 指定字符串 "asdfg3435erAAEExc" ,统计处,小写字母,大写字母,数字,各自出现了多少次,不考虑其它字符。

实现思想 : 字符串换成数组,取出每个元素,分别统计 ASCII码熟悉

/**
     *  统计字符串中字符和数字出现的次数
     */
    public static void stringCount(String str){
        if (str == null)
            return;
        //定义三个计数器变量
        int upper = 0 , lower = 0 , number = 0;
        //字符串转成数组
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            //取出每个元素
            char ch = chars[i];
            //判断ch字符的ASCII范围
            if ( ch >= 'A' && ch <= 'Z')
                //大写字母
                upper ++;
            else if ( ch >= 'a' && ch <= 'z')
                //小写字母
                lower ++;
            else if (ch >= '0' && ch <= '9'){
                //数字
                number ++;
            }
        }
        System.out.println("大写字母:"+upper);
        System.out.println("小写字母:"+lower);
        System.out.println("数字:"+number);
    }
相关文章
|
9天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
32 0
|
1天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
11天前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。
|
7天前
|
存储 Java
Java编程中的对象和类
在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章【8月更文挑战第31天】 将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
|
10天前
|
缓存 安全 Java
Java String类
Java String类
11 0
|
25天前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
42 7
|
23天前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
17天前
|
安全 Java
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。
|
3月前
|
Java
Java中,有两种主要的方式来创建和管理线程:`Thread`类和`Runnable`接口。
【6月更文挑战第24天】Java创建线程有两种方式:`Thread`类和`Runnable`接口。`Thread`直接继承受限于单继承,适合简单情况;`Runnable`实现接口可多继承,利于资源共享和任务复用。推荐使用`Runnable`以提高灵活性。启动线程需调用`start()`,`Thread`直接启动,`Runnable`需通过`Thread`实例启动。根据项目需求选择适当方式。
44 2
|
2月前
|
Java 开发者
下一篇
DDNS