Java-String类&集合ArrayList

时间:2021-06-07 01:08:35

java.lang.String类代表字符串。 Java程序中所有字符串文字都为此类的对象。

注意:String类首字母大写,类的首字母都大写。

  • 以"xx"形式给出的字符串对象,在字符常量池中存储。
  • 字符串类型,可以定义字符串变量指向字符串对象。
  • string变量每次的修改都是产生并指向了新的字符串对象。
  • 原来的字符串对象都是没有改变的,所以称不可变字符串。

创建字符串

方法一:直接使用""创建

String name = "张三";

方法二:使用String()构造器

String name = new String(); 使用字符数组:String name = new String(char[] c);

char[] chars={'你','好','世','界'};
String str=new String(chars);
System.out.println(str);//你好世界

使用字节数组:String name = new String(byte[] c);

byte[] bytes = {65, 66, 'C', 'C' + 1};
String str = new String(bytes);
System.out.println(str);//ABCD

两种创造方式的区别

  • ""方式给出的字符串对象,在字符串常量池中储存,而且相同内容只会在其中存储一份。
  • 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中。

Java-String类&集合ArrayList

举个例子

//创建了两个对象
String s1 = new String("abc");
//创建了0个对象
String s2 = "abc";
//输出false
System.out.println(s1 == s2);

第一行代码,分别在字符串常量池和堆区创建了一个"abc"对象。 第二行代码,指向了字符串常量池中已有的"abc"对象。 第三行代码,两个String对象存储的地址不一样,输出false

Java存在编译优化机制

String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
String s4 = "ab" + "c";
//false
System.out.println(s1 == s3);
//true
System.out.println(s1 == s4);

程序在编译阶段,"ab"+"c"会直接转成"abc"。

字符串内容比较

直接使用==会出现问题

直接使用==对比的是字符串对象存储的地址。

//正确的用户名密码
String name = "name";
String password = "password";
//用户输入用户名密码
Scanner sc = new Scanner(System.in);
String tmpname = sc.next();
String tmppsword = sc.next();
//判断用户输入是否正确
System.out.println(name == tmpname);//false
System.out.println(password == tmppsword);//false

比较内容要用.equals()方法。

//正确的用户名密码
String name = "name";
String password = "password";
//用户输入用户名密码
Scanner sc = new Scanner(System.in);
String tmpname = sc.next();
String tmppsword = sc.next();
//判断用户输入是否正确
System.out.println(name.equals(tmpname));
System.out.println(password.equals(tmppsword));

.equalsIgnoreCase()可以忽略大小写比较,常用于对比验证码。

常用API

Java-String类&集合ArrayList

通过.lenth()和.charAt()遍历字符串

获取字符串长度

.lenth()

获取某个索引位置处的字符

.charAt()

String str="你好世界";
for (int i=0;i<str.length();i++)
{
    System.out.println(str.charAt(i));
}

将字符串转化为字符数组

Java中字符数组可以直接输出,也可以用下标访问输出。

String str = "你好世界";
char[] chars = str.toCharArray();
System.out.println(chars);
for (int i = 0; i < str.length(); i++) {
    System.out.println(chars[i]);
}

截取内容,包前不包后

很多语言的方法,用到区间时,都是:包前不包后

String str = "Java是世界上最好的编程语言";
//Java
System.out.println(str.substring(0,4));
char[] chars=str.substring(4).toCharArray();
//是世界上最好的编程语言
System.out.println(chars);

替换关键词

String str = "金三胖是最厉害的,金三胖胖胖的,我好喜欢金三胖";
String str1 = str.replace("金三胖", "XX");
System.out.println(str1);

判断是否包含关键词

String str = "金三胖是最厉害的,金三胖胖胖的,我好喜欢金三胖";
System.out.println(str.contains("金三胖"));//true

判断以什么开始

String str = "金三胖是最厉害的,金三胖胖胖的,我好喜欢金三胖";
System.out.println(str.startsWith("金三胖"));//true
System.out.println(str.startsWith("金二胖"));//false

分割字符串,以字符串数组返回

