2022/06/08 day08:String类、static关键字、Arrays类、 Math类

1. String类

1.1 String类概述

java.long.String 代表字符串的类(说明书)
API 说,java 程序当中所有字符串字面值(如"abc")都作为此类的实例实现,
其实就是说,程序当中所有的双引号字符串,都是String类的对象。(就算没有new,也照样是。)

字符串的特点:

  1. 字符串的内容永不可变,字符串是常量。【重点】
  2. 正是因为字符串不可改变,所以字符串是可以共享使用。节省内存。
  3. 字符串效果上相对于char[]字符数组,但是底层原理【存储】是byte[]字节数组存储每个字母“字节数据”。?

创建字符串的常见3+1中方式:
三种构造方法
public String();创建一个空白字符串,不含有任何内容。
public String(char[] array);根据字符数组的内容,来创建对应的字符串。好多字给串起来。
public String(byte[] array);根据字节数组的内容,来创建对应的字符串。

一种直接创建
String str = “Hello!”//右边直接用双引号。

注意事项:直接写上双引号,就是字符串对象。 }
return smallList;
}
}
例子:

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

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

        //根据字节数组来创建字符串
//        byte[] byteArray = {'a', 'b','c'};//【提问】整数类型为什么可以存储字符串?
        byte[] byteArray = {97, 98, 99};
        String str3 = new String(byteArray);
        System.out.println("第三个字符串:" + str3);

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

1.2字符串常量池:

字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中,

对于基本类型来说,==是进行数值的比较;
对于引用类型来说,==是进行【地址值】得比较。

例子:

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.3 字符串的相关方法

字符串的比较相关方法(功能)
【明确:】String是一个类,其中有成员方法(功能),调用成员方法(功能),直接用实体名称(对象名称)就行。

== 是进行对象的地址值比较,如果确实需要字符串的内容 比较,可以使用两个方法。

方法1:
public boolean equals(Object obj);//参数可以是任何对象只有参数是一个字符串并且内容相同才会给true,否则会返回false,Object暂时不学
注意事项:

  1. 任何对象都能用Object进行接受。参数是一个地址值,功能是对比地址值里面的内容。
  2. equals方法具有对称性,也即是说a.equals(b)与b.equals(a)效果一样。
  3. 如果比较双方一个常量一个变量,推荐把常量字符串写在前面:
    推荐:“abc”.equals(a).不推荐:a.equals(“abc”)。

方法2:
public boolean equalsIgnoreCase(String str);忽略大小写,进行内容比较。
Ignore:忽略;Case:大小写。

例子:

public class Demo01StringEquals {
    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 = "abc";
        String str5 = null;//没new,无地址
        System.out.println("abc".equals(str5));//推荐  false
//        System.out.println(str5.equals("abc"));//不推荐,即使equals有对称性也不推荐,
        //因为会出现空指针异常:NullPointerException情况。


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

        String strA = "Java";
        String strB = "java";
        System.out.println(strA.equals(strB));//false
        //严格区分大小写
        System.out.println(str1.equalsIgnoreCase(str4));//true
        //省略大写写
        System.out.println("abc一123".equalsIgnoreCase("abc壹123"));//false
        //注意:只有英文字母区分大小写,其他都不区分。
    }
}

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

今天最重要的内容:字符串是常量,内容不可改变。 创建新字符串,【拼接】字符串。
例子:

public class Demo02StringGet {
    public static void main(String[] args) {
        //1.获取字符串的长度。
        int length = "1234567890".length();
        System.out.println("字符串的长度是:"  +length);

        System.out.println("----------------------");
        //2.拼接字符串
        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);//Hello,World! 新的字符串拼接

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

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

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

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

字符串截取的子字符串(功能)
字符串的截取方法:
public String substring(int index);截取从参数位置一一直到字符串末尾,返回新字符串。[n,/0)
public String substring(int begin, int end);截取从begin开始,一直到end结束,中间的字符。[n,m)
备注:[begin.end),包含左边,不包含右边。
substring:子字符串。
例子:

public class Demo3SubString {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = str1.substring(0);
        String str3 = str1.substring(0,5);//成员方法的重载形式[0,5)
        System.out.println("原本字符串为:" + str1);//hello
        System.out.println("参数位置截取到末尾子字符串为:" + str2);//hello
        System.out.println("截取begin开始,end结束子字符串为:" + str3);//hello


        System.out.println("----------------------------------");
        //下面这种写法,字符串的内容仍然是没有改变的
        //有两个字符串:"Hello"\"Java"
        //strA当中保存的是地址值,本来是"Hello"new的,后来是"Java"new的.
        //看你用的是谁的地址了。
        String strA = "Hello";
        System.out.println(strA);//Hello
        strA = "Java";
        System.out.println(strA);//Java
    }
}

