首页 > 编程语言 >Java面试题Day04

Java面试题Day04

时间:2023-01-07 23:23:15浏览次数:48  
标签:面试题 遍历 Java HashMap HashSet 接口 Day04 链表 节点

1.什么是链表?

链表是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能.

链表大致分为单链表和双向链表

单链表:每个节点包含两部分,一部分存放数据变量的data,另一部分是指下一节点的next指针.

双向链表:除了包含单链表的部分还增加的pre前一个节点的指针.

2.链表的优缺点

链表的优点:插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)

内存利用率高,不会浪费内存(可以使用内存中细小的不连续空间(大于node节点的大小)),并且在需要空间的时候才创建空间

大小没有固定,扩展很灵活.

链表的缺点:不能随机查找,必须从第一个开始遍历,查找效率低.

3.什么是红黑树

红黑树是一种含有红黑节点并能自平衡的二叉查找树,他必须满足下面性质:

(1)每个节点要么是黑色,要么是红色

(2)根节点是黑色

(3)每个叶子节点(NIL)是黑色

(4)每个红色节点的两个子节点一定都是黑色

(5)任意一节点到每个叶子节点的路径都包含数量相同的黑节点

4.常用的集合类有哪些?

Map接口和Collection接口是所有集合框架的父接口:

Collection接口的子接口包括:Set接口和List接口

Map接口的实现类有:HashMap,TreeMap,Hashtable,ConcurrentashMap以及Properties等

Set接口的实现类有:HashSet,TreeSet,LinkedHashSet等

List接口的实现类主要有:ArrayList,LinkendList,Stack以及Vector等

5.那些集合类是线程安全的?

Vector:就比ArrayList多了个synchronized(线程安全),因为效率较低,现在已经不太建议使用.

hashTable:就比hashMap多了个synchronized(线程安全),不建议使用

ConcurrentHashMap:是Java5中支持高并发,高吞吐量的线程安全HashMap实现,

6.遍历一个List有哪些不同的方式?

(1)for循环遍历,基于计算器,在集合外部维护一个计算器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止

(2)迭代器遍历,Iterator,Iterator是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口,Java在Conllections中支持了Iterator模式.

(3)foreach循环遍历,foreach内部也是采用了Iterator的方式实现,使用时不需要显示声明Iterator或计数器,优点是代码简介,不易出错,缺点是只能做简单的遍历,

不能在遍历过程中操作数据集合,例如删除,替换.

7.如何实现数组和List之间的转换?

数组转List:使用Arrays,asList(array)进行转换

List转数组:使用List自带的toArray()方法

数组转set:使用构造函数,直接转入数组

new HashSet(arrays[])

8.如何把一个线程不安全的集合转化为线程安全集合?

向HashSet中add()元素时.判断元素是否存在的依据,不仅要比较hash值,同时还要结合equals方法比较,

HashSet中的add()方法会使用HashMap的put()方法.HashMap的key是唯一的,在HashMap中如果k/y相同时,会用新的V覆盖掉旧的V,然后返回旧的V,所以不会重复

9.说一下HashSet的实现原理?

HashSet是基于HashMap实现的,HashSet的值存放与HashMap的Key上,HashMap的Value统一为present,因此HashSet的实现比较简单

相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许重复的值,

10.HashSet如何检查重复?HashSet是如何保证数据不可重复的?

向HashSet中add()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles方法比较,

HashSet中的add()方法会使用HashMap的put()方法,

HashMap的key是唯一的在HashMap中如果k/v相同时,会用新的V覆盖掉旧的V,然后返回旧的V,所以不会重复

 

标签:面试题,遍历,Java,HashMap,HashSet,接口,Day04,链表,节点
From: https://www.cnblogs.com/carney/p/17033849.html

相关文章

  • JAVA的数组
    数组的工具类:java.util.Arrays由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本操作。查看JDK帮......
  • 已完成 10000 多次提交,Solon Java Framework v1.12.1 发布
    一个更现代感的Java应用开发框架:更快、更小、更自由。没有Spring,没有Servlet,没有JavaEE;独立的轻量生态。主框架仅0.1MB。@ControllerpublicclassApp{publ......
  • Java泛型
    泛型学习目标:掌握泛型的基本原理及应用掌握泛型通配符的使用指定泛型操作中的上限及下限在接口上应用泛型掌握泛型方法及泛型数组的使用这里针对的是JDK1.5本身的......
  • 分享2023年最新的15种JavaScript 速记技巧 【终极秘籍】
    强大且广受欢迎的编程语言JavaScript具有庞大的内置函数库,可用于执行各种任务。 本文涵盖了每个开发人员都应该知道的15个JavaScript特性。无论您是新手还是经......
  • JavaScript学习笔记—数组的四个方法
    (1)push()方法可向数组的末尾添加一个或多个元素,并返回新的长度//创建一个数组vararr=["孙悟空","猪八戒","沙和尚"];arr.push("唐僧");arr.push("蜘蛛精","白骨......
  • Java大神常用Linux命令整理二
    19.chmod控制用户对文件的权限,详细说明:https://m.runoob.com/linux/linux-comm-chmod.htmlLinux/Unix的文件调用权限分为三级:文件所有者(Owner)、用户组(Group)、其它......
  • 力扣 35.搜索插入位置 58.最后一个单词的长度(java)
    这是刷题的第2天  第一反应是java有没有提供相应的方法,网上搜了后,用了binarySearch。他这个方法用的也是二分查找,符合题目的时间复杂度,但我一直在想如果数组元素重复......
  • JavaScript学习笔记—使用字面量创建数组
    语法:[]//元素为数字vararr=[1,2,3,6,10];//元素可以是任意数据类型vararr2=["hello",1,true,null,undefined];//也可以是对象varobj={name:"孙悟空......
  • JavaScript学习笔记—数组length属性
    length属性返回数组的长度(数组元素的个数)。语法:数组.length/**连续的数组,可以获取数组长度(元素个数)*非连续的数组,获取数组最大索引+1*/vararr=[1,4,10];arr......
  • JavaScript学习笔记—构造函数
    执行流程:1.立刻创建一个新的对象2.将新建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象3.逐行执行函数中的代码4.将新建的对象作为返回值返回通......