首页 > 编程语言 >java八股——java基础(1)

java八股——java基础(1)

时间:2024-03-12 23:33:20浏览次数:39  
标签:扩容 八股 java HashMap 基础 链表 数组 哈希

一点关于java基础概念的学习笔记,如果有不对的地方欢迎指正,谢谢!

面向对象的三大特性

封装:封装是面向对象的核心思想,它涉及将对象的属性和行为封装在一个不可分的系统单位中,尽可能隐藏对象的内部细节。这种封装使得对象具有独立性,仅通过受保护的接口与外界交互,从而提高了数据的安全性和隐私性。
继承:继承描述了类与类之间的关系,允许在无需重新编写原有类的情况下,对原有类的功能进行扩展。通过继承,一个新类(派生类)可以从现有的类(基类或父类)中派生,继承基类的属性和方法,并可以添加新的方法和属性以适应特殊需求。
多态:多态基于继承,它允许不同类的对象对同一消息作出响应,表现出不同的行为。多态性使得同一个方法在不同的类中可以有不同的实现,从而提高了程序的灵活性和代码重用性。

Java的基本数据类型

Java的基本数据类型共有8种,分别为byte(字节型,占用1个字节)、short(短整型,占用2个字节)、int(整型,占用4个字节)、long(长整型,占用8个字节)、float(单精度浮点型,占用4个字节)、double(双精度浮点型,占用8个字节)、char(字符型,占用2个字节)和boolean(布尔型,只有true和false两个值)。

JDK、JRE、JRM三者之间的关系

JDK(java development kit):java开发工具包,用来开发java程序的,针对java开发者。
JRE(java runtime environment):java运行时环境,针对java用户。
JVM(java virtual machine):java虚拟机用来解释执行字节码文件(class文件)的。
JDK包含JRE,JRE包含JVM。

在这里插入图片描述

final关键字的作用

修饰类时,该类不可被继承;
修饰⽅法时,该方法不能被子类重写;
修饰变量时,该变量⼀旦被赋值就不可以更改它的值,只能赋值一次,即为常量。

==和equals方法之间的区别

==:对于基础数据类型,比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。对于引用数据类型,比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。

equals:用来检测两个对象是否相等,即两个对象的内容是否相等,没有==运行速度快。(补充:只有重写后的equals方法才是比较是否相等,Object类里原生的equals方法底层逻辑就是用的 == 实现判断相等)

String、StringBuffer、StringBuilder的区别

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁,如果尝试去修改,会新⽣成⼀个字符串对象。

StringBuffer对象则是可变类,当一个StringBuffer对象被创建以后,可以通过StringBuffer类提供的append()等方法改变这个字符串对象的字符序列,一旦得到了想要的字符串对象,即可通过调用toString()方法得到对应的String对象。

StringBuilder和StringBuffer功能和用法基本相似,但是StringBuffer通过在类方法中添加synchronized关键字(相当于给方法加锁),使StringBuffer保证了线程安全,而StringBuilder则没有实现线程安全功能。

重载和重写的区别

  1. 重载(overload): 发⽣在同⼀个类中,方法名相同时,可以同时创建两个参数类型不同、个数不同、顺序不同的同名方法,重载表现编译时的多态性(注意:在只有返回类型不同,方法名,参数类型、个数、顺序都完全相同时,不能够实现方法重载)。
  2. 重写(override): 发⽣在⽗⼦类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围⼩于等于父类,访问修饰符范围⼤于等于⽗类,如果⽗类方法访问修饰符为private则子类就不能重写该方法。重写多用于实现接口,表现为运行时的多态性。

List和Set的区别

● List(列表):有序,按对象进⼊的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,再逐⼀遍历,还可以使用get(int index)获取指定下标的元素。
● Set(集合):无序,不可重复,最多允许有⼀个Null元素对象,取元素时只能用Iterator接口取得所有元素,在逐⼀遍历各个元素。

ArrayList和LinkedList区别

ArrayList和LinkedList本质上都是对List接口的实现,只不过ArrayList底层是基于动态数组(Array)实现,LinkedList底层则是基于链表(Link)实现。

随机查找时,ArrayList的查找效率相对会更高,因为LinkedList还需要移动链表指针从前向后线性查找;在进行插入、删除操作时,LinkedList的效率相对较高,因为ArrayList在进行插入、删除操作时,会对数据的下标索引产生影响。

