Java语言的学习与实践9 (数组与集合,ArrayList,Lambda表达式)

1.收获

今天讲完课后,自己不知道这些知识点是属于哪一部分,就是感觉很杂乱,虽然这些知识是比较好理解的,但是就是乱的,但是自己后来慢慢把它理清楚,才明白这些知识点是属于ArrayList里面的,于是自己慢慢把这些一个个地分清楚,哪部分是哪部分的。这是自己的脑袋里面才有了清晰地逻辑。今天还做了一个以前的demo,因为那个demo有点小bug,但是今天花了一个多小时把他给解决了,利用了今天所学地一点知识,还是蛮高兴的。时间慢慢地流逝,迈着艰难的步子向前走去,那是对未来的期待。加油!!

2.技术

(1)数组与集合地的对比
(2)ArrayList的应用
(3)Lambda表达式的应用

3.技术的实际应用和实践

(1)数组与集合的对比
数组:存储多个对象
int[] score={1,2,3};
int[] score=new int[10];
弊端:数组的长度是不可变的 ,内容可变
但是在实际的应用过程中我们还是需要数组长度是可以改变的
于是就有了可变数组--->实际开发中需要以随时改变的数组 -> 集合(Collection)
ollection抽象的接口 定义了集合相关操作
Colection-> 1.---List 列表 特点:有序 可以重复
----------------------ArrayList
----------------------LinkedArrayList
---------------2.---Set集合 特点:无序 不能重复
-----------------------HashSet
Map接口 映射关系 Key-Vable -键值对 -键不能相同- 值可以相同
---------------------- ---HashMap
语文:98
英语:98
而数组和集合各有优缺点
在用数组时,可以很好地访问元素,因为它在内存上是连续地,但是就是数组的长度是不能改变的
而在用集合时,恰好与数组相反,不能很好地访问元素,因为元素是不连续的,但是集合的长度是可以改变的,所以在使用时要想好自己在使用的过程中是访问元素还是改变长度。
(2)ArrayList的应用
Collections: 集合的元素个数是可变的
Collection是一个接口
集合的定义:

Collection<String> test= new ArrayList();

因为这里的ArrayList实现了接口Collection,所以可以用多态来表示。
在ArrayList有很多的方法
a.添加元素
add * addAll
add是在后面追加
addAll是把一个集合全部内容放在另一个集合里面原来的内容就会被覆盖

 test.add("jack");
  test.add("merry");
((ArrayList<String>) test).add(1,"hh");
System.out.println(test);

效果:


image.png
Collection<String> test1= new ArrayList();
test1.add("ja");
  test1.add("m");
((ArrayList<String>) test).add(1,"h");
test.addAll(test1);
System.out.println(test);

效果:


image.png

在其中有一个((ArrayList<String>) test).add(1,"h");这是表示在第一个位置插入“h”
效果:


image.png

b.删除--remove
//删除一个对象
        test.remove("jack");
        System.out.println(test);

效果:


image.png

c.获取元素个数

.//获取元素个数
        System.out.println(test.size());

效果:


image.png

d.判断是否包含另一个元素

//判断是否包含另一个元素
        if(test.contains("merry")){
            System.out.println("有merry");
        }else{
            System.out.println("没有merry");
        }

效果:


image.png

e. 判断是否为空

//判断是否为空
        if(test.isEmpty()){
            System.out.println("是空的");
        }else{
            System.out.println("不是空的");
        }

效果:


image.png

f.判断是否相同

//判断是否相同
        Collection<String> test1=new ArrayList<>();
        test1.add("merry");
        test1.add("jack");
        if(test1.equals(test)){
            System.out.println("两个集合是相同的");
        }else{
            System.out.println("两个集合不是相同的");
        }

效果:


image.png

g.清空

//清空
        test.clear();
        System.out.println(test);

效果:


image.png

h. 访问指定的元素

//访问指定的元素
        System.out.println(score.get(1));

效果:


image.png

i. 修改一个元素

        score.set(0,0);
        System.out.println(score);

效果:


image.png

List 接口 extends Collection
---- ArrayList
---- LinkedArrayList
----集合里面自能存放对象
---- byte char int long float double boolean
----包装类:Byte Integer Long Char Float Double Boolean
----自动将基本的数据类型转化为对应的类

ArrayList<Integer> score=new ArrayList<>();
        score.add(2);
        score.add(3);//在末尾添加
        score.add(0,1);//在指定位置插入
        System.out.println(score);
        //访问指定的元素
        System.out.println(score.get(1));
        //修改一个元素
        score.set(0,0);
        System.out.println(score);

    //删除
    score.remove(0);//删除指定位置的元素
    System.out.println(score);
    score.remove((Integer)2);//删除指定大小的元素
    System.out.println(score);

//清空
        //score.clear();
        System.out.println(score);

//addAll
        ArrayList<Integer> test2=new ArrayList<>();
        test2.add(1);
        test2.add(2);
        test2.add(3);
        score.addAll(test2);
        System.out.println(score);
