文章目录
1、Java容器都有哪些?
-
数组(数组长度限制为 Integer.Integer.MAX_VALUE)
-
String(String的长度限制: 底层是char 数组 长度 Integer.MAX_VALUE 线程安全的)
-
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%。