ArrayList的扩容机制

由于数组不可以扩容,ArrayList的底层机制为数组,所以ArrayList有一个自动扩容机制:
ArrayList的初始数组长度默认为10(可以指定其他长度),每次实际容量达到数组最大容量后,就会触发自动扩容(创建一个新数组,新数组容量将扩充为原容量的1.5倍,再把老数组里的数据拷贝到新的数组中,最后把当前需要添加的元素添加到新数组中)。

HashMap和HashTable的区别

从功能特性来看:
1.HashTable线程安全的,而HashMap不是
2.HashMap的性能比HashTable好,因为HashTable采用了全局同步锁来保证线程安全性,这对HashTable的性能影响很大
从内部实现的角度来看:
1.HashTable的底层数据结构使用的是数组加链表,HashMap则采用数组+链表+红黑树(从jdk8开始,对于HashMap,只要满足链表长度超过8,数组长度大于64时,链表存储将转化为红黑树存储,以提升性能,当红黑树的结点小于6时,红黑树将退化为链表);
2.HashMap初始容量为16,HashTable初始容量为11
3.HashMap可以使用null作为key,而HashTable不允许。

HashMap的put()方法执行流程

HashMap的put()方法用于将指定的键值对映射到HashMap中。以下是put()方法的执行流程:
1.计算键的哈希值:
首先,put()方法会计算键的哈希值,使用键的hashCode()方法来获取,从而确定键值对在HashMap中的存储位置。
2.计算哈希桶索引:
将计算得到的哈希值通过一系列位运算,确定该键值对在哈希表中的存储位置,即哈希桶(数组中的每个元素称为一个桶)的索引。
3.定位哈希桶:
使用计算得到的哈希桶索引,定位到HashMap内部的数组中的相应位置,该位置就是键值对的潜在存储位置。
4.处理冲突:
如果发现在计算得到的位置已经存在其他键值对,这就是
哈希冲突
HashMap采用链表或红黑树的方式来处理冲突。如果当前位置上是链表,新的键值对将被添加到链表的末尾;如果当前位置上是红黑树,将通过红黑树的插入操作来完成。
5.检查是否需要进行扩容:
在添加新键值对后,HashMap会检查当前元素数量是否超过了扩容阈值(扩容阈值为:当前最大容量*负载因子,负载因子默认为0.75)。如果超过了阈值,HashMap会进行扩容操作,重新计算哈希桶的大小,重新分配元素,以保持哈希表的性能。
6.返回旧值:
如果在执行put()时替换了已存在的键值对,put()方法会返回被替换的键对应的旧值;否则,返回null。

JDK1.7到JDK1.8HashMap 发生了什么变化(底层)?

1.JDK1.7中底层是数组+链表,JDK1.8中底层是数组+链表+红黑树,加红黑树的目的是提高HashMap插入和查询整体效率。
2. JDK1.7中链表插入使用的是头插法,JDK1.8中链表插入使用的是尾插法,因为JDK1.8中插入key和value时需要判断链表元素个数,所以需要遍历链表统计链表元素个数,使用尾插法可以遍历链表元素。
3. JDK1.7中哈希算法比较复杂,存在各种右移与异或运算,JDK1.8中进行了简化,因为复杂的哈希算法的目的就是提高散列性,来提供HashMap的整体效率,而JDK1.8中新增了红黑树,相比链表能有更高的散列性,所以可以适当的简化哈希算法,以节省CPU资源。

谈谈ConcurrentHashMap的扩容机制

JDK1.7和JDK1.8对于ConcurrentHashMap的扩容机制是不一样的。

对于JDK1.7版本:

  1. JDK1.7版本的ConcurrentHashMap是基于Segment分段实现的;
  2. 每个Segment相当于⼀个小型的HashMap;
  3. 每个Segment内部会进行扩容,和HashMap的扩容逻辑类似;
  4. 先⽣成新的数组,然后转移元素到新数组中;
  5. 扩容的判断也是每个Segment内部单独判断的,判断是否超过阈值。

