第八天:String类、static关键字、Arrays类、Math类

String类、static关键字、Arrays类、Math类

1.String类

  1. java.lang.string 代表字符串
  2. API当中说,java程序中的所有字符串字面值(如“abc”)都可以被看作是实现此类的实
  3. 字符串的特点
    • 字符串的内容永不可变。【重点】
    • 正是因为字符串不可改变,所有字符串是可以共享使用的
    • 字符串效果上相当于是char[]字符串数组,但是底层原理是byte[]字节数组
  4. 创建字符串的常见3+1种方式
    • 三种构造方法
      • public String(); 创建一个空白字符串,不含任何内容
      • public String(char[] array); 根据字符数组的内容,来创建对应字符串
      • public String(byte[] array); 根据字节数组的内容,来创建对应字符串
    • 一种直接创建
      • String str = "Hello" // 右边直接用双引号

注意事项

  • 直接写上双引号,就是字符串对象

实例

public class Demo01String {

    public static void main(String[] args) {
        // 使用空参构造
        String str1 = new String();
        System.out.println("第一个字符串:" + str1); // 第一个字符串:

        // 根据字符数组创建字符串
        char[] charArray = {'A','B','C'};
        String str2 = new String(charArray);
        System.out.println("第二个字符串:" + str2); // 第二个字符串:ABC

        // 根据字节数组创建字符串
        byte[] byteArray = {65,97,99};
        String str3 = new String(byteArray);
        System.out.println("第三个字符串:" + str3); // 第三个字符串:Aac

        // 直接创建
        String str4 = "Hello";
        System.out.println("第四个字符串:" + str4); // 第四个字符串:Hello
    }

}

注意事项

  1. 字符串常量池,程序当中直接写上双引号的字符串,就在字符串常量池中
  2. new 的不在常量池中
  3. 对于基本数据类型来说,==是进行述职的比较
  4. 对于引用数据类型来说,==是进行【地址值】的比较

实例

public class Demo02StringPool {

    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";

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

        System.out.println(str1 == str2); // true
        System.out.println(str1 == str3); // false
        System.out.println(str2 == str3); // false
    }

}
  1. “==”是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法
    1. public boolean equals(Object obj); 参数可以是任何对象
      • 只有参数是一个字符串并且内容相同才会返回true,否则返回false
      • 注意事项:
        • 任何对象都能用equals方法进行比较
        • equals方法具有对称性,也就是 a.equals(b) 和 b.equals效果一样
        • 如果比较双方一个常量一个变量,推荐把常量字符串写在前面
          • 推荐:"abc.equals(str)"
    2. public boolean equalsIgnoreCase(string str); 忽略大小写进行比较

实例

public class Demo01StringEquala {

    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        char[] charArray = {'H','e','l','l','o'};
        String str3 = new String(charArray);

        System.out.println(str1.equals(str2)); // true
        System.out.println(str2.equals(str3)); // true
        System.out.println(str3.equals("Hello")); // true
        System.out.println("Hello".equals(str1)); // true

        String str4 = "hello";
        System.out.println(str1.equals(str4)); // false
        System.out.println("==================");

        String str5 = null;
        System.out.println("abc".equals(str5)); // false 推荐
//        System.out.println(str5.equals("abc")); // 报错,空指针异常NullPointerException 不推荐
        System.out.println("==================");

        String strA = "Java";
        String strB = "java";
        System.out.println(strA.equals(strB)); // false 严格区分大小写
        System.out.println(strA.equalsIgnoreCase(strB)); // true 忽略大小写

         // 注意,只有英文字母区分大小写,其他都不区分大小写
        System.out.println("abc一123".equalsIgnoreCase("abc壹123")); // false
    }

}
  • String 当中与获取相关的常用方法
  1. public int length(); 获取字符串当中含有的字符个数,拿到字符串长度
  2. public String concat(String str); 将有当前字符串和参数字符串拼接成为新的字符串返回
  3. public char charAt(int index); 获取指定索引位置的单个字符串。(索引从0开始)
  4. public int indexof(String str); 查找参数字符串当中首次出现的索引位置,如果没有返回-1

实例

public class Demo02Stringget {

