09 ArrayList类和StringBuilder类

一、ArrayList类

1.1 ArrayList集合的概述和基本使用

java.util.ArrayList<E>集合类是一个引用类型,使用有三步:
	1.导包(找到我们要使用的东西)
        格式: import 包名.类名;
		ArrayList: import java.util.ArrayList;
		java.lang包中的内容可以直接使用
		快捷键: alt + 回车
		
    2.创建对象
    	类名 对象名 = new 类名(实际参数...);
		数组:
			int[] array = new int[3];
			左侧int: 表示数组容器中可以存储数据的类型
			左侧[]: 表示数组
			
		java.util.ArrayList<E>集合:
			集合是一个容器,要存储数据时,就需要指定所存储的数据是什么类型的
			ArrayList: 表示它是一个集合容器
			<E>: <>中写的是该集合容器中所存储的数据是什么类型的
			举例1:
				创建ArrayList集合对象list1,只能用来存储字符串数据
				ArrayList<String> list = new ArrayList<String>();
        	举例2:
				创建ArrayList集合对象list2,只能用来存储Student对象
				ArrayList<Student> list2 = new ArrayList<Student>();

	3.常用方法:             
		public boolean add(E e) : 
			将方法指定的参数e添加到此集合的尾部。
			其中E: 就是创建ArrayList集合对象时<>中指定的类型

1.2 ArrayList集合的常用方法

ArrayList集合常用方法: 增(C)删(D)改(U)查(R)的方法 CRUD的操作
	public boolean add(E e) :将指定的元素添加到此集合的尾部。
	public void add(int index,E e) :在此集合中的指定位置index处插入指定的元素e。
	public boolean remove(Object o) :删除指定的元素,返回删除是否成功   集合中有相同的元素的时候从左往右删除第一个指定的元素
	public E remove(int index) :移除此集合中指定位置上的元素。返回被删除的元素。
	public E set(int index,E element) :修改指定索引处的元素,返回被修改的元素。
	public E get(int index) :返回此集合中指定位置上的元素。返回获取的元素。
	public int size() :返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界。
	public boolean isEmpty(): 判断集合是否为空		
	public void clear(): 清空集合元素
    	public int indexOf(Object o):根据指定元素返回对应的索引值。如果集合中有相同的元素的时候,从左往右获得第一个指定元素的索引值。
public class Demo02ArrayListMethod {
    public static void main(String[] args) {
        //创建ArrayList集合对象list,存储数据类型String
        ArrayList<String> list = new ArrayList<>();

        //public boolean add(E e) :将指定的元素添加到此集合的尾部。
        list.add("AAA");
        list.add("CCC");
        System.out.println(list);//[AAA, CCC]

        //public void add(int index,E e) :在此集合中的指定位置index处插入指定的元素e。
        list.add(1, "BBB");
        System.out.println(list);//[AAA, BBB, CCC]: AAA的索引编号0,BBB的索引编号1,CCC的索引编号2

        //public E get(int index) :返回此集合中指定位置上的元素。返回获取的元素。
        String s = list.get(0);
        System.out.println(s);//AAA

        //public int size() :返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界。
        int size = list.size();
        System.out.println("集合元素数量: " + size);//3

        s = list.get(list.size() - 1);
        System.out.println(s);//CCC


        //public boolean isEmpty(): 判断集合是否为空
        System.out.println("集合是否为空: " + list.isEmpty());//false

        //public boolean remove(Object o) :删除指定的元素,返回删除是否成功

        //list.add("BBB");
        //System.out.println(list);

        //删除BBB
        boolean result = list.remove("BBB");
        System.out.println("删除BBB是否成功?" + result);//true
        System.out.println(list);//[AAA, CCC]

        //通过索引删除CCC
        //public E remove(int index) :移除此集合中指定位置上的元素。返回被删除的元素。
        String whoRemoved = list.remove(1);
        System.out.println("谁被删除了呢? " + whoRemoved);//CCC
        System.out.println("删除CCC后集合元素: " + list);//[AAA]


        //public E set(int index,E element) :修改指定索引处的元素,返回被修改的元素。
        //把AAA --> A
        String whoUpdate = list.set(0, "A");
        System.out.println("谁被修改了呢? " + whoUpdate);//AAA
        System.out.println("修改AAA后集合的内容: " + list);//[A]


        //public void clear(): 清空集合元素
        list.clear();

        System.out.println("集合元素个数: "+list.size());//0
        System.out.println("集合是否为空: "+list.isEmpty());//true
    }
}

