2、Java容器

文章目录


1、Java容器都有哪些?

  1. 数组(数组长度限制为 Integer.Integer.MAX_VALUE)

  2. String(String的长度限制: 底层是char 数组 长度 Integer.MAX_VALUE 线程安全的)

  3. java.util下的集合容器

    • List:存放有序,可重复,ArrayList、LinkedList和Vector是三个主要的实现类
    • Set:存放无序,不可重复,HashSet和TreeSet是两个主要的实现类
    • Map:无序,可重复

2、Collection和Collections区别

  • collection是一个集合接口,是Set接口和List接口的父接口
  • collections是一个包装类,里面包含了一些对集合的排序,搜索以及序列化的操作的静态多态方法,此类不能被实例化,就像一个工具类,服务于Java的Collection框架

3、List、Set、Map之间的区别是什么?

1.结构特点

list和set是存储单列数据的集合,Map是存储键和值的双列数据的集合;list中存储的数据是有序的,并且可以重复;Map中存储的数据是没有顺序的,其键是不能重复的,值可以重复;Set中存储的数据是无序的,且不允许重复;

2.实现类

  • List接口有三个实现类(LinkedList:基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢;ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于删除;Vector:基于数组实现,线程安全的,效率低)
  • Map接口有三个实现类(HashMap:基于hash表的Map接口实现,非线程安全,高效,支持null值和null键;HashTable:线程安全,低效,不支持null值和null键;LinkedHashMap:是HashMap的一个子类,保存了记录的插入顺序;)
  • Set 接口有两个实现类(HashSet:底层是由 HashMap 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hashCode()方法;LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMp)

3.区别

List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序

4、HashMap和HashTable有什么区别?

常用的Map集合:HashMap,TreeMap

区别:

  • HashMap是线程不安全的,HashMap是一个接口,是Map的一个子接口,是将键映射到值的对象,不允许key重复,但value可以重复。允许空键和空值,由于是非线程安全,所以HashMap的效率要较HashTable的效率高一些
  • HashTable是线程安全的一个集合,不允许null值作为一个key值和value值
  • HashTable 是 sychronize,多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时
    候需要自己为它的方法实现同步

5、如何决定使用HashMap还是TreeMap?

  • TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排列的;TreeMap的实现也是基于红黑树结构。

  • HashMap<K,V>的Key值实现散列hashCode(),分布是散列的均匀的,不支持排序,数据结构主要是桶(数组),链表或红黑树。

  • 所以查询的时候使用HashMap,增加、快速创建的时候使用TreeMap。

6、简写代码:Java遍历Map方式(重点)

public class TestMap {
    public static void main(String[] args) {
        
        // 第一种方式
        // 先创建一个map集合
        Map<String,String> map = new HashMap();
        map.put("name","张三");
        map.put("age","30");
        map.put("sex","male");
        map.put("code","3010");

        //遍历map集合
        //先获取所有的键的集合
        Set<String> keySet = map.keySet();
        // 遍历键
        for (String key : keySet) {
            String value = map.get(key);
            System.out.println(key + ":" + value);
        }

        System.out.println("--------------");

        // 第二种方式
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for (Map.Entry<String, String> stringStringEntry : entrySet) {
            System.out.println(stringStringEntry);
        }
    }
}

7、ArrayList和LinkedList的区别

  • LinkedList:基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢;
  • ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于删除

8、迭代器Iterator是什么?

Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

9、什么是泛型

泛型,即“参数化类型”。

创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。

10.ArrayList和vector区别

  • ArrayList和Vector都实现了List接口,都是通过数组实现的。
  • Vector是线程安全的,而ArrayList是非线程安全的。
  • List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值