对于JDK1.8版本:
6. JDK1.8版本的ConcurrentHashMap不再基于Segment实现;
7. 当某个线程进行put时,如果发现ConcurrentHashMap正在进行扩容那么该线程⼀起进行扩容;
8. 如果某个线程put时,发现没有正在进行扩容,则将key-value添加到ConcurrentHashMap中,然后判断是否超过阈值,超过了则进行扩容;
9. ConcurrentHashMap是支持多个线程同时扩容的;
10. 扩容之前也先生成⼀个新的数组;
11. 在转移元素时,先将原数组分组,将每组分给不同的线程来进行元素的转移,每个线程负责一组或多组的元素转移工作。

下一篇传送门点我

标签:扩容,八股,java,HashMap,基础,链表,数组,哈希
From: https://blog.csdn.net/m0_46008105/article/details/136600219

相关文章

  • 三.pandas基础
    目录一:认识pandas1.1pandas的优势1.2下载安装二:Series数据结构(一维)2.1创建Series创建series对象(一维)ndarray创建Series对象“显式索引”的方法定义索引标签dict创建Series对象(通过字典创建)标量创建Series对象2.2访问Series位置索引访问索引标签访问2.3......
  • Java基础,你面试可能会问到的各类问题
    Java八种基本数据类型定义相应的包装类:基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublebooleanBooleancharCharacter命名规范1、项目名全部小写.2、包名全部小写.3、类名首字母大写,多个单词情况下使用驼峰命名规则.4、变量名,方法名......
  • Android Framework基础知识
    哈喽大家好,我是Zzz.给大家分享一篇Framework入门的基础知识文章,内容纯纯原创。一、Application,Activity和进程的关系?  Application、Activity只是进程虚拟机运行的一个类对象,只是属于系统的一个组件和进程没有直接联系。Android支持为每个组件可以单独进程方式运行。 ......
  • Java学习系列(一):概述Java与完成第一个程序(安装JDK)
    一、Java简介java语言是SUN(StanfordUniversityNetwork,斯坦福大学网络公司)1995年推出的一门高级编程语言,是一种面向Internet的编程语言。二、学习Java之前首先要掌握相关的计算机知识1.(计算机硬件系统)计算机组成:主板、硬盘(长久的存储数据,读写速度慢、容量大)、内存(......
  • Java(二)你好世界!
    今天写出了java的第一个代码--HelloWorld。你好世界!!耗时好久终于明白怎么用cmd敲出代码了。1.首先用记事本写出你的代码并保存。2.接着你要下载好JDK。为什么呢?因为你想想你打游戏肯定要先下载软件吧。所以我们想玩Java,那肯定要先下载好JDK呀。3.接着你要开始转换一下你......
  • Django基础知识点一
    Django基础知识点【零】补充方法【1】Django项目测试if__name__=='__main__':importosimportdjangoos.environ.setdefault('DJANGO_SETTINGS_MODULE','BookSystem.settings')django.setup()'''测试代码''......
  • JAVA系统源码中的AI智能绘画生成技术揭秘
    在数字化时代,人工智能(AI)已经逐渐渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,无不体现出AI技术的强大魅力。而在艺术领域,AI同样展现出了惊人的创造力。近期,一项融入JAVA系统源码的AI智能绘画生成技术引起了广泛关注。这项技术究竟有何神奇之处?让我们一起来揭秘。一......
  • GDPU JavaWeb JSP基础
    正式走进Javaweb大门,了解jsp及Java在前端的体现。JSP JSP,JavaServerPages是一种基于Java技术的服务器端动态网页技术,允许开发人员在HTML页面中嵌入Java代码。通过JSP,开发人员可以创建包含静态模板和动态内容的网页。当客户端请求一个包含JSP的网页时,服务器会执行其中的J......
  • 采用Java实现论文查重
    这个作业属于哪个课程<软件工程2024(广东工业大学)>这个作业要求在哪里<个人项目>这个作业的目标<熟悉个人软件开发流程、熟悉各类工具的使用,学会用PSPG进行项目规划评估程序质量并优化程序>Gitee链接:https://github.com/jueshishuaimengou/yh/tree/main/3122......
  • 【vscode】vscode配置Java
    【vscode】vscode配置Java前言‍配环境,需要记录,避免反复踩坑。‍步骤‍step1:官网走‍配环境为什么不直接上官网教程,VisualStudioCode-CodeEditing.Redefined‍​​‍点击Java‍​​‍step2:配置必需的环境‍CodingPackforJavaTohelpyousetupqui......