Collection集合和Map集合

本文详细介绍了Java中的ArrayList,LinkedList,Set(包括HashSet,LinkedHashSet,TreeSet)以及Map(HashMap,LinkedHashMap,TreeMap)的使用、底层原理和常见操作,包括添加、删除、查找、遍历等,并展示了如何处理并发修改异常和使用可变参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

map.entrySet();

Ctrl+Alt+v自动生成

Set<Map.Entry<String, Integer>> entries = map.entrySet();

目录

ArrayList常见的方法

集合框架:

Collection: 

Collection常见方法:

Collection的遍历方式: 

ArrayList集合的底层原理:

LinkedList集合的底层原理:


ArryList//集合大小可变,开发中用的更多。相对于数组其规定长度后无法改变。

ArrayList常见的方法

ArrayList<>//<>中没有标明限制对象则称为泛型。

注意:1.集合和泛型都不支持基本数据类型,只能支持引用数据类型。(int.long.shout......不支持)String支持。int在<>中为integer;

2.集合容器中存储的是每个对象在堆内存中的地址!

package com.itheima.arraylist;

import java.util.ArrayList;

public class ArrayListDemo1 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<String>();//无参数构造器
        //1.将元素添加到集合的末尾。
        list.add("黑马");
        list.add("java");
        list.add("黑马");
        list.add("heima");
        System.out.println(list);//最初打印的是list的地址,然后在根据地址找到list的内容。
        //2.在集合的指定位置添加指定元素。
        list.add(1,"HySQL");
        System.out.println(list);
        //3.返回指定索引处的元素位置。
        System.out.println(list.get(1));
        //获取集合中的元素个数
        System.out.println(list.size());
        //5.根据索引删除元素中得值
        System.out.println(list.remove(1));
        System.out.println(list);
        //6.直接删除某个元素值。删除成功返回true.反之返回false
        System.out.println(list.remove("java"));
        System.out.println(list);//若元素中有两个黑马元素那么只删除第一个黑马元素。!!!
        //7.修改数据
        System.out.println(list.set(1, "JAVA"));//得到的是要替换的元素
        System.out.println(list);


    }
}

ArrayList的应有案例 :

package com.itheima.arraylist;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String>list=new ArrayList<>();
        list.add("java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");
        System.out.println(list);
        //在集合中找到含”枸杞“的数据并删除他。
//        for (int i = 0; i < list.size() ; i++) {
//            String ele= list.get(i);
//            if(ele.contains("枸杞")){
//                list.remove(ele);
//                --i;
//            }
//        }
//        System.out.println(list);//从前面往后面遍历每删除一个后面的元素会自动补充该位置导致其”黑枸杞“不能被删除。
        for (int i = list.size()-1; i >=0 ; i--) {//从后往前面遍历
            String ele= list.get(i);
            if(ele.contains("枸杞")){
                list.remove(ele);
            }
        }
        System.out.println(list);
    }
}

ArrayListDemo1,Food,FoodOperator .java中有面向对象模拟实际餐厅吃饭场景。

常用API(String,ArrayList)应用程序编程接口,Java写好的程序,给程序员来调用。

集合框架:

Collection单列集合,Map双列集合

Collection: 

List<E>系列集合:添加的元素是有序,可重复,有索引。

ArrayList.LinekList

Set<E>系列集合:添加的元素是无序,不重复,无索引。

HashSet:无序,不重复,无索引。

LinkedHashSet:有序,不重复,无索引

TreeSet:按照大小默认升序排列,不重复,无索引。

Collection常见方法:

Collection<String>c=new ArrayList<>();
        //添加元素,添加成功返回true   //public boolean add(E e);
        c.add("java1");
        c.add("java1");
        c.add("java2");
        c.add("java2");
        c.add("java3");
        System.out.println(c);
        //清空集合中的元素
//        c.clear();
//        System.out.println(c);
        //判断集合是否为空,时空的话返回true
        System.out.println(c.isEmpty());
        //获取集合的大小
        System.out.println(c.size());
        //判断集合中是否包含某个元素
        System.out.println(c.contains("java2"));
        //删除某个元素默认是删除第一个
        System.out.println(c.remove("java1"));
        //将集合转化为数组
        Object[] arr = c.toArray();
        System.out.println(Arrays.toString(arr));
        String[]arr2=c.toArray(new String[0]);
        System.out.println(Arrays.toString(arr2));
        System.out.println("--------------------");
        Collection<String>c1=new ArrayList<>();
        c1.add("java1");
        c1.add("java2");
        Collection<String>c2=new ArrayList<>();
        c2.add("java3");
        c2.add("java4");
        c1.addAll(c2);
        System.out.println(c1);
        System.out.println(c2);

Collection的遍历方式: 

 //创建一个迭代器对象
 Iterator<String> it = c.iterator();
while(it.hasNext()){
    String ele=it.next();
    System.out.println(ele);
}
//增强for循环来遍历
 for (String s : c) {
     System.out.println(s);

 }
 System.out.println("-----------");
 //使用Lambda表达式来遍历集合
 c.forEach(new Consumer<String>() {
     @Override
     public void accept(String s) {
         System.out.println(s);
     }
 });
 c.forEach((String s)->{
     System.out.println(s);
 });
 c.forEach(s->{
     System.out.println(s);
 });
 c.forEach(s-> System.out.println(s) );
 c.forEach(System.out::println );