//取两个集合交集
        ArrayList<Integer> test3=new ArrayList<>();
        test3.add(1);
        test3.add(2);
        score.retainAll(test3);//取两个集合交集
        System.out.println(score);
        score.add(2);
        //访问某个对象在集合里面的索引位置
        System.out.println(score.indexOf(2));
        System.out.println(score.indexOf(3));//第一次出现的 没有就返回-1
        System.out.println(score.lastIndexOf(0));//最后一次出现的 没有就返回-1
    //将ArrayList转化为普通数组
    Integer[] integers=new Integer[score.size()];
    score.toArray(integers);
    for(int i=0;i<integers.length;i++){
        System.out.println(integers[i]);
    }


        //获取某个范围类的子集合
        List<Integer> it=score.subList(0,3);
        System.out.println(it);

最后效果:


image.png

对集合进行排序:
首先要有一个集合

 ArrayList<Integer> a1=new ArrayList<>();
        a1.add(2);
        a1.add(1);
        a1.add(4);
        a1.add(3);
        System.out.println(a1);

然后来对年龄进行排序
一共有4种方式

a1.sort(Comparator.comparingInt(Integer::valueOf));
a1.sort(new pxdCompare());
匿名类
        a1.sort(new Comparator<Integer>() {
            @Override
           public int compare(Integer integer, Integer t1) {
               return integer-t1;
           }
        });
1.sort((Integer i1,Integer i2)->{
            return i1-i2;});
        System.out.println(a1);

这4种方式的效果是一样的


image.png

(3)Lambda表达式的应用
遍历数组的两种方式
错误方式:

for(Integer obj:nums){
            if(obj%2==0){
                nums.remove(obj);
            }
        }

这种方式之所以错是因为,在遍历过程中是不能够执行增加或修改,删除,这样会出错的
正确的方式:

ArrayList<Integer> nums=new ArrayList<>();
        nums.add(10);
        nums.add(3);
        nums.add(6);
        nums.add(1);
for(int i=0;i<nums.size();i++){
          Integer obj=nums.get(i);
            if(obj%2==0){
                 nums.remove(i);
                 i--;
             }
        }
        System.out.println(nums);

Lambda表达式的应用

nums.removeIf( ele -> ele%2==0 );

效果:


image.png

Lambda表达式的应用

//闭包 enclusure 把函数作为一个方法的参数
class ArrayClass{
    public void test(int[] targer,Show s){
        for(int element:targer){
            s.customShow(element);
        }
    }
}
//必须是接口 这个接口里面只有一个方法
interface Show{
    void customShow(int element);
}
class pxd implements Show{
    @Override
    public void customShow(int element) {
        System.out.println(element);
    }
}

使用方式:
//1.使用方式:定义一个实现接口

        ArrayClass ac=new ArrayClass();
        int[] num={1,2,3,4,5,6};
        pxd pc=new pxd();
        ac.test(num,pc);

//2.:匿名类

        ArrayClass ac=new ArrayClass();
        int[] num={1,2,3,4,5,6};
        ac.test(num, new Show() {
            @Override
            public void customShow(int element) {
                System.out.println(element);
            }
        });
    //3.使用Lambda表达式
    //如果参数是一个接口类对象,且接口里面只有一个方法
    //把这个方法作为参数传递 可以省略方法名
        ArrayClass ac=new ArrayClass();
        int[] num={1,2,3,4,5,6};
        ac.test(num,(int element)->{
            System.out.println(element);
        });
    //4.如果只有一个参数 参数类型可以省略
        ArrayClass ac=new ArrayClass();
        int[] num={1,2,3,4,5,6};
        ac.test(num,element -> {
            System.out.println(element);
        });
    //5.如果代码块只有一行语句 大括号就可以省略
        ArrayClass ac=new ArrayClass();
        int[] num={1,2,3,4,5,6};
        ac.test(num,element -> System.out.println(element));

这5种方式的效果是一样的


image.png

4.小demo

在这小demo 中用了一点今天所学知识
要实现的功能
创建一个类Person:name age属性
创建ArrayList对象保存多个Person类
1.统计年龄大于30的人数
2.统计名字中有张的人数
首先创建一个类Person

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

然后创建ArrayList对象保存多个Person类

Person p1=new Person("小张",20);
        Person p2=new Person("小李",40);
        Person p3=new Person("张三",38);
        Person p4=new Person("李四",36);
        Person p5=new Person("张思",35);
        ArrayList<Person> peoples=new ArrayList<>();
        peoples.add(p1);
        peoples.add(p2);
        peoples.add(p3);
        peoples.add(p4);
        peoples.add(p5);

统计年龄大于30的人数,统计名字中有张的人数

int agecount=0;
        int count=0;
        for(int i=0;i<peoples.size();i++){
            Person person=peoples.get(i);
            if(person.age>30){
                agecount++;
            }
            if(person.name.contains("张")){
                count++;
            }
        }
        System.out.println("年龄大于30的人数有:"+agecount+"人\n"+"姓名中有'张'的人数为:"+count+"人");

组后效果:


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

推荐阅读更多精彩内容