您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

【Java面试官】P7和P8关我什么事?如果你不能回答这十个问题,你就是人渣! 《网站代码》

  • 时间:2022-07-06 02:42 编辑: 来源: 阅读:318
  • 扫一扫,手机访问
摘要:【Java面试官】P7和P8关我什么事?如果你不能回答这十个问题,你就是人渣! 《网站代码》
想在面试和工作中脱颖而出?想在最短的时间内快速掌握Java的核心基础知识点?想成为一名优秀的Java工程师?这篇文章可以帮助你!正所谓高楼平地起,只有牢牢掌握了基础,才能走得更远,才能在不断升级的技术面前快速掌握,同时才能在面试和工作中脱颖而出!澄清:本标题无意冒犯,抱歉,抱歉;注:以下所有回答均为个人知识和网上少量信息的整合。1.列表和集合的区别。列表和集合是从集合接口继承的。列表特性:元素按顺序排列,元素可以重复。 集合特征:元素没有放入顺序,不能重复,重复的元素会被覆盖。(虽然元素没有放入顺序,但是元素在集合中的位置是由元素的HashCode决定的,它的位置实际上是固定的。添加到集合中的对象必须定义equals()方法。另外,list支持for循环,即可以用下标遍历,也可以用迭代器,但是集合只能迭代,因为它是无序的。 )集合和列表与集合相比:检索元素的效率低,删除和插入的效率高,插入和删除不会改变元素的位置。 列表:类似于数组,列表可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素的位置变化。2.Hashset如何保证不重复向HashSet添加()元素?判断元素存在的依据不仅要和hash值比较,还要和equles方法比较。 HashSet中的add()方法使用HashMap的add()方法。 以下是HashSet的部分源代码:private static final object present = new object();私有瞬态散列表& lte,Object & gt地图;public HashSet(){ map = new HashMap & lt;& gt();} public boolean add(E E){ return map . put(E,PRESENT)= = null;} HashMap的键是唯一的。从上面的代码可以看出,HashSet增加的值是HashMap的关键。 所以就不赘述了(HashMap通过先比较hashcode再比较equals来比较键是否相等)。 3.是3。HashMap线程安全?为什么不是线程安全的?(最好画个图说明在多线程环境下不安全)?不是线程安全的;如果有两个线程A和B,都是插入数据,恰好这两个不同的数据经过哈希计算后得到的哈希码是一样的,这个位置没有其他数据。 所以这两个线程都将进入我上面标记为1的代码。 我们假设一个情况,线程A通过if判断这个位置没有哈希冲突,它进入if语句,但是没有执行任何数据插入。这时CPU给线程B资源,线程A在if语句中停止。线程B判断这个位置没有哈希冲突(线程A的数据还没有插入),也进入if语句。线程B执行后,轮到线程A执行,现在线程A不做进一步判断,直接在这个位置插入。 这时,你会发现线程A覆盖了线程b插入的数据。 发生了线程不安全的情况。 本来在HashMap中,哈希冲突可以用链表方法或者红黑树来处理,但是在多线程中,可能会直接覆盖。 上面说的是图解说明,可能更直观。 如下图,两个线程在同一个位置添加数据,后面添加的数据会覆盖前面添加的数据。 如果把上面的插入插入到链表中,比如两个线程遍历到最后一个节点,在末尾添加一个数据,那么后面添加数据的线程会覆盖前面添加的数据。 扩展时还可能导致数据不一致,因为扩展是从一个数组复制到另一个数组。 4.HashMap扩展过程在向容器中添加元素时,会判断当前容器中的元素个数,如果大于等于阈值(知道这个阈值字怎么读吗?fa值不要念,yu值念四遍)——也就是当当前数组的长度乘以加载因子的值时,会自动展开。 Resize是重新计算容量,并不断向HashMap对象添加元素。当HashMap对象内部的数组无法加载更多的元素时,该对象需要扩展数组的长度,以便可以加载更多的元素。 当然,Java中的数组是不能自动扩展的。方法就是用一个新的数组代替现有的容量小的数组,就像我们用一小桶水一样。如果我们想装更多的水,我们必须换一个大水桶。 Cap =3,hashMap的容量为4;Cap =4,hashMap的容量为4;Cap =5,hashMap的容量为8;Cap =9,hashMap的容量是16;如果cap是2的n次方,则容量是cap,否则它是一个大于cap的前2次方的数字。 5.5之间的区别。HashMap 1.7和1.8,解释一下1.8做了哪些优化,怎么做的?HashMap结构图在JDK1.7及之前的版本中,HashMap也叫哈希链表:基于一个数组和多个链表的实现,当哈希值发生冲突时,对应的节点存储为链表。 在JDK1.8中,当哈希值相同的链表节点(表上的元素)个数不小于8时,不再以单链表的形式存储,调整为红黑树。 这是JDK7和JDK8中HashMap实现的最大区别。 以下分析基于JDK1.7.0_80和JDK1.8.0_66。在JDK1.7中,条目数组用于存储数据,键的hashcode modulo用于确定键在数组中的位置。如果Hashcode相同,或者Hashcode取模的结果相同(哈希冲突),那么这些键将位于条目数组的同一个网格中。这些 当hashcode特别差的时候,比如所有键都有相同的hashcode,这个链表可能很长,那么put/get操作可能需要遍历这个链表,这意味着时间复杂度在最坏的情况下会退化到O(n)。 JDK1.8使用节点数组存储数据,但这个节点可能是链表结构,也可能是红黑树结构。如果插入的键具有相同的hashcode,那么这些键也将位于节点数组的相同网格中。 如果同一个网格中的键不超过8个,则使用链表结构来存储它们。 如果多于八个,将调用treeifyBin函数将链表转换为红黑树。 即使hashcode完全相同,由于红黑树的特性,查找一个特定元素只需要O(log n)的开销,也就是说put/get的运算时间复杂度最差。只有O(log n)听起来相当不错,但是要真正利用JDK1.8有一个限制:key的对象,Compare接口必须正确实现。如果没有实现Compare接口,或者没有正确实现(比如所有的Compare方法都返回0),那么JDK1.8的简单测试数据其实比JDK1.7慢如下:在HashMap JDK1.7中放入/获取hashcode相同的1w个对象:放0.26s,获取0.55sJDK1.8(没有实现Compare接口):放0.92s,获取2.1s但是如果Compare接口正确实现,那么在JDK1.8中HashMap的性能会有很大的提升。这次用相同的hashcode JDK1.8(精确比较接口,)放/取100W对象:放/取开销约320 ms. 6。Final finally finalize可以修改类、变量和方法,修改一个类意味着这个类不能被继承,修改一个方法意味着这个方法不能被重写,修改一个变量意味着这个变量是一个常量,不能被重新赋值。 Finally通常在try-catch代码块中工作。在解决异常的时候,通常我们肯定会执行finally代码块中的code方法,表示无论有无异常都会执行该代码块。它通常用于存储少量关闭资源的代码。 Finalize是属于Object类的方法,Object类是所有类的父类。此方法通常由垃圾回收器调用。当我们调用System.gc()方法时,垃圾收集器调用finalize()回收垃圾,最终判断一个对象是否可以回收。 获得7.Java反射的三种方法:1 .通过新对象实现反射机制;2.通过路径实现反射机制;3.通过类名实现反射机制:public class student { private int id;字符串名称;受保护的布尔性别;公共浮动分数;}public class Get {//获取反射机制的三种方式public static void main(string[]args)throws classnotfoundexception {//方式一(通过构建对象)Student stu = new Student();class class obj 1 = stu . getclass();system . out . println(class obj 1 . getname());//模式2(所在位置-相对路径)class class obj 2 = class . forname(" fanshe . student ");system . out . println(class obj 2 . getname());//模式3(按类名Class Class obj 3 = student . Class;system . out . println(class obj 3 . getname());}}8.Java反射机制Java反射机制是在运行状态下,可以获取任何类的所有属性和方法,可以为任何对象调用其任何一个属性和方法。 这种在运行时动态获取信息并动态调用对象的方法的功能称为Java反射机制。 类与java.lang.reflect类库一起支持反射的概念,该类库包含字段、方法和构造函数类(每个类实现成员接口)。 这些类型的对象是由JVM在运行时创建的,用来表示未知类的相应成员。 这样就可以使用构造函数创建新的对象,使用get()和set()方法读取和修改与field对象关联的字段,使用invoke()方法调用与method对象关联的方法。 此外,可以调用getFields() getMethods()和getConstructors()等方便的方法来返回表示字段、方法和构造函数的对象数组。 这样,匿名对象的信息就可以在运行时完全确定,编译时什么都不需要知道。 导入Java . lang . reflect . constructor;公共类reflect test { public static void main(String[]args)引发异常{ Class clazz = nullclazz = class . forname(" com . jas . reflect . fruit ");构造函数& lt水果& gtconstructor 1 = clazz . get constructor();构造函数& lt水果& gtconstructor 2 = clazz . get constructor(string . class);水果fruit 1 = constructor 1 . new instance();fruit fruit 2 = constructor 2 . new instance(" Apple ");} } class fruit { public fruit(){ system . out . println("无参数构造函数运行........");} public fruit (string类型){system.out.println ("run...........带参数"+类型);}}运行结果:无参数构造函数run ……未指定数组长度,但系统自动确定数组长度为4String [] computers = {"Dell "," Lenovo "," Apple "," Apple "//①//只指定初始值,不指定数组长度,但系统自动确定数组长度为3String[] names = new String[]{ "哆啦a梦","大雄","静香" };//②状态初始化:程序员在初始化时显示指定数组的长度,系统给数据的每个元素赋初值,比如://只指定数组的长度,不显示数组的初值,但系统默认会给数组元素赋null String[]cars = new String[4];//③ Java数组变量是一个引用类型变量,所以上面几行初始化语句执行后,三个数组在内存中的分布如下图所示:从上图可以看出,在静态初始化模式下,虽然程序员没有指定数组长度,但是系统已经自动为我们分配了,而在动态初始化模式下,虽然程序员没有显示指定的初始化值,但是Java数组是一个引用类型变量。因此,系统还将初始化值null分配给每个元素。当然,不同类型的初始化值是不同的。假设是基本类型int类型,赋给系统的初始化值也是对应的默认值0。 10.可克隆接口实现原理可克隆接口是Java开发中常用的接口。它的功能是使一个类的实例能够将自己复制到另一个新的实例中。注意,这里的“复制”指的是对象实例,而不是类的定义。此外,类实例中每个字段的值都被复制。 在开发过程中,复制实例是一种常见的操作。如果一个类中有很多字段,而我们在用户端按字段复制,必然导致用户端代码复杂冗长,无法复制类中的私有成员。如果需要有复制功能的类实现了clone接口,并重写了clone()方法,即通过调用clone()方法可以简洁地实现实例复制功能。深拷贝(Deep copy)和浅拷贝(shallow copy)是两个常见的概念,尤其是在C++语言中。如果你不懂它们,删除的时候会有问题,但是我们很幸运这里用到了Java。 虽然Java会自动管理对象的回收,但是对于深度复制(deep copy)和浅复制(shallow copy),我们还是要给予足够的重视,因为有时候这两个概念往往会给我们带来很多困惑。 浅复制是指只复制对象本身(包括对象中的基本变量),而不复制对象中包含的引用所指向的对象。 深度复制不仅复制对象本身,还复制对象中包含的引用所指向的所有对象。 例如,更清楚的是,对象A1包含对B1的引用,而B1包含对C1的引用。 浅拷贝A1得到A2,A2仍然包含对B1的引用,B1仍然包含对C1的引用。 深层拷贝是浅层拷贝的递归。深层副本A1得到A2,A2包含对B2的引用(B1的B1副本),B2包含对C2的引用(C1的副本)。 如果不重写clone()方法,调用该方法得到的对象将是浅层文案厂商的面试和互联网厂商偏爱的人才特征:对技术的热情,技术基础实力强;主动,善于团队合作,善于总结和思考。 看基础和技术问题,准备阅读。如果你不懂,你说不懂也没关系。查看项目细节,根据项目谈谈自己的技术亮点。你可以表达清楚,引导面试官问你擅长的技术问题。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【域名/主机/服务器|】qq邮箱提醒在哪里打开(2024-06-04 18:58)
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部