Java中String类-ArrayList集合-常用API

导读:本篇文章讲解 Java中String类-ArrayList集合-常用API,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

String-ArrayList

String类

API (Application Programming Interface,应用程序编程接口):

  • Java写好的技术(功能代码),咱们可以直接调用。
  • Oracle 也为Java提供的这些功能代码提供了相应的 API文档(技术使用说明书) 。

JavaAPI文档: http://www.oracle.com/technetwork/java/javase/downloads/index.html

学习目标 :

  • String定义变量存储字符串: 需要知道如何创建字符串对象,并使用String定义变量指向该字符串对象。
  • String的内存原理: 字符串对象在内存中的原理是什么样。能够解决一些字符串常见面试题
  • String类提供了哪些API: 够说出并使用String类提供的操作字符串的功能:遍历、替换、截取、相等,包含…
  • String解决实际案例: 能够利用String的常用API去解决实际场景的业务需求,真正做到学以致用

String类的介绍

String 概述 :

  • java.lang.String 类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串。
  • Java 程序中的所有字符串文字(例如“abc”)都为此类的对象。
String name = "chenyq";
String address = "成都市";

String类的特点:

  • String其实常被称为不可变字符串类型,它的对象在创建后不能被更改。

从下面代码可以看出字符串变量str指向的字符串对象值已经改变,那为何还说字符串不可变呢?

public static void main(String[] args) {
		String str = "aaa";
		str += "bbb";
		str += "ccc";
		System.out.println(str); // aaabbbccc
}
  • 这是因为以“”方式给出的字符串对象,在字符串常量池中存储。
  • 每次字符串相加后, 会形成一个新的字符串对象, 而str这个变量保存的地址会指向新的字符串对象, 原来的字符串并没有改变

小结 :

  • String变量每次的修改其实都是产生并指向了新的字符串对象。
  • 原来的字符串对象都是没有改变的,所以称不可变字符串。

String创建方式

创建字符串对象的2种方式 :

  • 方式一:直接使用“”得到一个字符串对象定义。(推荐方式)
String name = "chenyq";
  • 方式二:通过String类的构造器创建对象。
构造器 说明
public String() 创建一个空白字符串对象,不含有任何内容
public String(String original) 根据传入的字符串内容,来创建字符串对象
public String(char[] chs) 根据字符数组的内容,来创建字符串对象
public String(byte[] chs) 根据字节数组的内容,来创建字符串对象

演示代码 :

public static void main(String[] args) {

    // 1.创建一个空白字符串对象(了解 几乎不用)
    String str1 = new String();
    System.out.println(str1);

    // 2.根据字符串内容创建对象(了解 几乎不用)
    String str2 = new String("你好 Java");
    System.out.println(str2); // 你好 Java

    // 3.根据字符数组, 创建字符串
    char[] charArr = {'你', '好', 'j', 'a', 'v', 'a'};
    String str3 = new String(charArr);
    System.out.println(str3); // 你好java

    // 4.根据字节数组, 创建字符串
    byte[] byteArr = {97, 98, 99, 100};
    String str4 = new String(byteArr);
    System.out.println(str4); // abcd
}

两种方式创建字符串有什么区别吗?

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

String常用API

1.字符串比较

字符串的内容比较不适合用“==”比较。

  • 为什么这么说呢, 我们来看下面这样一个案例, 定义一个用户名, 再让用户输入一个用户名, 比较是否相等
public static void main(String[] args) {
    // 1.定义的用户名
    String rightName = "chenyq";

    Scanner sc = new Scanner(System.in);
    System.out.println("请输入用户名");
    // 2.拿到用户输入的用户名
    String inputName = sc.next();

    // 3.判断用户名是否一致
    System.out.println(rightName == inputName); // false
}
  • 我们会发现, 即使用户输入”chenyq”, 判断的值也是false, 这是因为 “==” 比较会去比较地址
  • 因此字符串的比较, 并不适合使用 “==” 比较

