Java基础常用知识点(集合部分)

1. 什么是集合

集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体
而java面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类


2. 集合的特点:

  1. 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
  2. 集合存放的是对象的引用,而非哪个对象本身
  3. 集合只能存放引用数据类型,若要存放基本数据类型,只能存相对应的包装类

3. 集合与数组的区别

集合与数组都是容器,但有许多不同,集合的出现也是为了弥补数组的一些缺点
长度:数组长度固定,集合长度可变
内容:数组存储同一类型元素(不声明泛型 存储不同类型的元素), 集合存储不同类型元素
元素类型:数组可以存基本类型,也可以存引用类型,集合只可以存引用类型


4. java 容器都有哪些?

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

  • Collection
    • List
      • ArrayList
      • LinkedList
      • Vector
      • Stack
    • Set
      • HashSet
      • LinkedHashSet
      • TreeSet
  • Map
    • HashMap
    • LinkedHashMap
    • TreeMap
    • ConcurrentHashMap
    • Hashtable

5. Collection和Collections的区别

  • Collection:提供了对集合对象进行基本操作的通用接口方法,是单列集合的顶层接口,有子接口List和Set。
  • Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

6. List、Set、Map 是否继承Cllenction接口,之间的区别是什么

  • list,set继承的是单列集合Cllection接口

  • list:有序集合,元素可被重复

  • set:无序集合,元素不可被重复

    • map:是双列集合,键不可被重复,值可被重复

7. iterator的注意事项

  • 集合独有的遍历方式,只能单向遍历,但是更加安全
  • 它是一个接口,是不能实例化的。只能接收集合类对象调用自己的iterator方法来生成的Iterator对象
  • 用来遍历集合时,需要hasNext()方法和next()方法配合使用
  • 在遍历的过程中,不允许对集合进行增删操作。如果想要对集合进行删除操作,也必须调用迭代器的remove()方法

8. List 和 Set 的区别

  • List , Set 都是继承自Collection 接口
  • List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
  • Set 特点:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。
  • 另外 List 支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。
  • Set和List对比
    • Set:检索元素效率低下,增删效率高,因为不会引起元素位置改变。
    • List:和数组类似,List可以动态增长,查找元素效率高,增删元素效率低,因为会引起其他元素位置改变

9. ArrayList,Vector和 LinkedList 的区别是什么?

  • ArrayList,Vector底层都是数组结构,查询快,增删慢
    • 但前者线程不安全,效率高,后者安全,效率低
    • 用法几乎完全一样,且Collections工具类保证了ArrayList的线程安全,所以多用ArrayList
    • 在扩容时,Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%
  • LinkedList底层是链表结构,查询慢,增删快,线程不安全效率高,可以模拟栈操作

10. ArrayList 和 LinkedList 的区别是什么?

  • 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
  • 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
  • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
  • 内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
  • 线程安全:ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;

11. Array 和 ArrayList 有何区别?

  • Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
  • Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
  • Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteratior 等方法只有 ArrayList 有。

12. Iterator 和 ListIterator 有什么区别?

  • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  • ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取元素的索引位置。

13. 怎么确保一个集合不能被修改?

  • 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

14.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

错误。因为hashCode()和equals()方法是有一些常规协定的

  • 首先,两个对象用equals()比较返回值为true,则两个对象的hashCode()方法必须返回相同的结果。而equals()比较返回值为false,不要求 hashCode() 方法也一定返回不同的值,但是最好返回不同值,提高哈希表性能。
  • 其次,重写equals()方法,必须重写hashCode()方法,以保证equals()方法相等时两个对象hashCode返回相同的值。

15. HashSet与HashMap的区别

  • 实现接口不同:前者实现Set接口,后者实现Map接口
  • 存储不同:前者仅存储对象,后者存储键值对
  • 添加方式不同:前者用add()方法添加元素,后者用put方法添加元素
  • Hashcode计算不同:前者使用成员对象计算Hashcode;后者使用Key计算Hashcode
  • 实现效率不同:前者较慢,后者较快,因为后者使用唯一Key来获取对象

16. 什么是Hash算法

哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值,这个较小的二进制值叫做哈希值。


17. HashMap 和 Hashtable 有什么区别?

  • 都继承的是map接口
  • 存储:HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。
  • 线程安全:HashMap线程不安全,但是效率高;HashTable线程安全,但是效率低
  • 迭代器:HashMap的Iterator是fail-fast迭代器;Hashtable还使用了enumerator迭代器
  • 底层数据结构: JDK1.8 以后的 HashMap ,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
  • 默认初始大小和扩容方式:HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。

18. 谈谈你对容器的理解

在Java当中,有一个类专门用来存放其它类的对象,这个类就叫做容器,它就是将若干性质相同或相近的类对象组合在一起而形成的一个整体

Java容器分为两大阵营:单列集合Collection和双列集合Map

Collection:主要是单个元素的集合,由List、、Set两个接口区分不同的集合特征,然后由下面的具体的类来实现对应的功能。

Map:有一组键值对的存储形式来保存,可以用键对象来查找值。

剩下的就是集合的知识点,能写多少就多少,越多越好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值