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 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
27天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
47 17
|
19天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
23天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
76 4
|
23天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
45 2
|
JavaScript 前端开发 Java
|
13天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
4天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
4天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
27 1
|
12天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。