    public static void main(String[] args) {
        String str = "hsdfkahsdlkfsfl";
        System.out.println("字符串的长度是" + str.length()); // 字符串的长度是15

        // 拼接字符串
        String str1 = "Hello";
        String str2 = "World";
        String str3 = str1.concat(str2);
        System.out.println(str1); // Hello
        System.out.println(str2); // World
        System.out.println(str3); // HelloWorld,新的字符串
        System.out.println("=========");

        // 获取指定索引位置的单个字符
        char ch = "Hello".charAt(1);
        System.out.println("在1号索引位置的字符串是:" + ch); // 在1号索引位置的字符串是:e
        System.out.println("=========");

        // 查找参数字符串在本来字符串当中出现的第一次索引位置
        // 如果根本没有,返回-1值
        String original = "HelloWorldHelloWorld";
        int index = original.indexOf("llo");
        System.out.println("第一次索引值是:" + index); // 第一次索引值是:2

        System.out.println("HelloWorld".indexOf("abc")); // -1 (表示没有)
    }

}
  • 字符串的截取方法
  1. public String Substring(int index); 截取参数位置一直到字符串末尾,返回新字符串
  2. public String Substring(int begin,int end); 截取begin开始,一直到end结束,中间的字符串
    • 备注:[begin,end); 包含左边,不包含右边

实例

public class Demo03Substring {

    public static void main(String[] args) {
        String str1 = "HelloWorld";
        String str2 = str1.substring(5);
        System.out.println(str1); // HelloWorld
        System.out.println(str2); // World (新字符串)
        System.out.println("==============");

        String str3 = str1.substring(4,7);
        System.out.println(str3); // oWo
        System.out.println("==============");

        // 下面这种写法,字符串的内容仍然是没有改变的
        // 下面有两个字符:"Hello","Java"
        // strA当中保存的是地址值
        // 本来地址值是Hello的0x666
        // 后来变成了Java的0x999
        String strA = "Hello";
        System.out.println(strA); // Hello
        strA = "Java";
        System.out.println(strA); // Java

    }

}
  • String当中与转换相关的常用方法
  1. public char[] toCharArray; 将当前字符串拆分成为字符串数组作为返回值
  2. public byte[] getByte(); 获得当前字符串的字节数组
  3. public String replace(CharSequence oldString,CharSequence newString); 将所有出现的老字符串替换为新的字符串,返回替换之后的结果新字符串
    • 备注:CharSequence 意思就是说可以接受字符串类型

实例

public class Demo04StringConvert {

    public static void main(String[] args) {
        char[] chars = "Hello".toCharArray();
        System.out.println(chars[0]); // H
        System.out.println(chars.length); // 5
        System.out.println("===============");

        // 转换为字节数组
        byte[] bytes = "abc".getBytes();
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]); // 97 98 99
        }
        System.out.println("===============");

        String str1 = "How do you do?";
        String str2 = str1.replace("o", "*");
        System.out.println(str1); // How do you do?
        System.out.println(str2); // H*w d* y*u d*?
        System.out.println("================");

        String lang1 = "会不会玩儿呀!你大爷的!你大爷的!你大爷的!";
        String lang2 = lang1.replace("你大爷的", "****");
        System.out.println(lang2); // 会不会玩儿呀!****!****!****!
    }

}
  • 分隔字符串的方法
  1. public String[] split(String regex); 按照参数的规则,将字符串分隔成为若干部分

注意事项

  1. split方法的参数其实就是一个"正则表达式",今后学习

  2. 如果按照英文句点".",进行切分,必须写"\\." (两个反斜杠进行转义)
    

实例

public class Demo05StringSplit {

    public static void main(String[] args) {
        String str1 = "aaa,bbb,ccc";
        String[] array1 = str1.split(",");
        for (int i = 0; i < array1.length; i++) {
            System.out.println(array1[i]);
        }
        System.out.println("===========");

       String str2 = "aaa bbb ccc";
       String[] array2 = str2.split(" ");
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i]);
        }
        System.out.println("===========");

        String str3 = "xxx.yyy.zzz";
        String[] array3 = str3.split("\\.");
        System.out.println(array3.length);
        for (int i = 0; i < array3.length; i++) {
            System.out.println(array3[i]);
        }
    }
    
    /*
        结果:
            aaa
            bbb
            ccc
            ===========
            aaa
            bbb
            ccc
            ===========
            3
            xxx
            yyy
            zzz
    * */

}
  • 题目:定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串。 格式参照如下: [word1 #word2#word3]。|
/*
 * 分析
 * 1、首先准备一个int[] 数组,内容是:1,2,3
 * 2、定义一个方法,用来将数组文字变成字符串
 * 三要素
 * 返回值类型:String
 * 方法名称:fromArrayToString
 * 参数列表:int[]
 * 3、格式:[world1#world2#world3]
 * 用到,for循环、字符串凭借、每个数组元素之前都有一个world字样、分隔使用的是#,区分一下是不是最后一个
 * 4、调用方法,得到返回值,并且打印结果字样
 * */
public class Demo06StringPractise {

    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4};
        String str = fromArrayToString(a);
        System.out.println(str); // [world1#world2#world3#world4]
    }

    public static String fromArrayToString(int[] array) {
        String str = "[";
        for (int i = 0; i < array.length; i++) {
            if (i == array.length - 1) {
                str = str.concat("world" + array[i] + "]");
            } else {
                str = str.concat("world" + array[i] + "#");
            }
        }
        return str;
    }

}

