JAVA-(集合详解、ArrayList、Lambda表达式、ArrayList自定义排序)


心得体会

  • 有些时候学过的东西,若不反复去记得话,真的会忘的,而且如果时间隔得太远,就像新的一样。今天上课的过程中,发现自己好几个知识点都不记得了,哭唧唧~~

今日所学

集合

  • 1.集合基础框架(Collection、Map)
  • 2.collection集合方法
  • 3.List集合的三种遍历方式以及优缺点
  • 4.ArrayList相关方法及操作
  • 5.Lambda表达式
  • 6.基础练习小demo
  • 7.ArrayList自定义排序

具体操作

1.集合基础框架

以下框架只显示我认为常用的^^:

image.png

image.png


>---|Collection: 单列集合  
           ---|List: 有存储顺序, 可重复  
                ---|ArrayList:  数组实现, 查找快, 增删慢  
                            由于是数组实现, 在增和删的时候会牵扯到数组增容, 拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快  
                ---|LinkedList: 链表实现, 增删快, 查找慢  
                            由于链表实现, 增加时只要让前一个元素记住自  己就可以, 删除时让前一个元素记住后一个元  素, 后一个元素记住前一个元素. 这样的增删效率较高但查询时需要一个一个的遍历, 所以效率较低  
                ---|Vector: 和ArrayList原理相同, 但线程安全, 效率略低  
                             和ArrayList实现方式相同, 但考虑了线程安全问  
                                                题, 所以效率略低  
            ---|Set: 无存储顺序, 不可重复  
                ---|HashSet  
                ---|TreeSet  
                ---|LinkedHashSet  
---| Map: 键值对  
        ---|HashMap  
        ---|TreeMap  
        ---|HashTable  
        ---|LinkedHashMap

2.collection集合方法

增加:  
        1:add() 将指定对象存储到容器中, add 方法的参数类型是Object 便于接收任意对象  
        2:addAll() 将指定集合中的元素添加到调用该方法和集合中
  
删除: 
        3:remove() 将指定的对象从集合中删除  
        4:removeAll() 将指定集合中的元素删除

获取  
        5:  size() 获取元素个数

判断  
        6:isEmpty() 判断集合是否为空  
        7:contains() 判断集合何中是否包含指定对象
        8:equals()  集合进行比较      
        9:containsAll() 判断集合中是否包含指定集合  
                           
修改  
        10:clear() 清空集合中的所有元素
  
转成数组  
        10: toArray()   集合转换数组 
public class Myclass {
   public static void main(String[] args){
       //定义一个可变数组
        Collection<String> t1=new ArrayList();

       //向可变数组里面添加元素
        t1.add("Jack");
        t1.add("Merry");
        System.out.println(t1);
        System.out.println("---------------");

        //删除一个对象
        t1.remove("Jack");
        System.out.println(t1);
        System.out.println("---------------");

        
        //获取元素个数
        System.out.println(t1.size());
        System.out.println("---------------");

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

       //判断是否为空
        if(t1.isEmpty()){
            System.out.println("是空的");
        }
        //判断两个集合是否相同
        Collection<String> t2=new ArrayList<>();
        t2.add("Merry");
        t2.add("Jack");
        t2.add("1");
        t2.add("2");
        if(t1.equals(t2)){
            System.out.println("两个集合相同");
        }else{
            System.out.println("两个集合不相同");
        }
       System.out.println("---------------");
        
       //清空
        t1.clear();
        System.out.println(t1);
   }
}

运行结果:

image.png

用toArray()方法将集合转化为数组:

      Collection<String> t1=new ArrayList();
      //向可变数组里面添加元素
       t1.add("Jack");
       t1.add("Merry");
       System.out.println(t1);
       System.out.println("---------------");

       //将集合转化为数组
       Object[] objects=new String[t1.size()];
       t1.toArray(objects);
       System.out.println(objects);

3.List集合的三种遍历方式以及优缺点

  • 1.集合遍历常用方法

hasnext():判断是否有元素
next(): 获取下一个对象
remove(): 删除当前遍历过后的对象

  • 2.第一种遍历方法---使用迭代器(Iterator)来遍历

优点:迭代器提供了操作元素的方法 可以在遍历中相应地操作元素
缺点:运行复杂,性能稍差,效率相对其他两种遍历方式较低

