首页 > 编程语言 >Java集合

Java集合

时间:2022-08-29 17:11:06浏览次数:68  
标签:Java iterator list System println 集合 out

概述

  1. 数组和集合的元素存储的个数问题
    • 数组定义后类型确定,长度固定
    • 集合类型可以不固定,大小是可变的
  2. 数组和集合存储元素的类型问题
    • 基本类型和引用类型的数据数组都可以存储
    • 集合只能存储引用类型的数据
  3. 数组和集合适用的场景
    • 数组适合数据个数和类型确定的场景
    • 集合和C语言的链表很像,适合数据个数不确定,且要做增删元素的场景

Collection集合

特点

image-20220819223004429

Collection是单列集合,每个元素只包含一个值,Map是双列集合,每个元素包含两个值(键值对)

  • List系列集合:添加的元素有序、可重复、有索引

    • 独有方法:add(int index, E element)、remove(int index)、get(int index)、set(int index, E element)
    • ArrayList:基于数组实现,查询元素快,增删相对慢。在第一次创建集合并添加第一个元素时,在底层创建一个默认长度为10的数组,如果该数组容量不够,按当前容量的一半进行扩容
    • LinkedList:基于双链表实现,可以实现队列。查询元素慢,增删首尾元素快
      • 独有方法:pop()、push()、add/removeFirst()、add/removeLast()... ...
  • Set系列集合:添加的元素无序、不重复、无索引

    • HashSet:无序、不重复、无索引;采取哈希表存储数据,从JDK1.8开始采用数组+链表+红黑树组成。

      让HashSet去除自定义类重复:重写equals()和hashCode()方法

      image-20220823221233344

    • LinkedHashSet:有序、不重复、无索引,在哈希表的基础上将每个元素之间用双链表连接,记录存储的顺序从而实现有序

    • TreeSet:按照大小默认升序排序、不重复、无索引,基于红黑树实现排序,增删改查性能较好

遍历集合

iterator()方法:返回一个迭代器对象,可以实现对集合的遍历

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

增强型for循环

  • 既可以遍历集合也可以遍历数组,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法
  • 实现Iterable接口的类才可以使用迭代器和增强for
for (String s : list) {
    System.out.println(s);
}

Lambda表达式遍历集合

forEach(Consumer<? super T> action)方法

list.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
		System.out.println(s);
    }
});
// 可以简化为:
list.forEach(s -> System.out.println(s));
// 极简写法:
list.forEach(System.out::println);

for循环(List集合存在索引)

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

存储自定义类型的对象

ArrayList<Movie> movies = new ArrayList<>();
movies.add(new Movie("《你好,李焕英》", 95, "郑秀文"));
movies.forEach(System.out::println);

集合的并发修改异常问题的解决方法

在用迭代器和(增强型)for循环遍历集合且直接用集合删除元素时可能出现

错误示例:

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("123");
    list.add("123");
    list.add("345");
    list.forEach(s -> {
        if (s.equals("123")) {
            list.remove("123");
        }
    });
}

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList.forEach(ArrayList.java:1262)
	at com.collection.Demo1.main(Demo1.java:15)

由于forEach在迭代下一个元素会给指针进行+1操作,remove也相当于进行+1操作,如果此时要删除两个相邻的重复的元素就会造成漏删的情况。

解决方法:使用迭代器的remove()方法或手动在for循环if内部进行-1操作

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    if (iterator.next().equals("123")) {
        iterator.remove();
    }
}

Map集合

特点

image-20220825002957049

Map集合是一种双列集合,每个元素包含两个数据(键值对),格式为key=value

体系特点

  • Map集合的键是无序、不重复、无索引的(Set集合底层由Map集合实现),值可以重复
  • Map集合后面重复的键所对应的值会覆盖前面重复键的值
  • Map集合的键值对都可以为null

实现类特点(和Set基本相同)

  • HashMap:无序、不重复、无索引,值可以重复
  • LinkedHashMap:有序、不重复、无索引,值可以重复
  • TreeMap:排序、不重复、无索引,值不做要求

API

image-20220825003808275

三种遍历方法

Map<String, Integer> info = new HashMap<>();
info.put("java", 4);
info.put("asp", 2);

// 1、键找值
Set<String> selects = info.keySet();
for (String select : selects) {
    System.out.println(select + info.get(select));
}

// 2、键值对
Set<Map.Entry<String, Integer>> entries = info.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
    System.out.println(entry.getKey() + entry.getValue());
}

// 3、lambda表达式
info.forEach((k,v)-> System.out.println(k+v));

标签:Java,iterator,list,System,println,集合,out
From: https://www.cnblogs.com/timqiu/p/16636580.html

相关文章

  • List集合拆分为多个List
    publicstatic<T>List<List<T>>split(List<T>resList,intsubListLength){if(CollectionUtils.isEmpty(resList)||subListLength<=0){......
  • 力扣50(java)-Pow(x,n)(中等)
    题目:实现 pow(x,n) ,即计算x的整数 n次幂函数(即xn)。 示例1:输入:x=2.00000,n=10输出:1024.00000示例2:输入:x=2.10000,n=3输出:9.26100示例3:输入:x=2......
  • js md5 和java md5后的值不一样
         开发发现js对字符串md5和java对字符串md5计算的结果居然不一样,后来找了一个匹配的这里记录一下注:加密的对象中不能有空格,有空格md5后的结果就不一致,都是眼......
  • javascript中的constructor
    1.使用constructor   constructor是Object类型的原型属性,它能够返回当前对象的构造器(类型函数)。利用该属性,可以检测是否复合类型数据的类型,如对象,数组和函数等。v......
  • Java List集合返回值去掉中括号('[ ]')的操作
    调用StringUtils工具类的strip()方法去掉中括号"[]": 或者自己写工具类publicstaticvoidmain(String[]args){Strings="[aasa,bbbbb]";Strings......
  • 字典、集合、元组、列表区别
    是否有序无序列表:字典、集合、元组有序列表:列表是否是可变序列定长:元组、集合可变:列表、字典是否可更改不可更改:元组(不可以修改元素地址,但是可以修改......
  • Java 基础语法
    Java关键字下面列出了Java关键字。这些保留字不能用于常量、变量、和任何标识符的名称。类别关键字说明访问控制private私有的protected受保护的public......
  • JavaScript设计模式及代码实现——单例模式
    单例模式1定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。2应用时机当一个类的实例被频繁使用,如果重复创建这个实例,会无端消耗资源。比如dialog弹......
  • Java11-Object类,常用API
    day11【Object类、常用API】主要内容Object类Date类DateFormat类Calendar类System类StringBuilder类包装类第一章Object类1.1概述java.lang.Object类是Java......
  • java 常用工具类
    1.时间格式化importorg.apache.commons.lang3.time.FastDateFormat;...FastDateFormatdf=FastDateFormat.getInstance("yyyy-mm-dd");//将指定格式字符串(上面的......