集合与数组?

数组:(可以存储基本数据类型)是用来存储对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用

集合:(只能存储对象,对象类型可以不一样)集合的长度可变,可在多数情况下使用

Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类,但是却让其被继承产生了两个接口

Set:不包含重复的元素

List:有序的集合,可以包含重复的元素,提供了按索引访问的方式

Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合的一部分,Map包含了Key – Value对,Map不能包含重复的Key,但是可以包含相同的Value。

Iterator,所有的集合类都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:

  1. hasnext():是否还有下一个元素
  2. next():返回下一个元素
  3. remove():删除当前元素

几种重要的接口和类简介

  1. List(有序,可重复)

List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快,因为往List集合里插入或删除数据时,会伴随着后面数据的移动,所以插入数据速度很慢

  1. Set(无序,不能重复)

Set里存放的对象是无序的,不能重复的,集合中的对象不按特定的方式排序,只是简单的把对象放入集合中。

  1. Map(键值对,键唯一,值不唯一)

Map集合中存储的时键值对,键不能重复,值可以重复,根据键得到值,对map集合遍历时先得到键的Set集合,对Set集合遍历,得到相对应的值。

遍历

在集合中提供了以下四种的常见的输出方式

  1. Iterator:迭代输出,是使用最多的输出方式
  2. ListIterator:是Iterator的子接口,用于专门输出List中的内容‘
  3. Foreach输出:JDK1.5之后提出的新功能。可以输出数组或集合
  4. For循环

ArrayList和LinkedList

ArrayList和LinkedList在用法上没有区别,但是在功能上还是有区别的

LinkedList经常用在增删操作较多而查询操作很少的情况

Arraylist经常用在查询较多,增删操作较少的情况下。

Map集合

实现类:HashMap,HashTable,LinkedHashMap和TreeMap

HashMap

HashMap是最常用的Map它根据键的HashCode来存储元素,根据键可以直接获取它的值,具有很快的访问速度。

遍历时,取得数据的顺序是完全随机的,因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的

HashTable

HashTable与HashMap类似,是HashMap的线程安全版,它支持线程的同步,任一时刻只有一个线程能写HashTable

因此也导致了HashTable在写入时会比较慢,它集成子Dictionary类,不同的时它不允许记录的键或值为null,同时效率较低

LinkedHashMap

LinkedHashMap保存来记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性

TreeMap

TreeMap实现SortMap接口,能够把它保存的记录根据键顺序,默认是按键值的升序排序(自然顺序),可以指定排序的比较器,当用Iterator遍历ThreeMap时,得到的记录是排过序的,不允许Key值为空,非同步

Map的遍历

  1. KeySet();

将Map中所有的键存入到set集合中因为set几倍迭代器,所以可以迭代取出所有的键,再根据get方法获取每一个键对应的值,KeySet()迭代后只能通过get()取Key。

  1. ebtrySet()

Set<Map.Entry<K,V>>entrySet()返回此映射值中包含的映射关系的Set视图(一个关系就是一个兼职对)就是把(Key-value)作为一个整体一对一的存放到Set集合中,Map.Entry表示映射关系

EntrySet()迭代后可以e.getKey() ,e.getValue() 两种方法来去Key和Value,返回的值是Entry接口

推荐使用entrySet()方法,效率较高

对于KeySet其实是遍历了2次,一次转为iterator,一次就是从HashMap中取出Key所对应的Value

Entryset()只是遍历了第一次,它把Key和Value都放到了entry中,所以快了。两种遍历的遍历时间相差还是很明显的。

ArrayList和LinkedList的区别

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构
  2. 对于随机访问get和set,ArrayList性能优于LinkedList,因为LinkedList要移动指针
  3. 对于新增和删除操作,add和remove,linkedList比较占优势,因为ArrayList要移动数据,这一点要看实际情况的,若值对单条数据插入或删除,ArrayList的速度反而要优于LinkedList,但是要是批量随机的插入删除数据,LinkedList的书读大大优于ArrayList,因为ArrayList每插入一条数据,要移动插入点及之后的所有数据

HashMap与TreeMap

  1. HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有许多结果你就应该去使用TreeMap(HashMap中元素排列顺序是不固定的)
  2. 在Map中插入,删除和定位元素,HashMap是最好的选择,但如果要按照自然顺序或自定义顺序遍历键,那么TreeMap会更好,使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现

连个Map中的元素一样,但顺序不一样,导致hashCode()不一样

同样做测试:

在HashMap中,同样的值的map。顺序不同,equals时,false

在TreeMap中,同样的值的map,顺序不同,equals时,true,说明TreeMap在equals()时是整理了顺序的。

