一、String类

1.1 String类概述

概述

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

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

特点

1.字符串内容永不可变

  1. 因为String对象是不可变的,所以它们可以被共享

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

1.2 构造和创建字符串

创建字符串的常见3+1种方法。

三种构造方法:

public String(): 创建一个空白字符串,不含有任何内容。

public String(char[] array):通过当前参数中的字符数组来构造新 的String

public String(byte[] array):通过使用平台的默认字符集解码当前 参数中的字节数组来构造新的 String

举例:

  1. //无参构造
  2. String str = new String();
  3. // 通过字符数组构造
  4. char chars[] = {'a', 'b', 'c'};
  5. String str2 = new String(chars);
  6. // 通过字节数组构造
  7. byte bytes[] = { 97, 98, 99 }; String str3 = new String(bytes)//a b c

一种直接创建 -> 注意:直接写上双引号,就是字符串对象(系统自动new)

String str="Hello";

内存中的字符串常量

//字符串常量池:程序中直接写上双引号的字符串,就在字符串常量池中。
//对于基本类型来说,==是对数值的比较
//对于引用类型来说,==是对内存地址的比较。->所以str1 == str2的结果是false
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
  • 双引号直接写的字符串数组在常量池当中,new的在堆中
  • 字符串常量内容一样时共用一个内存地址
  • 使用new方法后,字符串数组转换为一个byte数组

1.3常用方法