2.static类

  • 如果一个成员变量使用static关键字,那么这个变量不在属于对象自己,而是属于所在的类,多个对象共享一份数据

实例

public class Student {

    private int id; // 学号
    private String name; // 姓名
    private int age; // 年龄
    static String room;
    private static int idCounter = 0; // 学号计数器,每当new了一个新对象的时候,计数器++

    public Student() {
        this.id = ++idCounter;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.id = ++idCounter;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}


public class Demo01StaticField {

    public static void main(String[] args) {
        Student one = new Student("郭靖",19);
        one.room = "101教室";
        System.out.println("姓名" + one.getName() + ",年龄" + one.getAge()
                + ",教室" + one.room + ",学号" + one.getId());
        // 姓名郭靖,年龄19,教室101教室,学号1

        Student two = new Student("黄蓉",16);
        System.out.println("姓名" + two.getName() + ",年龄" + two.getAge()
                + ",教室" + two.room + ",学号" + two.getId());
        // 姓名黄蓉,年龄16,教室101教室,学号2

    }

}
  1. 一旦使用static修饰成员方法,那么这就成为静态方法,静态方法不属于对象,而是属于类
  2. 如果没有关键字static关键字,那么必须创建对象,然后通过对象才能使用它
  3. 如果有了static关键字,那么不需要创建对象,直接就能通过类名来使用它
  4. 无论是成员变量,还是成员方法,如果有了static。都推荐使用类名称进行调用
    • 静态变量:类名称.静态变量
    • 静态方法:类名称.静态方法()

注意事项

  1. 静态不能直接访问非静态
    • 原因:因为在内存当中时【先】有静态内容,【后】有的非静态内容。(先人不知后人,但是后人知道先人)
  2. 静态方法中不能使用this
    • 原因:this代表所有对象,通过谁调用的方法,谁就是当前对象

实例

public class MyClass {

    int num; // 成员变量
    static int numStatic; // 静态变量

    // 成员方法
    public void method() {
        System.out.println("这是一个成员方法");
        // 成员方法可以访问成员变量
        System.out.println(num);
        // 成员方法可以访问静态变量
        System.out.println(numStatic);
    }

    // 静态方法
    public static void methodStatic() {
        System.out.println("这是一个静态方法");
        // 静态方法能访问静态变量
        System.out.println(numStatic);
        // 静态方法不能直接访问非静态【重点】
//        System.out.println(num);

        // 静态方法当中不能用this关键字
//        System.out.println(this); // 错误写法
    }

}



public class Demo02StaticMethod {

    public static void main(String[] args) {
        MyClass obj = new MyClass();
        // 然后才能使用没有static关键字的内容
        obj.method();

        // 对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名来调用
        obj.methodStatic(); // 正确,不推荐
        MyClass.methodStatic(); // 正确 推荐

        // 对于本来当中的静态方法,可以省略类名称
        myMehtod();
        Demo02StaticMethod.myMehtod(); // 完全等效
    }


    public static void myMehtod() {
        System.out.println("自己的方法!");
    }
    
    /*
        结果:
            这是一个成员方法
            0
            0
            这是一个静态方法
            0
            这是一个静态方法
            0
            自己的方法!
            自己的方法!
    * */

}
public class Student {

    private int id; // 学号
    private String name; // 姓名
    private int age; // 年龄
    static String room;
    private static int idCounter = 0; // 学号计数器,每当new了一个新对象的时候,计数器++

    public Student() {
        this.id = ++idCounter;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.id = ++idCounter;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}


public class Demo03StaticStudent {

    public static void main(String[] args) {
        // 首先创建一下教室,这是静态的东西,应该通过类名称进行调用
        Student.room = "101教室";

        Student one = new Student("郭靖",20);
        System.out.println("one的姓名:" + one.getName()); // one的姓名:郭靖
        System.out.println("one的年龄:" + one.getAge()); // one的年龄:20
        System.out.println("one的教室:" + Student.room); // one的教室:101教室
        System.out.println("==========");

        Student two = new Student("黄蓉",18);
        System.out.println("two的姓名:" + two.getName()); // two的姓名:黄蓉
        System.out.println("two的年龄:" + two.getAge()); // two的年龄:18
        System.out.println("two的教室:" + Student.room); // two的教室:101教室
    }

}
  1. 静态代码块