二、ArrayList类的练习

2.1 ArrayList集合存储基本数据类型

/*
    ArrayList集合容器中只能存储引用类型数据,不能存储基本类型数据
    如果非得向ArrayList集合中存储基本类型数据的话,在创建ArrayList集合对象时<>需要写基本类型对应的引用类型
    简单来讲: 每个基本类型都对应了一个类(包装类)

        基本类型                包装类
        byte                    Byte
        short                   Short
        int                     Integer
        long                    Long
        float                   Float
        double                  Double
        char                    Character
        boolean                 Boolean

    注意:
        ArrayList集合存储基本类型数据时,只需要在创建集合对象时<>中写基本类型对应的包装类
        其它操作(添加/获取数据)都可以按照基本类型完成
 */
public class Demo04ArrayListBase {
    public static void main(String[] args) {
        //创建ArrayList集合对象list,指定存储数据的类型是整数(byte/short/int/long)
        //错误的:<>中不能写基本类型
        //ArrayList<int> list = new ArrayList<int>();
        //ArrayList<long> list2 = new ArrayList<long>();

        ArrayList<Integer> list = new ArrayList<>();

        //add方法添加数据
        list.add(new Integer(100));
        list.add(200);
        list.add(300);

        //遍历
        for (int i = 0; i < list.size(); i++) {
            int num = list.get(i);
            System.out.println(num);
        }
    }
}

2.2 ArrayList集合练习-存储学生对象并遍历

package itheima03;

import pojo.Student;

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

/*
    需求:
        创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
        3个学生对象信息通过键盘录入

    实现步骤:
        1.创建标准的学生Student类(之前创建好了,在pojo包中)
        2.创建ArrayList集合对象list,存储数据类型Student
        3.创建键盘录入Scanner类的对象
        4.因为需要存储3个学生对象,使用for循环
        4.1 获取键盘录入的一个学生信息(姓名和年龄)
        4.2 把步骤4.1中获取的一个学生信息(姓名和年龄)封装成Student对象stu
        4.3 把步骤4.2中封装的Student对象stu添加到集合对象list中
        5.使用for循环遍历集合对象list
        5.1 获取当前Student对象student
        5.2 输出当前Student对象student的相关信息
 */
public class Demo05EachArrayList {
    public static void main(String[] args) {
        //2.创建ArrayList集合对象list,存储数据类型Student
        ArrayList<Student> list = new ArrayList<>();
        //3.创建键盘录入Scanner类的对象
        Scanner sc = new Scanner(System.in);
        //4.因为需要存储3个学生对象,使用for循环
        for (int i = 1; i <= 3; i++) {
            //4.1 获取键盘录入的一个学生信息(姓名和年龄)
            System.out.println("请输入第"+i+"个学生的姓名: ");
            String name = sc.next();
            System.out.println("请输入第"+i+"个学生的年龄: ");
            int age = sc.nextInt();
            //4.2 把步骤4.1中获取的一个学生信息(姓名和年龄)封装成Student对象stu
            Student stu = new Student(name, age);
            //4.3 把步骤4.2中封装的Student对象stu添加到集合对象list中
            list.add(stu);
        }
        //5.使用for循环遍历集合对象list
        for (int i = 0; i < list.size(); i++) {
            //5.1 获取当前Student对象student
            Student student = list.get(i);
            //5.2 输出当前Student对象student的相关信息
            System.out.println("姓名: " + student.getName() + ", 年龄: " + student.getAge());
        }
    }
}

2.3 删除ArrayList集合存储的指定的字符串

package itheima01;

import java.util.ArrayList;

