首页 > 编程语言 >Java基础知识四

Java基础知识四

时间:2023-09-10 11:33:38浏览次数:37  
标签:Java 哈希 ArrayList 基础知识 链表 线程 数组 底层

1.数组和集合的区别

数组初始化之后长度就固定了,集合不固定

数组中只能存放同一种数据类型。集合中可以存放多种

数组中只能存放有序的元素,可以添加重复元素。集合可以无序,不可以出现无序的元素。

2.ArrayList 1.7版本和1.8版本底层扩容的实现原理

通过一个空参的构造器创建对象时1.7底层创建了长度是10的数组。当我们向集合中添加第11个元素时,底层会进行扩容,扩容为原来数组长度的1.5倍。同时将原数组中的内容复制新的数组中。 元素要求所在的类必须重写equals方法(饿汉式),1.8中并没有直接就创建长度为10的数组,调用add的时候才创建。(懒汉式)

3.collection接口下有什么常用的子类集合,说说底层原理

有List 和 set

list下面有

arrayList :底层是数组,线程不安全,查找快增删慢

LinkedList:底层是双向链表。查找慢,增删插入快

Vector:底层是object数组,线程安全效率低

set下面有

HashSet :是Set的主要实现类,线程不安全,底层是hashMap。初始容量和加载因子都和hashMap一样。

treeSet:可以按照对象的指定属性进行排序

LinkedHashSet:是按照添加元素的顺序进行遍历,因为底层维护了一张链表用来记录添加的顺序


4.说一下map接口中的常用子类。以及底层实现原理

Map分为hashmap和linkedhashmap,hashtable,treemap,

HashMap:是线程不安全的,可以存放null的key和vaule,如果是null默认从第0个查找。

LinkedHashMap:和Hashmap一样,只是可以按照元素添加的顺序进行遍历。底层用双向链表来记录元素添加顺序。

HashTable:是线程安全的。不可能存null。但是Hashtable是表级锁底层方法都是使用synchronized来保证线程安全,而ConcurrentHashMap是段级锁

TreeMap:添加的key-vaule对进行排序,可以考虑订制排序和自然排序,实现Comparator和 Comparable接口。


5.ArrayList 和 Vector 的区别

Vector与ArrayList一样,也是通过数组实现的,Vector类的所有方法都是同步的。它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。如果不考虑到线程的安全因素,一般用Arraylist效率比较高。

使用ArrayList时,如果不指定大小,会生成一个空的数组;使用Vector时,如果不指定大小,会默认生成一个10个元素大小的数组

扩容方面。Vector默认在大小为0的时候就会扩容,第一次扩容容量是2倍,如果还达不到要求,则直接扩容到指定容量

6.ArrayList和LinkedList 的区别和联系

LinkeList 和 ArrayList 都实现了List接口,但是LinkeList还额外实现了Deque接口。

LinkeList 底层是链表,因为实现的Deque接口,所以她还是一个双端队列。链表的结构支持她高效的插入和删除。对查找方法很低效。但是实现的Deque接口的双端队列会一直维护她的头指针和尾指针,所以她对于头部和尾部的查找还是很高效的。

ArrayList和LinkedList都是线程不安全的

底层数据结构不同,ArrayList 是数组,LinkedList 是链表

插入和删除受影响。ArrayList 采用数组存储插入删除的时间复杂度受位置的影响近似为 O(n)。

LinkeList采用链表结构,插入删除不受位置影响,时间复杂度为O(1)

ArrayList支持快速访问随机位置,LinkedList不支持高效访问

内存空间占用问题:ArrayList空间浪费,分配的内存空间即使用了一点点,剩下的空间也会占着。


7.Set不能存放重复元素,其底层是如何实现的

hashcode() 和 equals()…hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)。

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相同的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象。如果equals方法返回为true,HashSet 就不会让其加入操作成功。如果返回false,就会重新散列到其他位置。


8.HashMap的数据结构

在Java1.8之前 HashMap底层是 数组+链表

在Java1.8之后 HashMap底层是 数组+链表+红黑树。链表长度超过8的时候链表转化成红黑树


9.HashMap中put方法的过程?

调用哈希函数获取Key对应的hash值,再计算其数组下标;

如果没有出现哈希冲突,则直接放入数组;如果出现哈希冲突,则以链表的方式放在链表后面;