String name = "kunkun,蔡徐坤,ikun";
String[] names = name.split(",");
for (String str : names) {
    System.out.println(str);
}

String案例

验证码

  • 定义一个String类型的变量,存储a-z,A-Z,0-9之间的全部字符。
  • 循环五次,随机一个范围内的索引,获取对应字符连接起来即可。
//定义可能出现的字符信息
String datas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//循环五次,每次生成一个随机的索引,提取对应的字符连接起来
String code = "";
Random rd = new Random();
for (int i = 0; i < 5; i++) {
    //随机一个索引
    int index = rd.nextInt(datas.length());
    code += datas.charAt(index);
}
//输出字符串变量
System.out.println(code);

模拟用户登录功能

  • 系统后台定义好正确的登录名称、密码。
  • 使用循环控制三次,让用户输入正确的登录名和密码,判断是否登录成功,登陆成功则不再进行登录,登陆失败则给出提示,并让用户继续登录。
//定义正确的用户名密码
String okLoginName = "Caixukun";
String okPassword = "ctraplq";
//定义一个循环,让用户登录
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
    System.out.println("请输入用户名");
    String loginName = sc.next();
    System.out.println("请输入密码");
    String password = sc.next();
    //判断登陆是否成功
    if (loginName.equals(okLoginName)) {
        //判断密码是否正确
        if (password.equals(okPassword)) {
            System.out.println("登陆成功");
            break;
        } else
            System.out.println("密码错误,还剩" + (3 - i) + "次机会");
    } else
        System.out.println("用户名错误");
}

手机号码屏蔽

以字符串形式从键盘接受一个手机号,将中间四位号码屏蔽,最终效果为: 183****3572 分析:

  1. 键盘录入一个字符串。
  2. 截取字符串前三位,截取字符串后四位。
  3. 将截取后的两个字符串,中间加上****进行拼接,输出结果即可。
//键盘录入一个手机号码
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机号码");
String tel = sc.next();
//截取代码前三位、后四位
String before = tel.substring(0, 3);
String after = tel.substring(7);
String s = before + "****" + after;
System.out.println(s);

集合ArrayList

集合与数组类似,是一种容器,用于装数据。 数组的特点:

  • 数组定义完成并启动后,类型确定,长度固定。
  • 问题:在个数不确定,且要进行增删数据操作时,数组是不太合适的。

集合的特点:

  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
  • 集合非常适合做元素个数不确定,且要进行增删操作的业务场景。
  • 集合提供了许多丰富好用的功能,而数组的功能很单一。

ArrayList集合的对象添加与获取

ArrayList是集合的一种,它支持索引。 .add()返回值为boolean,一般不会添加失败,因此我们一般不会注意它的返回值。 System.out.println(list);会直接输出集合内容,而不是地址

//创建ArrayList集合对象
ArrayList list = new ArrayList();
//添加数据
list.add("java");
list.add(1);
list.add(2.5);
list.add(false);
System.out.println(list.add('可'));
System.out.println(list);//[java, 1, 2.5, false, 可]
//在指定索引位置插入元素
list.add(1, "插入");
System.out.println(list);//[java, 插入, 1, 2.5, false, 可]

泛型概述

ArrayList<E>就是一个泛型,可以在编译阶段约束集合对象,只能操作某种数据类型。 使用泛型:<数据类型> 举例:

  • ArrayList<String>:此集合只能操作字符串类型的元素。
  • ArrayList<Integer>:此集合只能操作整数类型的元素。

注意:集合中只能存储引用类型,不支持基本数据类型。ArrayList<Integer>不能填<int>。 代码规范:使用泛型来定义和使用集合

ArrayList<String> list = new ArrayList<String>();
//JDK1.7开始,泛型后面的类型声明可以不写
ArrayList<String> list1 = new ArrayList<>();
//使用Object存储所有数据类型
ArrayList<Object> list2 = new ArrayList<>();

