java 面试题一 Java基础

文章目录

项目介绍

大部分情况,这是一场面试的开门题,面试官问这个问题,主要是考察你的概述能力和全局视野。有的人经常抱怨自己每天在堆业务,但没有成长。事实上,很多情况下确实在堆业务,但并不是没有成长的。并非做中间件或者技术架构才是成长,例如我们的需求分析能力,沟通协作能力,产品思维能力,抽象建模能力等都是一个非常重要的硬实力。

需要准备

  • 1、明确项目是做什么的
  • 2、明确项目的价值。(为什么做这个项目,它解决了用户什么痛点,它带来什么价值?)
  • 3、明确项目的功能。(这个项目涉及哪些功能?)
  • 4、明确项目的技术。(这个项目用到哪些技术?)
  • 5、明确个人在项目中的位置和作用。(你在这个项目的承担角色?)
  • 6、明确项目的整体架构。
  • 7、明确项目的优缺点,如果重新设计你会如何设计。
  • 8、明确项目的亮点。(这个项目有什么亮点?)
  • 9、明确技术成长。(你通过这个项目有哪些技术成长?)

Java基础

String a= new String(“abc”);创建了几个对象,用到了几个区,

首先了解java 的字符串常量缓冲区(字符串池,字符串常量池)

  • 答案是:
    创建了两个或者一个对象;用到了三个区;(堆区,栈区,共享区)

  • 解释:
    一个是new String 创建的一个新的对象,一个是常量“abc”对象的内容创建出的一个新的String对象,当字符串常量池中存在常量“abc”时,就是创建了一个对象;

  • 步骤:

  • 实例化:类名/接口名 对象名 = new 类名/接口名 ();

    类名/接口名 ():该对象的构造方法
    
    类名/接口名 对象名:定义一个引用变量
    
    new关键字:实例化
    
    等号:将引用变量与实例化对象关联起来
    

1、List 和 Set 的区别

Set:其中的值不允许重复,无序的数据结构;检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置变化。

List:其中的值允许重复,因为其为有序的数据结构;和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

2、ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合

  • ArrayList是基于动态数组来实现的,查询效率比较高
  • LinkedList是基于动态链表来实现的,插入和删除效率比较高

2.1、HashSet和TreeSet的区别

  • HashSet是基于哈希表还进行排序(散列)
  • TreeSet的数据结构是红黑树,使用自然顺序或者由自定义的比较器排序

3、HashSet 是如何保证不重复的

什么是hash码值?

在java中存在一种hash表结构,它通过一个算法,计算出的结果就是hash码值;这个算法叫hash算法;

hash算法是怎么计算的呢?

是通过对象中的成员来计算出来的结果;
如果成员变量是基本数据类型的值, 那么用这个值 直接参与计算;
如果成员变量是引用数据类型的值,那么获取到这个成员变量的哈希码值后,再参数计算

保证不重复
  • 第一步:判断hash码值

    如果hash码值不相同,说明是一个新元素,存;
    
    如果没有元素和传入对象(也就是add的元素)的hash值相等,那么就认为这个元素在table中不存在,将其添加进table;
    
  • 第二步:hash 码值相同,则进行equles判断

    如果hash码值相同,且equles判断相等,说明元素已经存在,不存;
    
    如果hash码值相同,且equles判断不相等,说明元素不存在,存
    

4、HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)

HashMap线程不安全,hashmap允许key,value为null
hashtable线程安全,方法加synchronized,不允许value为null
HashMap多线程get不安全,多线程扩容阶段中,rehash步骤不安全
具体请看:http://www.importnew.com/22011.html

concurrentHashMap:

1.7版本,采用segment分段锁,一个hashmap中有多个segment,每个segment存放多个k-v桶(数组),每个数组后面是链表。锁是加在每个segment上。

1.8版本,锁的粒度更细了,去掉了segment,直接加在链表的表头,整体结构和普通的hashMap没差别,使用volatile保证可见性。同时在初始化,以及定位到相应数组位置时量表为空的特殊情况下,使用CAS无锁操作。链表长度超过阈值,也会进行树化。

5、HashMap 1.8 的实现原理以及扩容过程

https://blog.csdn.net/u010890358/article/details/80496144

6、HashMap里的hashcode方法和equal方法什么时候需要重写,为什么需要同时重写?

https://blog.csdn.net/qq_40981804/article/details/89022523

当我们在HashMap中存储我们自己定义的类的时候,默认的equal函数的行为可能不能符合我们的要求,所以需要重写。

如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。

这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

7、HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的?

链表长度超过8采用红黑树,resize的时候不是重新计算hash,而是用hash&oldCap(数组容量)来判断是在原位置,还是移动到oldCap+oldIndex位置
http://www.importnew.com/22011.html
http://www.importnew.com/20386.html
https://my.oschina.net/hosee/blog/618828

8、final finally finalize

final 用于声明属性,方法和类, 分别表示属性不可变(不可重新赋值), 方法不可覆盖, 类不可继承。可以增强代码的可读性,明确哪些代码是不可被修改的,一定程度上增加平台的稳定性。
匿名内部类,引用局部变量,局部变量为什么用final修饰:内部类引用局部变量不是直接引用,而是copy一份,用final修饰,可以减少数据一致性问题

finally 是异常处理语句结构的一部分,表示总是执行。对于需要关闭的连接等资源,使用try-with-resources语句。

finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用。不推荐使用,java9中,该方法被标注为deprecated

9、强引用 、软引用、 弱引用、虚引用

https://blog.csdn.net/mazhimazh/article/details/19752475

10、Java反射

  • Java反射的定义
    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

  • Java反射机制主要提供了以下功能:

    在运行时构造一个类的对象;
    判断一个类所具有的成员变量和方法;
    调用一个对象的方法;
    生成动态代理。反射最大的应用就是框架
    
  • Java反射的主要功能:

    1)确定一个对象的类
    2)取出类的modifiers,数据成员,方法,构造器,和超类.
    3)找出某个接口里定义的常量和方法说明.
    4)创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
    5)取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
    6)在运行时刻调用动态对象的方法.
    7)创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.
    
  • Java反射的主要应用

    反射的应用很多,很多框架都有用到
    spring 的 ioc/di 也是反射….
    javaBe
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值