HashTable与HashMap的区别

  1. 同步性:HashTable是线程安全的,也就是说是同步的,而HashMap是线程不安全的,不是同步的
  2. HashMap允许存在一个为null 的key,多个为null的元素
  3. HashTable的Key和Value都不允许为null

Java集合框架是什么,说出一些集合框架的优点

每种编程语言中都有集合,最初的Java版本中包含击中集合类:Vector,Stack,HashTable和Array,随着集合的广泛使用,Java1.2提出囊括所有集合接口,实现和算法的集合框架,在保证线程安全的情况下,使用泛型和并发集合类,Java已经经历了很久,它还包括在Java并发包中,阻塞接口以及他们的实现。集合框架的部分优点如下

  1. 使用核心集合类降低开发成本,而非实现我们自己的集合类
  2. 通过使用经过严格测试的结合框架,代码质量会得到提高
  3. 通过使用JDK附带的集合类,可以降低代码维护成本
  4. 复用性和可操作性

集合框架中的泛型有什么优点

Java1.5中引入了泛型,所有的集合接口和实现都大量的使用它,泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你想添加其他类型的任何元素,它都会在编译时报错,避免了再运行时出现错误,因此你将会在编译时得到报错信息,泛型也是的代码整洁,我们不需要使用显式转换和instanceOf操作符。

Java集合框架的基础接口有哪些

Collection为集合层级的根接口,一个集合代表一组对象,这些对象即为它的元素,Java不提供这个接口的任何直接实现。

Set是一个包含不重复元素的集合,这个接口对数字集合抽象进行建模,被用来代表集合,就如一副牌一样。

List是一个有序集合,可以包含重复元素,你可以通过它的索引来访问任何元素,List更像长度动态变换的数组

Map是一个将Key映射到Value的对象,一个Map不能包含重复的Key,每个Key最多只能映射一个Value

为何Map接口不继承Collection接口

尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map,因此Map继承Collection毫无意义,反之亦然

Iterator是什么?

Iterator接口提供遍历任何Collection的接口,我们可以从一个Collection中使用迭代器的方法来获取迭代器实例,迭代器允许调用者在迭代过程中移出元素

HashMap是如何工作的

HashMap使用哈希算法,在put和get方法中,他是用hashCode()和equals()方法,当我们通过传递Key-value对,调用put方法的时候,HashMap使用key hashCode()和哈希算法,来找出存储Key-value对的索引Entry存储在LinkedList中,如果存在Entry,它使用equals()方法来检查传递的Key是否已经存在如果存在,它会覆盖Value,如果不存在,它会创建一个新的entry然后保存,让我们通过传递key调用get()方法是,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值。

HashCode()和equals()方法有和重要性

HashMap使用Key对象的HashCode()和equals()方法去决定Key-Value对的索引,当我们试着从HashMap中获取值的时候,这些方法也会被用到,如果这些方法没有正确的实现,这种情况下,两个不同Key也会产生相同的HashCode()和equals()输出

HashMap将会认为他们是相同的,然后覆盖他们,而非把他们存储到不同的地方,同样的所有不允许存储重复数据的集合类都使用HashCode()和equals()去查找重复,所以他们非常重要

Equals()和hashCode()的实现应该遵循以下规则:

  1. 如果o1.equals(o2),那么o1,hashCode()==o2.hashCode()总是为true 的
  2. 如果o1.hashCode()==02.hashCode(),并不意味着o1.equals(o2)会为true。

简单来讲:

HashCode相同,不一定对象相同

对象相同,HashCode一定相同。

能否使用任何类作为Map的Key

可以!

使用之前要考虑几点

  1. 如果类重写了equals()方法,它也应该重写HashCode()方法
  2. 类的所有实例要遵循与equals()和HashCode()相关的规则
  3. 如果一个类没有使用equals(),你不应该在HashCode()中使用它

HashMap和HashTable有何不同

  1. HashMap允许key和value为空,而HashTable不允许
  2. HashTable是同步的是安全的,而HashMap不是,所以HashMap适合单线程环境,HashTable适合多线程环境

如何决定选用HashMap还是ThreeMap

对于在Map中插入,删除和定位元素这类的操作,HashMap是孔的选择,然而,假如你需要对一个有序的Key集合进行遍历,ThreeMap是更高的选择,基于你的Collection的大小,也许想HashMap中添加元素会更快,将Map换位TheeMap进行有序Key的遍历

ArrayList 和 Vertor有何异同

ArrayList和Vector在很多时候都很类似

  1. 两者都是基于索引的,内部又一个数组支持
  2. 两者维护插入的顺序,我们可以根据插入顺序来获取元素
  3. ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问

