一常用 API ——第三节、ArrrayList类,是集合

一、对象数组

//一个基本的类有四个部分
package arrayListD;

public class Person {
    private String name;
    private int age;

    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 Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
package arrayListD;
//题目:定义一个数组,用来存储3个person对象
//数组有一个缺点,一旦创建,程序运行期间长度不可以变
public class Demo01Array {
    public static void main(String[] args) {
        //首先创建一个长度为3 的数组,存Person类型的对象
        Person[] arr = new Person[3];
        Person one = new Person("la",13); //one two thr 都是地址值
        Person two = new Person("ka",19);
        Person thr = new Person("ja",13);
        //将one当中的地址值赋值给数组的0号元素
        arr[0] = one;
        arr[1] = two;
        arr[2] = thr;

        System.out.println( arr[0]);  //这个是地址值
        //这才是值
        System.out.println(arr[1].getName() + arr[1].getAge());
    }
}

二、 ArrayList类

package cn.day07.demo04;

import java.util.ArrayList;

/*
数组的长度不可以发生改变
但是ArrayList长度可以随意变化的
对于ArrayList来说,有个尖括号,代表泛型
泛型:也就是装在集合当中的所有元素,全都是统一的类型
注意:泛型只能是引用类型,不能是基本类型
注意事项:
对于ArrayList集合来说, 直接打印得到的不是地址值,而是内容,如果内容为空,得到的是空的中括号[]
 */
public class Demo02ArrayList {
    public static void main(String[] args) {
        //创建了一个ArrayList集合,集合的名称是list,里面全是String类型的数组
        //备注:从jdk 1.7开始,右侧的尖括号内部可以不写内容,但是尖括号本身要写的
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);  //[]

        //向集合中添加数据,需用add方法
        list.add("赵丽颖");  //[赵丽颖]
        System.out.println(list);
        list.add("迪丽热巴");
        list.add("古力娜扎");
        System.out.println(list); //[赵丽颖, 迪丽热巴, 古力娜扎]

        //  list.add(110)  错误写法
    }
}

ArrayList例子1 ,没有赋值就是[],常用方法。

1、ArrayList的底层数据结构就是一个数组,查找快,增删慢
2、ArrayList的线程安全性
对ArrayList进行添加元素的操作的时候是分两个步骤进行的,即第一步先在object[size]的位置上存放需要添加的元素;第二步将size的值增加1。由于这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList在多线程的环境下是线程不安全的。

具体举例说明:在单线程运行的情况下,如果Size = 0,添加一个元素后,此元素在位置 0,而且Size=1;而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增 加 Size 的值。 那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而Size却等于 2。这就是“线程不安全”了。

如果非要在多线程的环境下使用ArrayList,就需要保证它的线程安全性,通常有两种解决办法:第一,使用synchronized关键字;第二,可以用Collections类中的静态方法synchronizedList();对ArrayList进行调用即可。

ArrayList常用方法有:

ArrayList的add()方法

public boolean add(E,e):参数的类型和泛型一致, 对于add方法来说,添加一定是成功的,返回值可用可不用。但是对于其他集合来说,add添加动作不一定成功,
在add()方法中主要完成了3件事:
首先确保能够将希望添加到集合中的元素能够添加到集合中,即确保ArrayList的容量(判断是否需要扩容);
然后将元素添加到elementData数组的指定位置;
最后将集合中实际的元素个数加1。

ArrayList的get(int index)方法

public E get (int index)从集合中获取元素,参数是索引编号,返回值是对应位置的元素,索引从0开始,

ArrayList的set(int index,E element)方法

set(int index, E element)方法的作用是指定下标索引处的元素的值。在ArrayList的源码实现中,方法内首先判断传递的元素数组下标参数是否合法,然后将原来的值取出,设置为新的值,将旧值作为返回值返回。

ArrayList的indexOf(Object o)方法

indexOf(Object o)方法的作用是从头开始查找与指定元素相等的元素,如果找到,则返回找到的元素在元素数组中的下标,如果没有找到返回-1。与该方法类似的是lastIndexOf(Object o)方法,该方法的作用是从尾部开始查找与指定元素相等的元素。

ArrayList的remove(int index)方法,参数是所编号,返回值是被删掉的元素

public E remove(int index)方法的作用是删除指定下标的元素。在该方法的源码中,将指定下标后面一位到数组末尾的全部元素向前移动一个单位,并且把数组最后一个元素设置为null,这样方便之后将整个数组不再使用时,会被GC,可以作为小技巧。而需要移动的元素个数为:size-index-1。

ArrayList的size方法

public int size():获取集合的大小, 返回值是集合中包含的元素个数

package arrayListD;

import java.util.ArrayList;

public class Demo1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list) ; //这是一个[]

        list.add("dfk");
        list.add("gfd");
        list.add("fdh");
        System.out.println(list);
        String name = list.get(1);
        System.out.println("1号索引:" + name);
        String remove = list.remove(1);
        System.out.println("删掉的是:" + remove);
        int size = list.size();
        System.out.println("最后是:" + list);
        System.out.println("大小是:" + size);
         System.out.println("=====");
        //遍历, list.fori
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}
[]
[dfk, gfd, fdh]
1号索引:gfd
删掉的是:gfd
最后是:[dfk, fdh]
大小是:2
=====
dfk
fdh

三、ArrayList集合存储基本数据类型,自动装箱拆箱

package arrayListD;