String当中与转换相关的常用方法有(功能)

public char[] toCharArray();将当前字符串拆分成为字符[数组]作为返回值。
public byte[] getBytes();获得当前字符串底层的字节[数组]。
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("-----------------");

        //转换成为字节数组   I/O流会用
        byte[] bytes = "ABC".getBytes();
        System.out.println(bytes.length);//3
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]);//65
        }

//        char a = 65;
//        System.out.println(a);//A

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


        //字符串的内容替换
        String str1 = "How do you do?";
        String str2 = str1.replace("do", "*");
        System.out.println(str1);//How do you do?
        System.out.println(str2);//How * you *?

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

        String lang1 = "你大爷的!会不会玩儿呀!你大爷的!";
        System.out.println("您输入的:" + lang1);
        System.out.println("替换后的:" + lang1.replace("你大爷的","****"));
    }
}

分隔字符串的方法(功能)
public String[] split(String regex);按照参数的规则,将字符串切分成若干部分。
注意事项:
split参数:regex其实是一个“正则表达式”,今后学习;
今天要注意,如果按照英文句点".“进行切分,必须写”\."(两个反斜杠)给个区分。
"."单独出现的时候在正则表达式当中有特殊含义。

例子:

public class Demo05StringSplit {
    public static void main(String[] args) {
        String str1 = "aa-a,bb-b,c-cc,dd-d";
        String[] array1 = str1.split(",");
        for (int i = 0; i < array1.length; i++) {
            System.out.println(array1[i]);
        }

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

        String str2 ="xxx.yyy.zzz";
        String[] array2 = str2.split(".");//用"\\."
        System.out.println(array2.length);//0
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i]);
        }
    }
}

1.4 String练习

题目:
拼接字符串 定义一个方法,把数组{1,2,3}按照指定个格式拼接成一个字符串。
格式参照如下:[word1#word2#word3]。

思路:

  1. 首先准备一个int[]数组,内容是1,2,3。
  2. 定义一个方法,用来将数组变成字符串。
    三要素:
    返回值类型:String
    方法名称:fromArrayToString
    参数列表:int[]

3.格式:[word1#word2#word3]

用到:for循环、字符串拼接、每个数组元素之前都有一个Word字样、分隔使用的是#、区分是不是最后一个。

4.调用方法,得到返回值,并打印字符串。

public class Demo06StringPractice {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7};

        String str = fromArrayToString(array);
        System.out.println(str);
    }

    public static String fromArrayToString(int[] array){

        String str = "[";
        for (int i = 0; i < array.length; i++) {
            if(i == array.length -1){
                str += "word" + array[i] + "]";
                //+对于字符串来说不是累加,而是在原有的基础上拼接内容
            }else{
                str += "word" + array[i] + "#";
            }
        }
            return str;
    }
}

题目:
键盘输入一个字符串,并且统计其中各种字符出现的次数。
种类有:大写字母、小写字母、数字、其他

思路:

  1. 既然用到键盘输入,肯定用是Scanner。
  2. 键盘输入的是字符串,那么:String str = sc.next();
  3. 定义四个变量,分别代表四种字符各自出现的次数。
    4.需要对字符串一个字一个字的检查:String --> char[],方法就是toCharArray();
  4. 遍历char[]字符数组,对当前字符的种类进行判断,并且用四个变量进行++动作。
  5. 打印输出四个变量,分别代表四种字符出现的次数。
import java.util.Scanner;
public class Demo07StringCount {
    public static void main(String[] args) {
        System.out.println("请随机输入一个字符串:" );
        String str =  new Scanner(System.in).next();//获取键盘输入一个字符串。

        int countUpper = 0;//大写字母
        int countLower = 0;//小写字母
        int countNumber = 0;//数字
        int countOther = 0;//其他字符

        char[] charsArray = str.toCharArray();
        for (int i = 0; i < charsArray.length; i++) {
            char ch = charsArray[i];//当前单个字符
            if('A' <= ch && ch <= 'Z'){//char类型进行数学运算时,可以提升int类型
                countUpper++;
            }else if('a' <= ch && ch <= 'z'){
                countLower++;
            }else if('0' <= ch && ch <= '9'){//输入的是字符0-9,所以用的是'0'.
                countNumber++;
            }else{
                countOther++;
            }
        }
        System.out.println("大写字母有:" + countUpper);
        System.out.println("小写字母有:" + countLower);
        System.out.println("数字有:" + countNumber);
        System.out.println("其他字母有:" + countOther);
    }
    }