ArrayList集合的底层原理:

基于数组实现的

 特点:查询速度快

           删除速率低:可能需要把后面很多的数据进行前移

           添加效率极低:可能要把后面的很多数据后移;或者也需要进行数组的扩容

原理:一:利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组;

二:添加第一个元素时,底层会创建一个新的长度为10的数组;

三:存满时,会扩容1.5倍。//15个格子

四:如果一次添加多个元素,1.5倍还放不下,则新创建的长度以实际为准。

LinkedList集合的底层原理:

基于双链表实现的。

特点:查询慢,增删相对较快,但对首位元素进行增删改查的速度是极快的。

push=addFirst

pop=addLast//方法结果相同

应用场景之一是:可以用来设计队列。

可以用来设计栈。

Set系列集合:

HashSet<E>

TreeSet<E>

LinkedHashSet<E>//是HashSet的子类

哈希值:

就是一个int类型的数值,Java中的每一个对象都有一个哈希值。

Java中的所有对象,都可以调用Object类提供的hashCode方法,返回该对象自己的哈希值。

特点:同一个对象多次调用hashCode()方法返回的哈希值是相同的。

不同对象,他们的哈希值一般是不相同的。但也有可能会相同(哈希碰撞)。

HashSet集合中相同内容的不同对象不认为是重复的。

HashSet集合去重复详解:必须重写对象hashCode()和equals()方法。

TreeSet:

升序,不重复,无索引。

当是指定义类(如学生)则无法进行升序排序;

解决方法:1.学生类实现Compareable类接口,重写Compareable方法。

2.重写Comparetor对象。

//注意:TreeSet集合元素的比较采用就近原则,调用就近的构造器进行比较。

集合的并发修改异常:

使用迭代器遍历集合时,有同时再删除集合中的数据,程序就会出现并发修改异常的错误。

可变参数:

就是一种形参,定义在方法,构造器的形参列表里,格式是:数据类型。。参数名称。

特点:可以不穿数据给他,可以穿一个或者同时传多个数据给他,也可以穿一个数组给他;

好处:常常用来灵活地接受数据,                                                                                                     

 //test();
    test(12);
    test(12,35,45);
   // test(new int[]{11,23,21,13,24});

}
//注意:一个形参列表中,只能有一个可变参数
//注意二:可变参数必须放在形参列表的最后面。
public static void test(int age,int...nums){
    System.out.println(nums.length);
    System.out.println(Arrays.toString(nums));
    System.out.println("------");

Map集合 :

常见方法:

存储一一对应的数据

HashMap无序,不重复,无索引;

LinkedHashMap有序,不重复,无索引;

TreeMap按照大小默认升序排列,不重复,无索引;(由键决定)                                                 

 Map<String,Integer>map=new LinkedHashMap<>();//无序,不重复,无索引。HashMap
 map.put("手表",100);
 map.put("手表",220);
 map.put("手机",2);
 map.put("Java",2);
 map.put("null",null);
 System.out.println(map);
 Map<Integer,String>map1=new TreeMap<>();//升序
 map1.put(23,"Java");
 map1.put(23,"MySQL");
 map1.put(19,"李四");
 map1.put(28,"王五");
 System.out.println(map1);
 //Map集合地一些方法
 //获取集合的大小
 System.out.println(map.size());
 //清空集合
// map.clear();
 //System.out.println(map);
 //判断集合是否为空
 System.out.println(map.isEmpty());
 //根据键获取相应的值
 System.out.println(map.get("Java"));//得到的是Java键对应的值
 System.out.println(map.get("手机"));
 //根据键清除某个元素,返回的是键的值。
 System.out.println(map.remove("null"));
 //判断是否包含某个值,如果有返回true
 System.out.println(map.containsKey("手表"));
 //判断是否含有某个值
 System.out.println(map.containsValue(220));
 //获取集合的全部键
 Set<String>keys=map.keySet();
 System.out.println(keys);
 //获取全部的值
 Collection<Integer>values=map.values();
 System.out.println(values);
 //map方法中的putAll

  Map集合的遍历方式 :                                                                       

1.键找值

2.键值对

3.Lambda表达式                                                                                                                                   

Map<String,Double>map=new HashMap<>();
map.put("蜘蛛精",162.5);
map.put("蜘蛛精",169.8);
map.put("紫霞",165.8);
map.put("至尊宝",169.5);
map.put("牛魔王",183.6);
System.out.println(map);
//键找值
//得到所有的键
Set<String> keys = map.keySet();
System.out.println(keys);
for (String key : keys) {
    Double value=map.get(key);
    System.out.println(key+"=====>"+value);
}
System.out.println("------------------");
//键值对
Set<Map.Entry<String, Double>> entries = map.entrySet();
for (Map.Entry<String, Double> entry : entries) {
    String key=entry.getKey();
    Double value=entry.getValue();
    System.out.println(key+"=====>"+value);
}
System.out.println("------------------");
//Lambda方法遍历
map.forEach((k,v)->{
    System.out.println(k+"=====>"+v);
});

                                                                                                                                                                                                                                                                                                                                                                                                  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值