public class Myclass {
   public static void main(String[] args){
        Collection<String> t2=new ArrayList<>();
        t2.add("Merry");
        t2.add("Jack");
        t2.add("John");
        t2.add("Cindy");

        Iterator iterator=t2.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

运行结果:


image.png
  • 迭代器错误的遍历方式:!!!!
public class Myclass {
   public static void main(String[] args){
        Collection<String> t2=new ArrayList<>();
        t2.add("Merry");
        t2.add("Jack");
        t2.add("John");
        t2.add("Cindy");

        Iterator iterator=t2.iterator();
        while(iterator.next()!=null){
            System.out.println(iterator.next());
        }
        System.out.println("-------------------");
image.png
  • 3.第二种遍历方法---For

优点:效率最高,遍历快,可以根据自定计数器操作元素
缺点:不适用所有集合,每次都需要在应用程序中手动强转和额外的获得list.size,还有一个缺点就是遍历过程中不允许删除元素

 public static void main(String[] args){
        Collection<String> t2=new ArrayList<>();
        t2.add("Merry");
        t2.add("Jack");
        t2.add("John");
        t2.add("Cindy");

        for(int i=0;i<t2.size();i++){
            System.out.println(((ArrayList<String>) t2).get(i));
        }
}

运行结果:


image.png

  • 3.第三种遍历方法---For-each

优点:代码简洁,不易出错。
缺点:只能做简单的遍历,不能在遍历过程中操作(删除、替换)数据集合。

 public static void main(String[] args){
  Collection<String> t2=new ArrayList<>();
        t2.add("Merry");
        t2.add("Jack");
        t2.add("John");
        t2.add("Cindy");
   //3.for-each 增强for循环 快速循环
        for(String obj:t2){
            System.out.println(obj);
        }
}

运行结果:


image.png

4.ArrayList相关方法及操作

  • 温馨小贴士(以下操作原本是连贯的,我把它分割了,但下面代码的结果受上面代码的影响^^)

1

add(e):将指定的元素添加到此列表的尾部
add(int index,element):将制定的元素插入此列表的指定位置

        ArrayList<Integer> score=new ArrayList<>();
        //add(e)
        score.add(2);
        score.add(3);//在末尾添加
        System.out.println(score);
        System.out.println("-------------------------");
        
        //add(int index,element),"add(0,1)"表示将整数1添加到列表的第一位
        score.add(0,1);
        System.out.println(score);
image.png

2

get(int index):访问指定元素
set(int index,element):用指定的元素替代此列表中指定位置上的元素

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

        //修改一个元素
        score.set(0,0);//改第几个 用什么去替换
        System.out.println(score);
        System.out.println("-------------------------");
image.png

3

remove(int index):移除此列表中指定位置上的元素
remove(Object o):移除此列表中首次出现的指定元素
clear():删除所有,清空

        //移除此列表中指定位置上的元素
        score.remove(0);
        System.out.println(score);
        System.out.println("-------------------------");
        
        //删除指定的对象,下面一段demo表示删除列表中所有的整数3
        score.remove((Integer)3);
        System.out.println(score);
        System.out.println("-------------------------");

        score.clear();//删除所有,清空
        System.out.println(score);
image.png

4

addAll():从指定的位置开始,将指定Collection中所有的元素插入到此列表中,可以用来将另一个集合里面的内容添加到当前集合里
retainAll(Collection c): 两个集合求交集,只保留交集数据

 ArrayList<Integer> a2=new ArrayList<>();
       a2.add(1);
       a2.add(2);
       a2.add(3);

       //将另一个集合里面的内容添加到当前集合里
        score.addAll(a2);
        System.out.println(score);
        System.out.println("-------------------------");

        ArrayList<Integer> a3=new ArrayList<>();
        a3.add(1);
        a3.add(2);
        score.retainAll(a3);//取两个集合的交集
        System.out.println(score);
image.png

5

indexOf(object o):访问此列表中首次出现的指定元素的索引,或如果不包含指定元素,则返回-1
lastIndexOf(object o):访问此列表中最后一次出现的指定元素的索引,或如果此列表不包含改索引,则返回-1

   //访问某个对象在集合里面的索引
        ArrayList<Integer> a4=new ArrayList<>();
        a4.add(1);
        a4.add(2);
        a4.add(2);
        a4.add(1);
        System.out.println(a4.indexOf(1));//第一次出现的位置
        System.out.println(a4.lastIndexOf(1));//最后一次出现的位置  //如果没有 返回值是-1
        System.out.println("----------------------------------------------------");
image.png

6

toArray():按适当顺序(从第一个到最后一个)返回包含此列表中所有元素的数组

 //将ArrayList转化为普通数组
        Object[] objects=new Integer[a4.size()];
        a4.toArray(objects);
        System.out.println(objects);//输出的是地址
        System.out.println("----------------------------------------------------");
        Object[] objects1=a4.toArray();
        for(Object i:objects1){
            System.out.println(i);
        }
image.png

7

subList():获取某个范围内的子集和

       //获取某个范围内的子集和
        List<Integer> integers=a4.subList(1,2);
        System.out.println(integers);
image.png

5.Lambda表达式
  • 1.removeif()方法

remove():清除满足条件的元素

  • 2.Lambda表达式的语法

基本语法:
(parameters) -> expression

(parameters) ->{ statements; }

  • 3.关于Lambda表达式的一个简单例子
       ArrayList <Integer> nums=new ArrayList<>() ;
       nums.add(1);
       nums.add(2);
       nums.add(3);
       nums.add(4);
       //Lambda表达式
       nums.removeIf(obj ->obj % 2==0);
       System.out.println(nums);
image.png

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

remove()方法里面使用了Lambda表达式,上面句话表示将数组里面能被2整除的数清除
nums里面的数依次被取出,%2判断是否能够整除,如果整除,就移除那个数
由于【2,4】能够整除【2】,所以【2,4】被移除数组,数组里面就只剩下【1,3】


  • 4.Lambda表达式的定义

Lambda表达式也可以成为闭包,把函数作为一个方法的参数

  • 5.使用Lambda表达式的要求

1.必须是接口, 这个接口里面只能有一个方法

  • 6.使用Lambda表达式案例
class ArrayClass{
public void test(int[] target,Show s){
for(int obj:target){
s.customShow(element);
     }
   }
 }
//必须是接口, 这个接口里面只能有一个方法
Interface Show{
 void customShow(int element);
}

main函数里

如何使用上诉功能?:

  • 1.定义一个类实现接口
//写一个类实现上段代码的接口
class PXDClass implements Show{
    @Override
    public void customShow(int element) {
        System.out.println(element);
    }
}

main函数里

 //1.使用方式 定义一个类实现接口
       ArrayClass ac=new ArrayClass();
       int[] num={1,2,3,4,5,6};
       PXDClass pc=new PXDClass();
       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);});
  //如果只有一个参数 参数类型可以省略
   ArrayClass ac=new ArrayClass();
   int[] num={1,2,3,4,5,6};
    ac.test(num, element -> 
 {System.out.println(element);});
// 如果代码块里面只有一行语句 大括号可以省略
       ArrayClass ac=new ArrayClass();
      int[] num={1,2,3,4,5,6};
      ac.test(num, element ->System.out.println(element));

上述代码执行的结果是一样的


image.png
6.基础练习小demo

1.创建一个类Person:name age属性
2.创建ArrayList对象保存多个Person对象
3.统计年龄大于30的人数
4..统计姓张的人的人数

public class LittleDemo {
   public static void main(String[] args){
       ArrayList<Person> person=new ArrayList<>();
       Person p1=new Person("张三",28);
       Person p2=new Person("李四",33);
       Person p3=new Person("王二",34);
       Person p4=new Person("张四",20);

       person.add(p1);
       person.add(p2);
       person.add(p3);
       person.add(p4);
       int ageCount=0;
       int nameCount=0;
       for(Person person1:person){
           if(person1.age>30){
               ageCount++;
           }
           if(person1.name.contains("张")){
               nameCount++;
           }
       }
       System.out.println(ageCount+" "+nameCount);
}
}
class Person {
    String name;
    int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
}
image.png

7.ArrayList自定义排序

1.系统自定义方法排序