2. static关键字

2.1 概述

关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。

在这里插入图片描述

2.2 static定义和使用格式

静态变量:

当 static 修饰成员变量时,该变量称为【类变量】。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。

定义格式:
static 数据类型 变量名;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XesiTY8C-1654688023437)(en-resource://database/1940:1)]
纠正一下图片:静态变量和方法的确在一个空间内,只不过不是在堆内存,而是在方法区:调用的时候与堆内存开辟的地址没关系,因为使用的是类名称调用的,指向的是方法区,所以与实体对象的地址空间没关系。【见2.3】

如果一个成员变量使用了static关键字,那么这个变量不再属于自己,而是属于所在的类。也就是对个对象共享同一个数据。

结果:
用类名称来调用静态变量和静态方法,就很好区分static了,因为不管再多实体对象,使用静态变量和静态方法时,都用的是一个类名称在调用。(即使对象名称调用可以被转化为类名称调用,但为什么不在使用的时候用简洁一点的呢)
例子:

public class Student {

    //用堆空间地址很好理解static变量,表示其空间内有单独的一个地址,所有实体都连的同一个地址。
    //迁移:static类似于纵横所有实体化对象的一个全局变量。
    private static int idCounter = 0;
    private int id;//学号
    private String name;//姓名
    private int age;//年龄、
    static String room;//所在教室
    //学号计数器,每当new了一个新对象的时候,计数器++。

    public Student() {//谁先实体化谁就先+1.
        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 {//Field 内属性

    public static void main(String[] args) {

        Student one = new Student("郭靖",19);//实体化成功,ID指针+1。
        one.room = "101";
        System.out.println("姓名:" + one.getName() + ",学号:" + one.getId() + ",年龄:" + one.getAge()+ ",教室:" + one.room);

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

静态方法:一旦使用static修饰成员方法,那么就成为了静态方法。静态方法不属于对象,而是属于类的。

如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它。

无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用。
静态变量格式:类名称.静态变量
静态方法格式:类名称.静态方法()

注意事项:

  1. 非静态可以支持直接访问静态,静态却不能支持直接访问非静态。【重点】
    原因:内存当中【先】有的静态内容,【后】有的非静态内容。
    古人不知道后人,后人却知道古人。
  2. 静态方法当中不能用this关键字。
    原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。
    但this与静态方法没关系,因为它根本就不用类名称;静态方法被调用的时候是类名称,而不是实体对象。

例子:

public class MyClass {


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


    //这是成员方法
    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);

        //静态方法当中不能用this关键字。
//        System.out.println(this);
    }
}
public class Demo02StaticMethod {
    public static void main(String[] args) {
        MyClass obj = new MyClass();//首先实体化(创建对象)
        //然后使用功能(没有static关键字的方法——成员方法)


        //对于静态方法,即可以通过对象进行调用,也可以通过类名称进行调用。
        //实体化对象使用静态方法没有提示。
        obj.methodStatic();//正确,不推荐,因为会让你误以为是成员方法。
        //这样的写法在编译过后,也会被翻译成了’类名称.静态方法‘。

        //调用静态方法
        MyClass.methodStatic();//正确,推荐,为了好区分,用类名调用最好。
        //调用成员方法
        obj.method();

        //对于本类当中的静态方法,可以省略类名称。
        myMethod();
        Demo02StaticMethod.myMethod();//完全等效。也就是说这才是本来的格式。
    }
    //【提问】成员方法没法在本类里被访问吗?也对,如果能被访问,为何叫成员方法呢,直接用静态方法就行。
    // 成员XX可能就是为了实体对象而存在。这就很好理解静态方法不支持直接访问非静态变量了。
    //但成员方法可以访问静态变量。
    public static void myMethod(){
        System.out.println("这是一个自己的方法~");
    }

}

2.3 静态原理图解

在这里插入图片描述

2.4 静态代码块

static还有一种用法:静态代码块。
静态代码块格式:
public class 类名称{ //在类中使用
static{
//静态代码块的内容
}
}
特点:当第一次用到本类时,静态代码块执行唯一的一次(只执行一次)。【重点】
静态内容总是优先与非静态:所以静态代码块会比构造方法语句先执行。【题外话:因为的因为是什么?】

静态代码块的典型用途:
用来一次性的对静态成员变量进行赋值。 后面要学的JDDC内容会用到。

静态代码块:定义在成员位置,使用static修饰的代码块{ }。
位置:类中方法外。

执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行。

例子:

public class Person {
    public Person(){ //没有静态语句,连void也没有的就是构造方法,用于实体对象实体化的方法。
        System.out.println("构造方法执行!");//实体化调用构造方法时执行。
    }

    //看来是静态代码块先执行。
    static{
        System.out.println("静态代码块执行!");
    }
}
public class Demo04Static {
    public static void main(String[] args) {

        Person one = new Person();
        Person two = new Person();
//        静态代码块执行!
//        构造方法执行!
//        构造方法执行!
    }
}

3. Array类

3.1 概述

java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单。

3.2 Arrays类操作数组的方法(功能)

java,util.Arrays是一个与数组有关的工具类,里面提供了大量的静态方法,用来实现数组常见的操作。

public static String toString(数组);将参数数组变成字符串(按照默认格式:[元素1,元素2,元素3…]
//为什么字符变成字符串直接是字符?如:{‘a’, ‘b’, ‘c’} --> abc
public static void sort(数组);按照默认升序(从小到大)对数组进行排序。

注意事项:

  1. 如果是数值:sort默认按照升序从小到大。
  2. 如果是字符串,sort默认按照字母升序。
  3. 如果是自定义类型,那么这个自定义的类需要有Comparable或者Comparator接口的支持。(今后学)

例子:

import java.util.Arrays;
public class Demo01Arrays {
    public static void main(String[] args) {
        int[] intArray = {1, 2, 3};
        char[] charArray = {'a', 'b', 'c'};
        //将int数组按照默认格式变成字符串
        String intStr = Arrays.toString(intArray);
        System.out.println(intStr);//[1, 2, 3]
        String charStr = Arrays.toString(charArray);
        System.out.println(charArray);//abc 【提问】 默认格式?有点意思!


        int[] array1 = {91, 20, -5, 6,};
        Arrays.sort(array1);//居然直接在原数组中排序,【题外话:字符串是一个常量,不能改变】
        System.out.println(Arrays.toString(array1));//[-5, 6, 20, 91]

        String[] array2 ={"cc", "bb", "aa"};
        Arrays.sort(array2);
        System.out.println(Arrays.toString(array2));//[aa, bb, cc]
    }
}

3.3 练习

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

import java.util.Arrays;
public class Demo02ArraysPractice {
    public static void main(String[] args) {

        String str = new String();//可以直接实体化对象并赋值
        str = "aflksjgidfjiogkngnvsfhnbg";

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

        //for循环倒叙快捷键:XXX.forr
        for (int i = chars.length - 1; i >=0 ; i--) {
//            System.out.print(chars[i]);
            System.out.print(chars[i]);
        }
    }
}

4. Math类

4.1 概述

java.lang.Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。

4.2 基本运算方法

java.lang.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作。

public static double abs(double num);获取绝对值。//有多种重载
public static double ceil(double num);向上区整。12.1 --> 13
public static double floor(double num);向下区整。69.9 --> 69
public static long round(double num);四舍五入。12.1 --> 12 , 12.5 --> 13

Math.PI代表近似的圆周率常量(double)。

例子:

public class Demo03Math {
    public static void main(String[] args) {
        //1. 获取绝对值 abs()
        System.out.println(Math.abs(-3));//3
        System.out.println("------------------");

        //2. 向上取整 运箱子,21个,每次10个
        System.out.println(Math.ceil(3.9));//4.0
        System.out.println(Math.ceil(2.001));//3.0

        //3. 向下区整 超市:零头 128.36
        System.out.println(Math.floor(69));//69.0
        System.out.println(Math.floor(69.9));//69.0

        //4. 四舍五入
        System.out.println(Math.round(34.4));//34
        System.out.println(Math.round(34.5));//35
    }
}

4.3 Math类的练习

题目:
计算在-10.8到5.9之间,绝对值大于6或者小于2.1的整数有多少?

思路:

  1. 既然已经确定了范围,for循环
  2. 起点位置-10.8应该转换成为-10,两种办法:
    1. 用Math.ceil()方法,向上取整。
    2. 强转成为int,自动舍弃所有小数位。
  3. 如何拿到绝对值:Math.abs();
  4. 一旦发现一个数组。需要让计数器++进行统计
public class Demo04MathPractice {
    public static void main(String[] args) {


//        System.out.println(Math.floor(-10.8));//负数向下取整不行
        int num = 0;

        //可以直接用强转  【double值也是可以进行< > 或++等等的】
        for(double i = Math.ceil(-10.8); i <= Math.floor(5.9); i++){
            if(Math.abs(i) > 6 || Math.abs(i) < 2.1){
                int a = (int)i;
                System.out.print(a + ",");
                num++;
            }
        }
        System.out.println("\n" + "符合要求的整数共有" + num + "个");
    }
}
                                                                                 ——此文档为学习笔记!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值