public class Demo08 {
    public static void main(String[] args) {
       /* 需求:
        创建一个存储String的集合,内部存储(test,张三,李四,test,test)字符串
        删除所有的test字符串,删除后,将集合剩余元素打印在控制台*/

        ArrayList<String> list = new ArrayList<>();
        list.add("test");
        list.add("张三");
        list.add("李四");
        list.add("test");
        list.add("test");
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if ("test".equals(s)) {
                /*
                    注意:
                        因为执行完毕remove方法,立刻执行i++,
                        remove方法删除当前元素后,后面的元素会前移,
                        如果有多个连续的元素需要被删除的话,可能会删不完整(有遗漏)
                    解决方案:
                        在执行i++之前,先执行i--
                 */
                list.remove(i--);
            }
        }
        System.out.println(list);
    }
}

三、 ArrayList集合作为方法参数和返回值【重点】

3.1 ArrayList集合作为方法参数

/*
    注意:
        1.引用变量保存的内存地址值
        2.ArrayList也是引用变量,保存的也是内存地址值
        3.当使用ArrayList作为方法参数/返回值类型的时候,传递/返回的都是内存地址值
 */
public class Demo01ArrayListParams {
    public static void main(String[] args) {
        //创建ArrayList集合对象list,存储数据的类型Person
        ArrayList<Person> list = new ArrayList<>();

        //向list中添加多个Person对象
        list.add(new Person("张三",18));
        list.add(new Person("李四",28));

        //调用printArrayList方法,完成遍历
        printArrayList(list);
    }

    //定义方法,完成存储Person对象的ArrayList集合对象的遍历
    public static void printArrayList(ArrayList<Person> list) {
        //使用for循环遍历
        for (int i = 0; i < list.size(); i++) {
            //获取当前元素
            Person p = list.get(i);
            p.show();
        }
    }
}

public class Person {
    //成员变量
    private String name;
    private int age;

    //定义方法,展示信息
    public void show() {
        System.out.println("姓名: " + name + ", 年龄: " + age);
    }

   	//空参/满参构造方法
    //setter and getter方法
}

3.2 ArrayList集合作为方法参数调用图解

image

3.3 ArrayList集合作为方法返回值

/*
    ArrayList类型作为方法返回值
        注意: 首次定义Person类,只有一个String name属性
    
    ArrayList是引用类型,保存的是集合对象在内存空间的地址值
        使用ArrayList作为方法返回值,返回的是ArrayList集合对象的地址值
 */
/*
    ArrayList集合作为方法的返回值
        1.引用类型变量保存的是内存地址值
        2.ArrayList集合对象保存的是内存地址值
        3.ArrayList集合作为方法的返回值的话,返回的是内存地址值
 */
public class Demo02ArrayListReturn {
    public static void main(String[] args) {
        //调用getArrayList方法,获取存储多个Person对象的ArrayList集合对象
        ArrayList<Person> list = getArrayList();

        //遍历ArrayList集合对象list
        for (int i = 0; i < list.size(); i++) {
            //获取当前元素
            Person p = list.get(i);
            p.show();
        }
    }

    //定义方法,该方法返回存储多个Person对象的ArrayList集合对象
    public static ArrayList<Person> getArrayList() {
        //创建ArrayList集合对象
        ArrayList<Person> list = new ArrayList<>();

        //向list中添加多个Person对象
        list.add( new Person("张三",18) );
        list.add( new Person("李四",28) );

        //返回list集合对象
        return list;
    }
}

四、StringBuilder类

4.1 StringBuilder类的概述

使用String进行字符串的大量拼接时,产生大量垃圾,效率低
使用StringBuilder字符串的大量拼接时,产生垃圾少,效率高

image

4.2 StringBuilder类的构造方法

/*
    StringBuilder的构造方法
        public StringBuilder() :
            构造一个空的StringBuilder容器,内部是默认长度为16的字符数组

        public StringBuilder(String str) :
            构造一个StringBuilder容器,并将方法参数字符串str添加进去

    注意:
        打印引用类型变量,默认调用toString方法(帮助我们把数据转换成字符串的形式)
 */
public class Demo01StringBuilder {
    public static void main(String[] args) {
        // 构造一个空的StringBuilder容器,内部是默认长度为16的字符数组
        StringBuilder sb = new StringBuilder();
        System.out.println("---"+sb+"---");
        System.out.println(sb.toString());

        //构造一个StringBuilder容器,并将方法参数字符串str添加进去
        StringBuilder sb2 = new StringBuilder("HelloWorld");
        System.out.println(sb2);//HelloWorld
        System.out.println(sb2.toString());//HelloWorld

    }
}