字符串的内容比较

  • 推荐使用String类提供的 equals 比较:只关心内容一样即可
方法名 说明
public boolean equals (Object anObject) 将此字符串与指定对象进行比较。只关心字符内容是否一致!
public boolean equalsIgnoreCase (String anotherString) 将此字符串与指定对象进行比较,忽略大小写比较字符串。只关心字符内容是否一致!

使用方法:

  • 要比较的字符串.equals(被比较的字符串)
  • 要比较的字符串.equalsIgnoreCase(被比较的字符串)

演示代码 :

  • 将上面例子中的判断, 修改为equals方法比较
System.out.println(rightName.equals(inputName));
  • 如果我们想要忽略大小写, 那么可以使用equalsIgnoreCase方法比较
System.out.println(rightName.equalsIgnoreCase(inputName));

2.其他常用API

String的常用API如下 :

获取字符串长度 :

  • 方法 public int length() : 返回此字符串的长度

  • 使用方法: str.length()

public static void main(String[] args) {
    String info = "Hello Java";
    // 返回字符串的长度
    System.out.println(info.length()); // 10
}

根据索引返回字符 :

  • 方法 public char charAt(int index) : 获取某个索引位置处的字符

  • 使用方法: str.charAt(index)

public static void main(String[] args) {
    String info = "Hello Java";
    // 获取某个索引处的字符
    System.out.println(info.charAt(4)); // o
}

将字符串转换成字符数组 :

  • 方法 public char[] toCharArray() : 将当前字符串转换成字符数组返回

  • 使用方法: str.toCharArray();

public static void main(String[] args) {
    String info = "Hello Java";
    // 将字符串转换为字符数组返回
    char[] arr = info.toCharArray();
}

截取字符串 :

  • 方法 public String substring(int beginIndex, int endIndex) : 根据开始和结束索引进行截取,得到新的字符串(包前不包后)

  • 使用方法: str.substring(beginIndex, endIndex)

public static void main(String[] args) {
    String info = "Hello Java";
    // 截取字符串, 例如: 截取索引1到8的字符串
    System.out.println(info.substring(1, 8)); // ello Ja
}
  • 方法 public String substring(int beginIndex) : 从传入的索引处截取,截取到末尾,得到新的字符串

  • 使用方法: str.substring(index)

public static void main(String[] args) {
    String info = "Hello Java";
    // 截取字符串, 从某一索引位置截取到尾部
    System.out.println(info.substring(4)); // o Java
}

替换字符串 :

  • 方法 public String replace(CharSequence target, CharSequence replacement) : 使用新值,将字符串中的旧值替换,得到一个新的字符串

  • 使用方法: str.replace(oldValue, newValue)

public static void main(String[] args) {
    String info = "Hello Java";
    // 替换字符串中的某一字符
    System.out.println(info.replace('l', 'a')); // Heaao Java
    System.out.println(info.replace("Java", "JavaScript")); // Hello JavaScript      
}

分隔字符串返回数组 :

  • 方法 public String[] split(String regex) : 根据传入的规则切割字符串,得到字符串数组返回

  • 使用方法: str.split(regex)

public static void main(String[] args) {
    String info = "Hello Java";
    // 按照传入规则, 将字符串切割, 放入一个字符串数组
    // 例如: 以空格分隔
    String[] arr = info.split(" ");
}

字符串是否包含… :

  • 方法 public Boolean contains(CharSequence s) : 判断字符串中是否包含某个值

  • 使用方法: str.contains(value)

public static void main(String[] args) {
    String info = "Hello Java";
    // 判断是否包含某个值
    System.out.println(info.contains("aaa")); // false
    System.out.println(info.contains("ll")); // true
}

判断是否以…开头

  • 方法 public Boolean startsWith(String prefix) : 判断字符串中是否以某个值开头

  • 使用方法: str.startsWith(value)