    • public class 类名称{
        static {
            // 静态代码块
        }
      }
      
  2. 特点:当第一次用到本类时,静态代码块执行唯一的一次

  3. 静态内容总是优先于非静态,所有静态代码块比构造方法先执行

  4. 静态代码块的典型用途:用来一次性的对静态成员变量进行赋值

实例

public class Person {

    static {
        System.out.println("静态代码块!");
    }

    public Person() {
        System.out.println("构造方法执行!");
    }

}


public class Demo04Static {

    public static void main(String[] args) {
        Person one = new Person();
        Person two = new Person();
    }
    
    /*
        结果;
            静态代码块!
            构造方法执行!
            构造方法执行!
    * */

}

3.Arrays类

  • java.util.Arrays 是一个与数组相关的工具类,里面提供了大量的静态方法,用来实现数组常见的操作
    1. public static String toString(数组); 将参数变成字符串(按照默认格式:[元素1,元素2,元素3...])
    2. public static void sort(数组); 按照默认升序(从小到大)对数组进行排序
      • 如果是数值,sort默认按照升序从小到大
      • 如果是字符串,sort默认按照字母升序
      • 如果是自定义类型,那么这个自定义的类需要Comparable或者Comparator接口的支持【今后学习】

实例

public class Demo01Arrays {

    public static void main(String[] args) {
        int[] intArray = {10,20,30};
        // 将int[] 数组按照默认格式变成字符串
        String intstr = Arrays.toString(intArray);
        System.out.println(intstr); // [10, 20, 30]

        int[] array1 = {2,1,3,10,6};
        Arrays.sort(array1);
        System.out.println(Arrays.toString(array1)); // [1, 2, 3, 6, 10]

        String[] array2 = {"ccc","aaa","bbb"};
        Arrays.sort(array2);
        System.out.println(Arrays.toString(array2)); // [aaa, bbb, ccc]
    }

}
  • 题目:请使用Arrays相关的API,将一个随机字符串中的所有字符升序排列,并倒序打印。
import java.util.Arrays;

public class Demo02ArraysPractise {

    public static void main(String[] args) {
        String str = "hfsakdjfhkBJJdb";

        // 如何进行升序排列
        // 必须是一个数组,才能用Arrays.sort方法
        // String --> 数组,用toChartArray
        char[] chars = str.toCharArray();
        System.out.println(chars);
        Arrays.sort(chars);

        // 需要倒序遍历
        for (int i = chars.length - 1; i >= 0; i--) {
            System.out.print(chars[i]); // skkjhhffddbaJJB
        }
    }

}

4.Math类

  1. java.util.Math:类是数学相关的工具类,里面提供了大量的静态方法,完成与数学相关的操作
    • public static double abs(double num); 获取绝对值
    • public static double ceil(double num); 向上取整
    • public static double floor(double num); 向下取整
    • public static long round(double num); 四舍五入
    • Math.PI 近似的圆周率的常量

实例

public class Demo03Math {

    public static void main(String[] args) {
        // 获取绝对值
        System.out.println(Math.abs(3.14)); // 3.14
        System.out.println(Math.abs(0)); // 0
        System.out.println(Math.abs(-2.5)); // 2.5
        System.out.println("=============");

        // 向上取整
        System.out.println(Math.ceil(3.9)); // 4.0
        System.out.println(Math.ceil(3.1)); // 4.0
        System.out.println(Math.ceil(3.0)); // 3.0
        System.out.println("=============");

        // 向下取整
        System.out.println(Math.floor(3.9)); // 3.0
        System.out.println(Math.floor(3.1)); // 3.0
        System.out.println(Math.floor(3.0)); // 3.0
        System.out.println("=============");

        // 向上取整
        System.out.println(Math.round(3.9)); // 4
        System.out.println(Math.round(3.1)); // 3
        System.out.println(Math.round(3.0)); // 3

        System.out.println(Math.PI); //  3.141592653589793
    }

}
  • 题目:计算在-10.8到5.9之间,绝对值大于6或者小于2.1的整数有多少个
public class Demo04MathPractise {

    public static void main(String[] args) {
        int count = 0;
        double min = -10.8;
        double max = 5.9;
        for (int i = (int) min; i < max; i++) {
            if (Math.abs(i) > 6 || Math.abs(i) < 2.1) {
                count++;
            }
        }

        System.out.println("一共有:" + count); // 一共有:9
    }

}
posted @ 2020-10-18 14:12  因帅被判十年  阅读(62)  评论(0)    收藏  举报