 ArrayList<Integer> a1=new ArrayList<>();
       a1.add(2);
       a1.add(1);
       a1.add(4);
       a1.add(3);
       a1.sort(Comparator.comparingInt(Integer::intValue));
       System.out.println(a1);

2.手动创建比较器
1.继承一个类

public class LittleDemo {
   public static void main(String[] args){
   ArrayList<Integer> a1=new ArrayList<>();
       a1.add(2);
       a1.add(1);
       a1.add(4);
       a1.add(3);
    a1.sort(new PXDCompare());
    System.out.println(a1);
  }
}
class PXDCompare implements Comparator{

    //什么时候需要自己手动创建比较器
    //如果系统默认提供的方法不能完成我们的比较
    @Override
    public int compare(Object o, Object t1) {
        int mo=(int)o;
        int mt1=(int)t1;
        return mo-mt1;
    }
}

2.使用匿名类

public class LittleDemo {
   public static void main(String[] args){
   ArrayList<Integer> a1=new ArrayList<>();
       a1.add(2);
       a1.add(1);
       a1.add(4);
       a1.add(3);
       a1.sort(new Comparator<Integer>() {
           @Override
           public int compare(Integer integer, Integer t1) {
               return integer-t1;
           }
       });
System.out.println(a1);
}
}
public class LittleDemo {
   public static void main(String[] args){
   ArrayList<Integer> a1=new ArrayList<>();
       a1.add(2);
       a1.add(1);
       a1.add(4);
       a1.add(3);
      a1.sort((Integer i1,Integer i2)->{
           return i1-i2;
       });
    System.out.println(a1);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 707评论 0 2
  • ​ 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处...
    Java帮帮阅读 1,359评论 0 6
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,849评论 0 13
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,334评论 0 4
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 820评论 0 1