不同点

  1. Vector是同步的是安全的,而ArrayList不是
  2. ArrayList比Vector快
  3. ArrayList更加的通用

Array和ArrayList有何区别?什么时候更适合用Array?

  1. Array可以容纳基本类型和对象,而ArrayList只能容纳对象
  2. Array是指定大小的,而ArrayList大小是固定的
  3. Array没有ArrayList那么多的功能,比如addAll,rumoveAll和Iterator等
  4. 如果列表的大小已经指定,大部分的情啊狂还是存储和遍历它们
  5. 如果要使用多维数组,使用Array[][]要比List<List<>>更容易

ArrayList和LinkedList有何区别?

ArrayList和Linked两者都实现了List接口,但是它们之间有些不同

  1. ArrrayList是时间了基于动态数组的数据结构,ListedList是基于链表的数据结构
  2. 对于随机访问get()和set()ArrayList速度优于LinkedList,因为LinkedList要移动指针
  3. 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据,
  4. 两者都是现成不安全的,允许重复的。

哪些集合提供对元素的随机访问?

ArrayList,HashMap,TreeMap和HashTable都提供对元素的随机访问。

【面试题】Java常见面试题的更多相关文章

  1. java常见面试题及答案 1-10(基础篇)

    java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...

  2. java常见面试题及答案

    java常见面试题及答案 来源 https://blog.csdn.net/hsk256/article/details/49052293 来源 https://blog.csdn.net/hsk25 ...

  3. Java 常见面试题(一)

    1)什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设 ...

  4. 【转载】JAVA常见面试题及解答(精华)

     JAVA常见面试题及解答(精华)       1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: ...

  5. JAVA常见面试题问题简述(持续更新中)

    JAVA常见面试题问题简述 1. springcloud和dubbo的区别 ①相比之下springcloud 的社区会更加活跃,解决问题的速度也会越来越快,dubbo相对来说如果碰到没有解决的问题,就 ...

  6. java常见面试题总结2

    JAVA必背面试题和项目面试通关要点 简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等. 一 数据库 1.常问数据库查询.修改(SQL查询包含筛选查询.聚合查询和链 ...

  7. Java常见面试题(含答案)

    第一,谈谈final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 ...

  8. java常见面试题

    JAVA相关基础知识 1.面向对象的特征有哪些方面  1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分 ...

  9. JAVA常见面试题及解答

    JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...

  10. Java常见面试题总结

    一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4. ...

随机推荐

  1. python相关性算法解决方案(rest/数据库/json/下载)

    1. 场景描述 一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的相关性算法,算法原理就不介绍了,只从代码层面进行介绍,包 ...

  2. 使用maven搭建ssm框架环境

    1.前言 因为经常换环境,在搭ssm框架的时候老是出错,所以记录一下最近搭建的环境,以供参考. 本文讲解如何使用maven搭建ssm框架,并能用于简单的登录注册. IDE:IDEA,JDK版本:1.8 ...

  3. C#数据结构_图

    顶点的度=顶点的入度+顶点的出度. 顶点 v 的入度是指以该顶点 v 为弧头的弧的数目:顶点 v 的出度是指以该顶点 v 为弧尾的弧的数目. 简单路径:一条路径上顶点不重复出现. 回路:第一个顶点和最 ...

  4. Java基础之访问权限控制

    Java基础之访问权限控制 四种访问权限 Java中类与成员的访问权限共有四种,其中三种有访问权限修饰词:public,protected,private. Public:权限最大,允许所有类访问,但 ...

  5. springboot之additional-spring-configuration-metadata.json自定义提示

    springboot之additional-spring-configuration-metadata.json自定义提示 简介 additional-spring-configuration-met ...

  6. Windows Server 2008 R2

    Windows Server 2008 R2 Windows Server Core 微软因为向往 Linux 的纯命令行, 提出了 Windows Server Core 只能使用命令, 但是只要配 ...

  7. odoo 恢复数据库前端报错

    Could not get content for…… jQuery is not defined 原因:数据库缓存 解决方法: select id, create_date, store_fname ...

  8. [Revit]开始:编写一个简单外部命令

    1 创建项目 以Visual Stidio作为开发工具,测试平台为Revit 2017 打开VS,创建一个C# .NET Framwork类库项目,选择..net框架版本为.NET Framwork ...

  9. 2018年全国多校算法寒假训练营练习比赛(第五场)H Tree Recovery

    Tree Recovery 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 链接:https://w ...

  10. lightoj 1119 - Pimp My Ride(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1119 题解:状压dp存一下车有没有被搞过的状态就行. #include < ...