4.3 StringBuilder类的成员方法(没有static修饰,必须使用StringBuilder类的对象调用)

/*
    StringBuilder常用的方法有3个:
        public StringBuilder append(...) :
            添加任意类型数据的字符串形式,并返回当前对象自身。

        public StringBuilder reverse() :
            返回反转的字符序列

        public String toString() :
            将当前StringBuilder对象转换为String对象。
 */
public class Demo02StringBuilderMethod {
    public static void main(String[] args) {
        //创建StringBuilder类的对象
        StringBuilder sb = new StringBuilder();

        //append方法:把数据原样添加到StringBuilder容器中
        sb.append(97);
        sb.append('a');
        sb.append("hello");
        sb.append(true);

        System.out.println(sb);

        //reverse方法: 实现StringBuilder容器内部的内容进行反转的
        sb.reverse();

        System.out.println(sb);

        //toString方法: 把StringBuilder对象转换成String对象
        String s = sb.toString();
        System.out.println(s);
    }
}

4.4 链式编程

/*
    append方法/reverse方法,返回值类型都是StringBuilder类型,
    而且其实就是调用append方法/reverse方法的StringBuilder对象本身
    所以StringBuilder类支持链式编程的

 */
public class Demo03StringBuilderMethod {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("A");
        StringBuilder sb2 = sb.append("B");
        StringBuilder sb3 = sb2.append("C");
        System.out.println(sb);//ABC
        System.out.println(sb2);//ABC
        System.out.println(sb3);//ABC
        /*
            ==的使用:
            1.基本类型: 比较的是具体的数据值是否相同
            2.引用类型: 比较的是地址值是否相同
            发现结果都是true:
                说明引用变量sb/sb2/sb3 保存的地址值相同,操作的是同一个对象
         */
        System.out.println(sb == sb2);//true
        System.out.println(sb == sb3);//true
        System.out.println(sb2 == sb3);//true

        //如果使用对象调用方法后,该方法返回本类对象的话,可以使用链式编程
        StringBuilder sb4 = new StringBuilder();

        sb4.append(100).append('a').append("hello").append("false");

        System.out.println(sb4);

    }
}

4.5 StringBuilder练习-字符串反转

/*
    需求:
        定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
    例如:
        键盘录入 abc,输出结果 cba

     三要素:
        1.方法名称:  reverseString
        2.参数列表:  String str
        3.返回值类型: String

    reverseString的实现步骤
        1.把方法参数String类型的str,转换成StringBuilder对象sb
        2.StringBuilder对象sb调用reverse方法,实现内部的内容的反转
        3.StringBuilder对象sb调用调用toString方法,转换成String对象newStr
        4.返回String对象newStr

    main方法的实现步骤:
        1.定义String变量ss,并初始化
        2.调用reverserString方法,传递字符串ss,获取反转后的结果字符串,保存到String变量result中
        3.打印result
 */
public class Demo06ReverseString {
    public static void main(String[] args) {
        //1.定义String变量ss,并初始化
        String ss = "abc";

        //2.调用reverserString方法,传递字符串ss,获取反转后的结果字符串,保存到String变量result中
        String result = reverserString(ss);

        //3.打印result
        System.out.println("反转前: "+ss);
        System.out.println("反转后: "+result);
    }

    //定义一个方法,实现字符串反转。
    public static String reverserString(String str) {
        //1.把方法参数String类型的str,转换成StringBuilder对象sb
        StringBuilder sb = new StringBuilder(str);

        //2.StringBuilder对象sb调用reverse方法,实现内部的内容的反转
        sb.reverse();

        //3.StringBuilder对象sb调用调用toString方法,转换成String对象newStr
        String newStr = sb.toString();

        //4.返回String对象newStr
        return newStr;
    }

    //定义一个方法,实现字符串反转。
    public static String reverserString2(String str) {
        //链式编程
        return new StringBuilder(str).reverse().toString();
    }
}
posted @ 2021-07-18 18:21  uoi  阅读(279)  评论(0)    收藏  举报