判断功能的方法

  • public boolean equals (Object anObject) :将此字符串与指定对象进行比较。
  • public boolean equalsIgnoreCase (String anotherString) :将此字符串与指定对象进行比较,忽略大小 写 ```java /* == 是进行对象地址值的比较,如果比较的是字符串内容则使用:

public boolean equals(Object obj):参数可以是任何对象,只有参数是一个字符串 并且内容相同才会得到true; public boolean equalsIgnoreCase(Object obj):忽略大小写的比较

注意事项: 1.任何对象都能用Object进行接收。 2.equals方法具有对称性,也就是a.equals(b)和b.equals(a)是一样的 3.如果比较双方一个是常量一个是变量,推荐吧常量字符串写在前面: 推荐:”abc”.equals(str); 不推荐:str.equals(“abc”); 如果str是null值,则不推荐的方法会报错 */ public class Demo01string { 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("hello".equals(str1));//false

    //equalsIgnoreCase方法->忽略大小写

System.out.println(“hello”.equalsIgnoreCase(str1));//true } }

> Object 是” 对象”的意思,也是一种引用类型。作为参数类型,表示任意对象都可以传递到方法中。


<a name="20a9e97c"></a>
#### 获取功能的方法

String当中与获取相关的常用方法:

`public int length()`:获取字符串当中含有字符个数,字符串长度<br />`public String concat(String str)`:将当前字符串和参数字符串拼接<br />`public char charAt(int index)`:索引指定位置单个字符<br />`public int indexOf(String str)`:查找参数字符串在本字符串首次出现的位置,如果没有返回-1

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

        //拼接字符串
        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,新的字符串

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

        //查找参数字符串在本字符串首次出现的位置
        String original="HelloWorld";
        int index=original.indexOf("llo");
        System.out.println("llo在Helloworld中的位置:"+index); //2
        System.out.println(original.indexOf("abc"));//-1

        //截取字符串
        String str4="HelloWorld";
        String str5=str4.substring(5);
        System.out.println(str5);//World
        System.out.println(str4.substring(1,6));//elloW ->不包含6号位置'o'
    }
}

注意:

String strA="Hello";
System.out.println(strA);//Hello
strA="Java";
System.out.println(strA);//Java

//下面这种写法字符串内容没有改变
//strA中保存的是地址值
//本来是“Hello”的地址值换成了“Java”的地址值

转换功能的方法

  • public char[] toCharArray():将当前字符串拆分为字符串数组作为返回值
  • public byte[] getBytes():获得当前字符串底层的字节数组
  • public String replace(CharSequence oldString,CharSequence newString):
    将所有出现的老字符串替换为新的字符串,返回替换之后的结果新字符串
    备注:CharSequence意思就是可以接受字符串类型
public class Demo03StringConvert {
    public static void main(String[] args) {
        //转换为字符数组
        char[] chars="Hello".toCharArray();
        System.out.println(chars[0]);//H
        System.out.println(chars.length);//5

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

        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*?
    }
}

分割功能的方法

public String[] split(String regex):按照参数的规则,将字符串切分成为若干部分

public class Demo04StringSplit {
    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]);
            // aaa   bbb   ccc
        }
    }
}
//注意,这里的分割标准 regex是正则表达式,要避免正则表达式中的特殊字符
//例如   "." -> "\\." 
//也可用正则表达式分割更多不一样的字符

public String substring(int beginIndex, int endIndex)裁剪字符串

二、Static关键字

2.1 概述

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

2.2 定义和使用格式

类变量

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

定义格式

static 数据类型 变量名;

static int numberID;

例子:创建一个班级类,创建一个类变量numberOfStudent来记录学生个数,并且根据类变量来创建学生学号 sid

public class Student{
    private String name;
    private int age;
    //学生的id
    private int sid;
    //类变量,记录学生数量,分配学号
    public static int numberOfStudent =0;

    public Student(String name,int age){
        this.name=name;
        this.age=age;
        //通过numberOfStudent 给学生分配学号
        this.sid= ++numberOfStudent;
    }

    //打印属性值
    public void show(){
        System.out.println("Student: name="+name+",age="+age+",sid="+sid);
    }
}
public class StuDemo{
    public static void main(String[] args){
        Student s1=new Student("张三",23);
        Student s2 = new Student("李四", 24);                             Student s3 = new Student("王五", 25);                             Student s4 = new Student("赵六", 26);                               s1.show(); // Student : name=张三, age=23, sid=1                     s2.show(); // Student : name=李四, age=24, sid=2                     s3.show(); // Student : name=王五, age=25, sid=3                     s4.show(); // Student : name=赵六, age=26, sid=4
    }
}

静态方法

当static修饰成员方法时,该方法成为类方法。静态方法在声明中有static,建议使用类名来调用,而不需要创建类的对象

定义格式:

修饰符 static 返回值类型 方法名(参数列表){
        //执行语句
}

public static void showNum(){
    System.out.println("num:"+ numberOfStudent);
}

注意事项
  • 静态方法可以直接访问类变量和静态方法
  • 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法
  • 静态方法中,不能使用this关键字

小贴士:静态方法只能访问静态成员。 静态方法不能访问非静态成员->因为在内存当中【先】有的静态内容,【后】有的非静态内容

调用格式

被static修饰的成员可以并且建议通过类名直接访问。虽然也可以通过对象名访问静态成员,原因即多个对象均属 于一个类,共享使用同一个静态成员,但是不建议,会出现警告信息

//访问类变量
类名.类变量名;

//调用静态方法
类名.静态方法名(参数);

public class StuDemo2{
    public static void main(String[] args){
        //访问类变量
        System.out.println(Student.numberOfStudent);
        //调用静态方法
        Student.showNum();
        //不new对象通过类名调用(强烈推荐)
    }
}

2.3 静态原理图解

方法区中有一个独立的空间静态区,静态方法储存在这里。

注意:类名称访问静态成员的时候,全场和new的对象没关系,只和类有关系

2.4 静态代码块

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

特点:

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

格式:

public class ClassName(){
    static{
        //执行语句;
    }
}

public class Game {   
    public static int number;                                          public static ArrayList<String> list;     
    static {     
        // 给类变量赋值     
        number = 2;     
        list = new ArrayList<String>();     
        // 添加元素到集合中     
        list.add("张三");     
        list.add("李四");   
    } 
}

用途:用来一次性地对静态成员变量进行赋值。

三、Arrays类

3.1 概述

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

比如排序搜索等。其所有方法均为静态方法,调用起来非常简单

3.2 操作数组的方法

  • public static String toString(int[] a) :返回指定数组内容的字符串表示形式

    public static void main(String[] args){
      //定义int 数组
      int[] arr = {1,23,45,56,755,56};
      //打印数组,输出地址值
      System.out.println(arr);//0x666
    
      //数组内容转为字符串
      String s= Arrays.toString(arr);
      //打印字符串,输出内容
      System.out.println(s);//[1,23,45,56,755,56]
    }
    
  • public static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序

public static void main(String[] args) {
     // 定义int 数组
    int[] arr  =  {24, 7, 5, 48, 4, 46, 35, 11, 6, 2};                  System.out.println("排序前:"+ Arrays.toString(arr)); 
    // 排序前:[24, 7, 5, 48, 4, 46, 35, 11, 6,  2]

    // 升序排序   
    Arrays.sort(arr);   
    System.out.println("排序后:"+ Arrays.toString(arr));
    // 排序后:[2, 4, 5, 6, 7, 11, 24, 35, 46,  48] 
}

PS:如果是数组。sort默认从小到大升序 如果是字符串,sort默认字母升序 如果是自定义的类型,那么这个自定义的类需要有Comparable或者Comparator接口的支持

练习题:

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

import java.util.Arrays;

//生成随机字符串,升序排序后,倒叙打印
public class Demo01sort {
    public static void main(String[] args) {
        //定义一个随机字符串
        String line="aglkalafaadwefga";
        //转换为字符串数组
        char[] arr=line.toCharArray();

        //升序排序(静态方法直接调用)
        Arrays.sort(arr);
        System.out.println("升序排序结果:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }

        //倒叙打印
        System.out.println();
        System.out.println("倒叙打印:");
        for (int i = arr.length-1; i>=0 ; i--) {
            System.out.print(arr[i]+" ");
        }
    }
}

四、Math类

4.1 概述

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

4.2 基本的运算方法

  • public static double abs(double num):获取绝对值

    double d1 = Math.abs(‐5); //d1的值为5
    double d2 = Math.abs(5); //d2的值为5
    
  • public static double ceil(double num):向上取整

    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(Math.ceil(-3.3));//-3.0
    
  • public static double floor(double num):向下取整

    System.out.println(Math.floor(3.9));//3.0
    System.out.println(Math.floor(-3.3));//-4.0
    System.out.println(Math.floor(5.1));//5.0
    
  • public static double round(double num):四舍五入

long d2 = Math.round(5.4); //d2的值为5.0
long d2 = Math.round(5.5); //d2的值为6.0

4.3 练习题

请使用 Math 相关的API,计算在 -10.8 到 5.9 之间,绝对值大于 6 或者小于 2.1 的整数有多少个

//利用Math相关的API,计算-10.8到5.9之间,
// 绝对值大于6或者小于2.1的整数有多少个
public class Mathtest {
    public static void main(String[] args) {
        //定义最小值
        double min=-10.8;
        //定义最大值
        double max=5.9;
        //定义变量次数
        int count=0;
        //范围内循环
        for(double i=Math.ceil(min);i<=max;i++)
        {
            //获取绝对值并判断
            if(Math.abs(i)>6 || Math.abs(i)<2.1)
            {
                //计数
                count++;
            }
        }
        System.out.println("个数为:"+count+"个");
    }
}