public static void main(String[] args) {
    String info = "Hello Java";
    // 判断字符串是否以某个值开始
    System.out.println(info.startsWith("Hello")); // true
    System.out.println(info.startsWith("hello")); // false
}

ArrayList

ArrayList代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的。

通过创建ArrayList的对象表示得到一个集合容器,同时ArrayList提供了比数组更好用,更丰富的API (功能)给程序员使用

学习目标 :

  • ArrayList集合如何创建对象: 要知道如何利用ArrayList创建对象代表集合容器来存放数据。
  • ArrayList常用API: 能够说出并使用ArrayList类提供的丰富的元素操作的功能:添加、获取、删除、修改等功能
  • ArrayList存储自定义对象: 能够使用ArrayList存储自定义的对象,并清楚ArrayList集合存储对象的底层原理
  • ArrayList解决实际问题: 能够使用ArrayList存储对象,并完成数据搜索,删除等常见业务需求

ArrayList集合

什么是集合?

  • 集合是与数组类似,也是一种容器,用于装数据的

数组的特点:

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

集合的特点:

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

ArrayList集合

  • ArrayList是集合中的一种,它支持索引。 (暂时先学习这个,后续会讲解整个集合体系)

ArrayList集合的对象获取:

构造器 说明
public ArrayList() 创建一个空的集合对象
  • 使用方法: ArrayList 名称 = new ArrayList
public static void main(String[] args) {
    ArrayList list = new ArrayList();
}

ArrayList集合添加元素的方法:

方法名 说明
public boolean add(E e) 将指定的元素追加到此集合的末尾
public void add(int index,E element) 在此集合中的指定位置插入指定的元素
  • 可以添加任意类型的数据
public static void main(String[] args) {
    ArrayList list = new ArrayList();

		// 向集合添加不同类型的元素
    list.add("你好");
    list.add('你');
    list.add(123);
    list.add(false);
    list.add(18.0);

		System.out.println(list); // [你好, 你, 123, false, 18.0]
}
  • 可以向指定位置插入指定元素
public static void main(String[] args) {
    ArrayList list = new ArrayList();

    list.add("你好");
    list.add('你');
    list.add(123);
    list.add(false);
    list.add(18.0);

    System.out.println(list); // [你好, 你, 123, false, 18.0]

		// 向指定位置添加指定元素
    list.add(2, "aaaa");
    System.out.println(list); // [你好, 你, aaaa, 123, false, 18.0]
}

ArrayList对于泛型的支持

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

举例

  • ArrayList<String> :此集合只能操作字符串类型的元素。
  • ArrayList<Integer>:此集合只能操作整数类型的元素
public static void main(String[] args) {
    // ArrayList<String> list = new ArrayList<String>();
    // 泛型后面的类型声明可以不写
    ArrayList<String> list = new ArrayList();

    list.add("aaa");
    list.add("bbb");
    list.add("ccc");

    System.out.println(list); // [aaa, bbb, ccc]
}

注意:集合中只能存储引用类型,不支持基本数据类型。

  • 例如我们想要声明储存一系列整数, 我们需要声明为ArrayList<Integer>类型
public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList();

    list.add(111);
    list.add(222);
    list.add(333);

    System.out.println(list); // [111, 222, 333]
}

ArrayList常用API

根据索引返回元素 :

  • 方法 public E get(int index) : 返回指定索引处的元素
  • 使用方法: list.get(index)
public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList();

    list.add(111);
    list.add(222);
    list.add(333);

    // 根据索引返回元素
    System.out.println(list.get(2)); // 333
}

返回集合的个数 :

  • 方法 public int size() : 返回集合中的元素的个数
  • 使用方法: list.size()
public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList();

    list.add(111);
    list.add(222);
    list.add(333);

    // 返回集合中元素的个数
    System.out.println(list.size()); // 3
}

删除指定索引处元素 :

  • 方法 public E remove(int index) : 删除指定索引处的元素,返回被删除的元素
  • 使用方法: list.remove(index)