ArrayList常用API、遍历

  • .get()//获取某个索引位置处的元素值
  • .size()//获取集合大小
  • .remove()//删除某个索引位置处的值,并返回被删除的值
  • .set()//修改某个索引位置的值,会返回修改前的值
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
list.add(4);
list.add(6);
list.add(2);
//获取某个索引位置处的元素值
System.out.println(list.get(1));
//获取集合大小
System.out.println(list.size());
//完成集合的遍历
for (int i = 0; i < list.size(); i++) {
    System.out.print(list.get(i) + " ");
}
//删除某个索引位置处的值,并返回被删除的值
System.out.println("\n" + list.remove(1));
System.out.println(list);
//直接删除元素值,删除成功返回true,失败返回false
//需要使用Integer,否则是删除索引
System.out.println(list.remove((Integer) 2));
System.out.println(list);
//修改某个索引位置的值,会返回修改前的值
System.out.println(list.set(0, 2));
System.out.println(list);

ArrayList存储自定义数据类型的对象

Java-String类&集合ArrayList

Movie m1 = new Movie("流浪地球", 9.0, "吴京");
//创建一个Movie类型的ArrayList,存储电影对象
ArrayList<Movie> arrayList = new ArrayList<>();
arrayList.add(m1);
arrayList.add(new Movie("熊出没", 9.9, "光头强"));
//遍历每一个对象,访问信息
//直接输出自定义数据类型,结果是地址
System.out.println(arrayList);
for (int i = 0; i < arrayList.size(); i++) {
    System.out.println(arrayList.get(i).getName() + " " + arrayList.get(i).getScore() + " " + arrayList.get(i).getActor());
}

Movie类文件:

public class Movie {
    private String name;
    private double score;
    private String actor;

    public Movie(String name, double score, String actor) {
        this.name = name;
        this.score = score;
        this.actor = actor;
    }

    public String getName() {
        return name;
    }

    public double getScore() {
        return score;
    }

    public String getActor() {
        return actor;
    }
}

学生信息系统的数据搜索

需求:

  • 后台程序需要存储学生信息并展示,然后要提供按照学号搜索的功能。

分析:

  • 定义Student类,定义ArrayList存储学生对象信息,并遍历展示出来。
  • 提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息,并展示。
  • 使用死循环,让用户可以不停的搜索。

Student类

public class Student {
    private String studyNumber;
    private String name;
    private int age;

    public Student(String studyNumber, String name, int age) {
        this.studyNumber = studyNumber;
        this.name = name;
        this.age = age;
    }

    public String getStudyNumber() {
        return studyNumber;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Main类

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //创建集合存储学生对象,创建学生对象封装学生信息
        ArrayList<Student> studentArrayList = new ArrayList<>();
        studentArrayList.add(new Student("001", "张三", 10));
        studentArrayList.add(new Student("002", "李四", 12));
        studentArrayList.add(new Student("003", "王五", 11));
        //遍历学生信息展示
        for (int i = 0; i < studentArrayList.size(); i++) {
            Student tmp = studentArrayList.get(i);
            System.out.println(tmp.getStudyNumber() + "\t" + tmp.getName() + "\t" + tmp.getAge());
        }
        //定义方法,完成按照学号搜索的功能
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入学号");
            String studyNumber = sc.next();
            //调用方法查询
            Student student = getStudentById(studentArrayList, studyNumber);
            if (student == null) {
                System.out.println("查无此人");
            } else System.out.println(student.getStudyNumber() + "\t" + student.getName() + "\t" + student.getAge());
        }
    }

    /**
     * 根据学生学号,查询学生对象返回
     *
     * @param a             存储全部学生对象的集合
     * @param studentNumber 搜索的学生的学号
     * @return 学生对象 | null
     */
    public static Student getStudentById(ArrayList<Student> a, String studentNumber) {
        //遍历全部学生对象
        for (int i = 0; i < a.size(); i++) {
            //询问当前遍历的这个学生对象的学号,是否是我们要找的学号
            Student s = a.get(i);
            if (s.getStudyNumber().equals(studentNumber)) {
                //找到了
                return s;
            }
        }
        //没找到
        return null;
    }
}