import java.util.ArrayList;
/*
如果希望向集合ArrayList中存储基本类型,必须使用基本类型对应的包装类。
基本类型   包装类(引用类型,包装类位于java.lang包下)
byte           Byte
short          Short
int              Integer       【特殊】
long           Long
float           Float
double       Double
char           Character   【特殊】
boolean     Boolean

从jdk1.5+开始,支持自动装箱,自动拆箱
自动装箱:基本类型-->包装类型
自动拆箱:包装类型-->基本类型
*/
public class Demo2 {
    public static void main(String[] args) {
        //ArrayList<Integer> sc = new ArrayList<>();  这是错误写法,泛型必须是引用类型,不能是基本类型
        ArrayList<Integer> sc = new ArrayList<>();
        sc.add(90);
        sc.add(1);
        Integer num = sc.get(1);
        System.out.println("1号索引:" + num);
    }
}
1号索引:1

四、例子、

4.1、 产生6个随机数字,遍历

package arrayListD;

import java.util.ArrayList;
import java.util.Random;

//生成5个1-33 之间的随机整数,并添加到集合,并遍历集合
public class Demo3 {
    public static void main(String[] args) {
        ArrayList<Integer> al = new ArrayList<>();
        Random sc = new Random();
        int n =33;
        for (int i = 0; i < 5; i++) {
            int rs = sc.nextInt(n) + 1;
            al.add(rs);
            System.out.print(rs + " ") ;
        }
        for (int i = 0; i < al.size(); i++) {
            System.out.print(al.get(i) + "  ");
        }

    }
}
22 24 28 33 20
22  24  28  33  20 

4.2、自定义3个学生对象,添加到集合,并遍历

package arrayListD;

import java.util.ArrayList;

//自定义3个学生对象,添加到集合,并遍历
/*
1、自定义Student学生类,四个部分, 变量,构造,getter setter
2、创建一个集合,存储你学生对象,泛型<Student>
3、根据类,创建3个对象
4、将学生添加到集合 add
5、for size  get  遍历
 */
public class Demo5Student {
    public static void main(String[] args) {
        ArrayList<Student> stu1 = new ArrayList<>();
        Student one = new Student("s",12);
        Student two = new Student("q",13);
        Student thr = new Student("e",17);

        stu1.add(one);
        stu1.add(two);
        stu1.add(thr);
      //遍历集合,stu1.fori
        for (int i = 0; i < stu1.size(); i++) {
            Student stu = stu1.get(i);
            System.out.println("姓名:" + stu.getName()+ stu.getAge());
        }
    }
}
package arrayListD;

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

    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;
    }

    private String name;
    private int age;
}

4.3 按指定格式,打印集合方法

定义以指定格式打印集合的方法,ArrayList类型作为参数,使用{}扩起集合,使用@分隔每隔元素,格式参照元素@元素@元素

package cn.day07.demo04;

import java.sql.Struct;
import java.util.ArrayList;

/*
System.out.println(list)  [10,20,30]
printArrayList(list)      {10@20@30}
 */
public class Demo04ArrayList {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("qwe");
        list.add("asd");
        list.add("zxc");
        System.out.println(list); //[qwe, asd, zxc]
        printArrayList(list);
    }
    /*定义方法的三要素
    返回值类型:只是打印,没有运算,没有结果,所有返回用void
    方法名称:printArrayList
    参数列表:arrayList
     */
    public static void printArrayList(ArrayList<String> list){
        System.out.print("{");
        for (int i = 0; i < list.size(); i++) {
            //System.out.print(" " + list.get(i)); /{qwr@asd@zxc}
           String name  = list.get(i);
            if (i == list.size() - 1){
                System.out.print(name+"}");  //zxc
            } else {
                System.out.print(name + "@");
            }

        }
    }

}

[qwr, asd, zxc]
{qwr@asd@zxc}

4.4、用一个大集合存入20个随机数字,然后筛选其中的偶数,并放到小集合

package arrayListD;

import java.util.ArrayList;
import java.util.Random;

/*
题: 用一个大集合存入20个随机数字,然后筛选其中的偶数,并放到小集合
要求用自定义方法实现筛选
分析:
1、创建一个大集合,用来存储int数据,<Integer>
2、随机数字Random,20个,循环20次,nextInt 可以不用限定。
3、循环20次,放入大集合,add
4、定义一个方法,筛选
筛选:根据大集合,筛选符合要求的小集合
筛选:
返回类型,小集合。 个数不确定
方法名称:getSmall
参数类型:ArrayList 大集合
5、判断是不是偶数,num%2 == 0
6、如果是偶数,放到小集合
 */
public class ArrayListReturn {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Random rs = new Random();
        for (int i = 0; i < 20; i++) {
            int num = rs.nextInt(100) + 1;  //1~100
            list.add(num);
        }
        System.out.print("大集合:" + list);
        System.out.println("======");
        ArrayList< Integer> smallist = getSmall(list);
        System.out.println("偶数个数:" + smallist.size());
        for (int i = 0; i < smallist.size(); i++) {
            System.out.print(smallist.get(i) + "  ");
        }
    }
    //这个方法接受大集合参数,返回小集合list
    public  static ArrayList<Integer> getSmall(ArrayList<Integer> bigArray){
       //创建小集合,放偶数结果
        ArrayList<Integer> slist = new ArrayList<>();
        for (int i = 0; i < bigArray.size(); i++) {
           int num = bigArray.get(i);
           if (num % 2 == 0){
               slist.add(num);
           }
        }
        return slist;
    }
}

6.基础的取数

package arrayListD;

import java.util.ArrayList;

public class Demo2 {
    public static void main(String[] args) {
        ArrayList<Integer> sc = new ArrayList<>();
        sc.add(90);
        sc.add(1);
        Integer num = sc.get(1);
        System.out.println("1号索引:" + num);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容