如果链表长度超过阀值(TREEIFYTHRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表;

如果结点的key已经存在,则替换其value即可;

如果集合中的键值对大于12,调用resize方法进行数组扩容。

10.Hashmap为什么使用红黑树,红黑树是什么?

因为链表长了就会查询慢的问题,红黑树相当于排序数据。可以自动的使用二分法进行定位。性能较高。

红黑树是一种平衡二叉查找树,他的节点是红色或者黑色,根节点是黑色,每个叶子节点都是黑色的空节点,红色的节点他的子节点都是黑色,他可以用变色和旋转来调整平衡



标签:Java,哈希,ArrayList,基础知识,链表,线程,数组,底层
From: https://blog.51cto.com/u_16243779/7424111

相关文章

  • 高级Java面试:如何在事务中使用锁?
    亲爱的小伙伴们,大家好!我是小米,很高兴再次和大家见面。今天,我将和大家分享一个关于编程中的面试题:一个有@Transaction注解的方法中有锁,需要注意什么?这个问题可能在Java后端开发的面试中常常被问到,不仅考察了对事务和锁的理解,还涉及到了多线程编程的复杂性。所以,赶快跟我一起深入探讨......
  • 小而全的Java工具类库 Hutool (扩展篇)
    配置文件(Hutool-setting)对于Properties的广泛使用使我也无能为力,有时候遇到Properties文件又想方便的读写也不容易,于是对Properties做了简单的封装,提供了方便的构造方法(与Setting一致),并提供了与Setting一致的getXXX方法来扩展Properties类,Props类继承自Properties,所以可以兼容Pr......
  • 在flink-1.17中测试执行流处理版本的单词计数程序时,出现"Exception in thread "Thread
    场景描述采用单作业模式提交作业后发现报错了 报错内容Exceptioninthread“Thread-5”java.lang.IllegalStateException:Tryingtoaccessclosedclassloader.Pleasecheckifyoustoreclassloadersdirectlyorindirectlyinstaticfields.Ifthestacktrace......
  • 无涯教程-JavaScript - ACCRINTM函数
    描述ACCRINTM函数返回到期时支付利息的有价证券的应计利息。语法ACCRINTM(issue,settlement,rate,par,[basis])争论Argument描述Required/OptionalIssueThesecurity'sissuedate.RequiredSettlementThesecurity'smaturitydate.RequiredRateThesecuri......
  • 基于JAVA的智慧旅游平台微信小程序
    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了智慧旅游平台开发微信小程序的开发全过程。通过分析智慧旅游平台开发微信小程序管理的不足,创建了一个计算机管理智慧旅游平台开发微信小程序的方案。文章介绍了智慧旅游平台开发微信小......
  • 基于JAVA的儿童预防接种预约微信小程序
    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了儿童预防接种预约微信小程序的开发全过程。通过分析医院挂号信息管理的不足,创建了一个计算机管理医院挂号信息的方案。文章介绍了儿童预防接种预约微信小程序的系统分析部分,包括可行性......
  • 嵌入式基础知识-DMA
    本篇来介绍DMA的一些基础知识。1DMA简介DMA(DirectMemoryAccess),中文名为直接内存访问,它是一些计算机总线架构提供的功能,能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。对应嵌入式处理器来说,DMA可以提供外设和存储器之间,或存储器与存储器之间的高速数据传输,无须C......
  • Java批量插入数据方法对比
    一.环境数据库MySql8.0.2Maven+IDEA二.方法配置目录结构 POM.xml依赖<dependencies>   <!--https://mvnrepository.com/artifact/mysql/mysql-connector-java-->   <dependency>       <groupId>mysql</groupId>       <artifactId&g......
  • java 字符串常用API
      importjava.util.Scanner;publicclassMain{publicstaticvoidmain(Stringargs[]){Scannersc=newScanner(System.in);Strings="1233.32";doubley=Double.parseDouble(s);//将一个字符串强制转化为浮点数Stri......
  • JavaSE--多线程
    一、多线程1、进程与线程概念  进程是一个应用程序(1个进程是一个软件),一个进程可以启动多个线程  线程是一个进程中的执行场景/执行单元2、进程与线程的关系  a)进程与线程    进程可以看作是一个公司,线程就是公司中的一个小员工    进程A与进程B的内存独立不......