java集合类

156 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天

java集合大致可以分为setListQueue,Map四种体系。

  • 其中set代表无序,不可重复的集合。

  • List代表有序,重合的集合。

  • Map代表具有映射关系的集合。

  • Queue体系集合,代表一种队列集合。

image.png

图二显示的是Map体系的继承树,所有Map实现类用于保存具有映射关系的数据。 他们的实质都是保存的数据都是key-value对(例:数学-80分,每项成绩都有两项组成)。

Map里的key是不可以重复的,所以如果需要调用Map里面的数据的话,总是根据Map的key来获取的。

646e67beafee0abd316bd7fb7bd48ca.jpg

java11增强的Collection和Iterator接口

image.png

下面是实例演示:

mport java.util.ArrayList;
import java.util.HashSet;

public class CollectionTest {
    public static void main(String[] args) {
        var c=new ArrayList<>();
        c.add("apple");
        c.add(7);
        System.out.println(c.size());
       c.remove("apple");
        System.out.println(c.size());
        System.out.println("c集合是否包含apple"+c.contains("apple"));
        c.add("banana");
        System.out.println("c包含的元素有"+c);
        var books=new HashSet<>();
        books.add("one");
        books.add("two");
        System.out.println("c集合是否完全包含books集合?"+c.containsAll(books));
        System.out.println("c集合里的所有元素"+c);
        c.clear();
        System.out.println("c集合里的所有元素"+c);
        books.retainAll(c);
        System.out.println("books里面包含的元素有"+books);



    }
}

image.png

使用Lambda表达式历遍集合

lambda是Collection接口的父接口,所以Collection集合可以直接调用该方法。

public class CollectionTest {
    public static void main(String[] args) {
var books=new HashSet<>();
books.add("apple");
books.add("banana");
books.add("we");
books.forEach(o -> System.out.println(o));


    }
}

使用Iterator来历遍集合元素

Iterator主要用于遍历,即迭代访问Collection里面的元素,Iterator对象也被称作迭代器。

Iterator接口里定义了四个方法:

  • boolean hasNext():如果元素被遍历完了,则返回false。

  • Object next():返回集合里的下一个元素

  • void remove():删除集合里上一次next方法返回的元素

  • VOid forEachRemaining(Consummer action):可以使用Lambda表达式来遍历集合元素。

public class CollectionTest {
   public static void main(String[] args) {
       var books = new HashSet<>();
       books.add("apple");
       books.add("banana");
       books.add("we");
       var it = books.iterator();
       while (it.hasNext()) {
           var book = (String) it.next();
           System.out.println(book);
           if (book.equals("apple")) {
               it.remove();
           }
          // book="test";#
       }
       
       System.out.println(books);
   }
}

注意

当使用Iterator对集合元素进行迭代的时候,Iterator并不会把集合元素本身传给迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值不会对集合变量有任何影响。

使用Predicate来操作集合

  • removeIf(Predicate filter)

例如,如果程序中需要统计或者删除含某些特定标志的元素,则可以按照下面的程序。

public class CollectionTest {
    public static void main(String[] args) {
        var books = new HashSet<>();
        books.add("安卓牛逼");
        books.add("苹果牛逼");
        books.add("鸿蒙牛逼");
        books.add("腾讯666");
        books.add("nikesly");
//        books.removeIf(ele -> ((String) ele).length() > 4);
//        System.out.println(books);
        printAll(books, ele -> ((String) ele).contains("牛逼"));
    }

    public static void  printAll(Collection books, Predicate p) {

        for (var obj : books) {
            if (p.test(obj)) {
                System.out.println(obj);
            }
        }


    }
}

image.png

使用Stream来操作集合

在JAVA中,涉及到对数组Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。

Stream初相识

可以把Stream流操作分为三种类型:

  • 创建Stream
  • Stream中间处理
  • 终止Stream

每个Stream管道都包含很多API方法

  • 开始管道

主要负责新建一个新的stream流。

  • 中间管道

负责对Stream进行处理操作,并返回一个新的Stream对象,中间管道操作可以进行叠加。

image.png

  • 终止管道

通过终止管道操作后,Stream流会结束,最后可能执行某些逻辑处理,或者是按照要求返回某些执行后的结果数据。

image.png

接下来放上一段代码,第一段是终止管道

public class StreamTest {
    public static void main(String[] args) {
//       1. var is = IntStream.builder()
//                .add(21)
//                .add(10)
//                .add(20)
//                .add(20)
//                .build();
//        System.out.println("is的所有元素的最大值是" + is.max());
//        System.out.println("is的所有元素的最小值是" + is.min());
//        System.out.println("is的所有元素的总和是" + is.sum());
//        System.out.println("is的所有元素的总数是" + is.count());
//        System.out.println("is的所有元素的平均值是" + is.average());
//        System.out.println("is的所有元素的平方是否大于20" + is.allMatch(ele->ele*ele>20));
//        System.out.println("is的中的元素的平方是否存在大于20" + is.anyMatch(ele->ele*ele>20));
//        System.out.println("is的中的元素的平方是否存在大于20" + is.anyMatch(ele->ele*ele>20));
//        var newis=is.map(ele->ele*2);
//        newis.forEach(System.out::println);

            // 先切割句子,获取具体的单词信息
//      2......  String sentence="i am the bossssssssssssss";
//            String[] words = sentence.split(" ");
//            List<String> wordList = new ArrayList<>();
//            // 循环判断单词的长度,先过滤出符合长度要求的单词
//            for (String word : words) {
//                if (word.length() > 5) {
//                    wordList.add(word);
//                }
//            }
//            // 对符合条件的列表按照长度进行排序
//            wordList.sort((o1, o2) -> o2.length() - o1.length());
//            // 判断list结果长度,如果大于3则截取前三个数据的子list返回
//            if (wordList.size() > 3) {
//                wordList = wordList.subList(0, 3);
//            }
//        System.out.println(wordList);;




    }
}