public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList();

    list.add(111);
    list.add(222);
    list.add(333);

    // 删除指定索引处的元素, 返回被删除的元素
    System.out.println(list.remove(2)); // 333

    System.out.println(list); // [111, 222]
}

删除指定的元素 :

  • 方法 public boolean remove(Object o) : 删除指定的元素,返回删除是否成功, 如果要删除的元素有多个, 只会删除第一个
  • 使用方法: list.remove(Object)
public static void main(String[] args) {
    ArrayList<String> list = new ArrayList();

    list.add("aaa");
    list.add("bbb");
    list.add("ccc");

    // 删除指定的元素, 返回删除是否成功
    System.out.println(list.remove("aaa")); // true
    System.out.println(list); // [bbb, ccc]
}

修改索引处的元素 :

  • 方法 public E set(int index,E element) : 修改指定索引处的元素,返回被修改的元素
  • 使用方法: list.set(index, element)
public static void main(String[] args) {
    ArrayList<String> list = new ArrayList();

    list.add("aaa");
    list.add("bbb");
    list.add("ccc");

    // 修改指定索引处的元素, 返回被修改的元素
    System.out.println(list.set(1, "fff")); // bbb
    System.out.println(list); // [aaa, fff, ccc]
}

案例练习

遍历并删除元素值

需求

  • 某个班级的考试在系统上进行,成绩大致为:98, 77, 66, 89, 79, 50, 100
  • 现在需要先把成绩低于80分以下的数据去掉。

分析

  • 定义ArrayList集合存储多名学员的成绩。
  • 遍历集合每个元素,如果元素值低于80分,去掉它。

示例代码:

public static void main(String[] args) {
    ArrayList<Integer> score = new ArrayList<>();
    
    score.add(98);
    score.add(77);
    score.add(66);
    score.add(89);
    score.add(79);
    score.add(50);
    score.add(100);

    for (int i = 0; i < score.size(); i++) {
        if (score.get(i) < 80) {
            score.remove(i);
            // 解决集合边删除, 边遍历的bug
            i -= 1;
        }
    }

    System.out.println(score);
}

学生信息系统的数据搜索

需求:

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

分析:

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

示例代码:

  • 定义如下一个学生类
public class Student {
    private String studentId;
    private  String name;
    private int age;
    private  String classRoom;

    public Student() {

    }

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

    public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }

    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 String getClassRoom() {
        return classRoom;
    }

    public void setClassRoom(String classRoom) {
        this.classRoom = classRoom;
    }
}
  • 具体实现代码
public class TestDemo01 {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();

        students.add(new Student("20221314", "菠萝吹雪", 18, "软件一班"));
        students.add(new Student("20220315", "东方不败", 17, "网络一班"));
        students.add(new Student("20221816", "射雕英雄", 19, "信息一班"));
        students.add(new Student("20221918", "降龙八部", 20, "软件二班"));

        System.out.println("\t学号\t\t名称\t\t年龄\t班级");
        for (int i = 0; i < students.size(); i++) {
            Student stu = students.get(i);
            System.out.print(stu.getStudentId() + "\t");
            System.out.print(stu.getName() + "\t");
            System.out.print(stu.getAge() + "\t");
            System.out.println(stu.getClassRoom() + "\t");
        }

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您要搜索的学号");
            String inputStuId = sc.next();

            Student stu = getStudentById(students, inputStuId);
            if (stu == null) {
                System.out.println("查无此人");
            } else {
                System.out.print(stu.getStudentId() + "\t");
                System.out.print(stu.getName() + "\t");
                System.out.print(stu.getAge() + "\t");
                System.out.println(stu.getClassRoom() + "\t");
            }
        }
    }

    public static Student getStudentById(ArrayList<Student> students, String inputStuId) {
        for (int i = 0; i < students.size(); i++) {
            Student stu = students.get(i);
            if (stu.getStudentId().equals(inputStuId)) return stu;
        }
        return null;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/120093.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!