75道面试题解答

本文深入探讨Java中的核心概念,包括类的相等性判断、集合框架的内部运作、线程同步机制、垃圾回收器的选择与优化,以及分布式系统的设计原则。通过对hashcode与equals方法的解析,HashMap与TreeMap的区别,线程池的参数与实现,揭示了Java编程的深层次技巧。
摘要由CSDN通过智能技术生成

1、hashcode相等两个类一定相等吗?equals呢?相反呢?

首先要明白什么叫两个类相等?答案是2个类的地址相等则认为对象相等,即两个类相等。

  • 先来看看hashcode是如何生成的?根据jdk的源码,并没有java的实现方式。而是在native方法里,用cpp文件即c++代码实现的。hashcode的生成策略有自增序列,随机数,内存地址等多种,最终取值根据底层算法来定。那么可以推断出来,hashcode相等,两个类不一定相等。
  • 再来看equal是如何实现的?equals方法是从顶级父类object类继承过来的。如果没有重写该方法的话,默认的实现是这样的。
    public boolean equals(Object obj) {
            return (this == obj);
    }

    这里比较的是内存地址,默认情况下,equals相等的话,那么两个类是相等的。可是结论没这么简单,String类就重写了这个方法。它比较的是内容,代码实现如下:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

那么重写后的String类的2个类equals相等,但它们的地址是不一定相等的。因为它们比较的是内容。只是我们习惯地认为2个类的内容相等,则他们相等,其实这只是我们在业务功能中用得比较多的一种方式。

  • 最后反过来问,两个类相等,hashcode是否相等?equals是否相等?答案是这样的=》两个类相等,即地址相等,hashcode根据实现方式的不同,则不一定相等;既然地址相等,equals默认比较的是地址,那么equals是相等的,同时地址相等,那么里面的内容肯定是一样的,equals比较内容时,也是一定相等的。
  • 延伸讲一下:hashCode的作用是用来获取哈希码,也可以称作散列码。实际返回值为一个int型数据。用于确定对象在哈希表中的位置。
    Object中有hashcode方法,也就意味着所有的类都有hashCode方法。
    但是,hashcode只有在创建某个类的散列表的时候才有用,需要根据hashcode值确认对象在散列表中的位置,但在其他情况下没用。
    java中本质上是散列表的类常见的有HashMap,HashSet,HashTable。
  • 两个对象,如果a.equals(b)==true,那么a和b是否相等?(内容)相等,但地址不一定相等。两个对象,如果hashcode一样,那么两个对象是否相等?不一定相等,判断两个对象是否相等,多数类需要判断equals是否为true。String类需要直接比较"=="

2、介绍一下集合框架?

2.1、 hashmap hastable 底层实现什么区别?

  • 都实现了map接口。
  • HashMap是非synchronized,而Hashtable是synchronized。
  • HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行。
  • 迭代期间都有可能跑出ConcurrentModificationException

2.2、hashtable和CocurrentHashMap呢?

 HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

2.3、hashmap和treemap什么区别?低层数据结构是什么?

HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法。
默认初始容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value,就是一个key后面有多个value;

TreeMap:基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出


3、线程池用过吗都有什么参数?底层如何实现的?

sychnized和Lock什么区别?sychnize 什么情况情况是对象锁? 什么时候是全局锁为什么?

synchronized是java中的一个关键字,用于线程同步。 

1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 
2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 
3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象; 
4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。
synchronized修饰不加static的方法,锁是加在单个对象上,不同的对象没有竞争关系;修饰加了static的方法,锁是加载类上,这个类所有的对象竞争一把锁

Lock是一个java接口 里面有一些实现类,也用于实现线程同步,但是相比较于synchronized,无论功能还是性能都有很大提升,但是要注意需要手动释放。 
性能上由于synchronized在编译时会对代码进行修正,最终由cpu通过调度线程的方式处理线程同步问题,开销很大。而lock使用了Java的unsafe类中的CAS方法实现对线程同步的控制,减小了消耗。 
 

4、ThreadLocal 是什么底层如何实现?写一个例子呗?

是一个解决线程并发问题的一个类,底层实现主要是存有一个map,以线程作为key,范型作为value。可以理解为线程级别的缓存。 
使用起来比较简单 假设我们要实现一个线程级别的缓存。

volitile的工作原理?

cas知道吗如何实现的?

请用至少四种写法写一个单例模式?

请介绍一下JVM内存模型??用过什么垃圾回收器都说说呗

线上发送频繁full gc如何处理? CPU 使用率过高怎么办?

如何定位问题?如何解决说一下解决思路和处理方法

知道字节码吗?字节码都有哪些?Integer x =5,int y =5,比较x =y 都经过哪些步骤?

讲讲类加载机制呗都有哪些类加载器,这些类加载器都加载哪些文件?

手写一下类加载Demo

知道osgi吗? 他是如何实现的???

请问你做过哪些JVM优化?使用什么方法达到什么效果???

classforName("java.lang.String")和String classgetClassLoader() LoadClass("java.lang.String") 什么区别啊?

探查Tomcat的运行机制即框架?

分析Tomcat线程模型?

Tomcat系统参数认识和调优?

MySQL底层B+Tree机制?

SQL执行计划详解?

索引优化详解?

SQL语句如如如何优化?

spring都有哪些机制啊AOP底层如何实现的啊IOC呢??

cgLib知道吗?他和jdk动态代理什么区别?手写一个jdk动态代理呗?

使用mysq1索引都有哪些原则? ?索引什么数据结构? 3+tree 和B tree 什么区别?

MySQL有哪些存储引擎啊?都有啥区别? 要详细!

设计高并发系统数据库层面该怎么设计??数据库锁有哪些类型?如何实现呀?

数据库事务有哪些?

如何设计可以动态扩容缩容的分库分表方案?

用过哪些分库分表中间件,有啥优点和缺点?讲一下你了解的分库分表中间件的底层实现原理?

我现在有一个未分库分表的系统,以后系统需分库分表,如何设计,让未分库分表的系统动态切换到分库分表的系统上?TCC? 那若出现网络原因,网络连不通怎么办啊?

分布式事务知道吗? 你们怎么解决的?

为什么要分库分表啊?

RPC通信原理,分布式通信原理

分布式寻址方式都有哪些算法知道一致性hash吗?手写一下java实现代码??你若userId取摸分片,那我要查一段连续时间里的数据怎么办???

如何解决分库分表主键问题有什么实现方案??

redis和memcheched 什么区别为什么单线程的redis比多线程的memched效率要高啊?

redis有什么数据类型都在哪些场景下使用啊?

reids的主从复制是怎么实现的redis的集群模式是如何实现的呢redis的key是如何寻址的啊?

使用redis如何设计分布式锁?使用zk可以吗?如何实现啊这两种哪个效率更高啊??

知道redis的持久化吗都有什么缺点优点啊? ?具体底层实现呢?

redis过期策略都有哪些LRU 写一下java版本的代码吧??

说一下dubbo的实现过程注册中心挂了可以继续通信吗??

dubbo支持哪些序列化协议?hessian 说一下hessian的数据结构PB知道吗为啥PB效率是最高的啊??

知道netty吗'netty可以干嘛呀NIO,BIO,AIO 都是什么啊有什么区别啊?

dubbo复制均衡策略和高可用策略都有哪些啊动态代理策略呢?

为什么要进行系统拆分啊拆分不用dubbo可以吗'dubbo和thrift什么区别啊?

为什么使用消息队列啊消息队列有什么优点和缺点啊?

如何保证消息队列的高可用啊如何保证消息不被重复消费啊

kafka ,activemq,rabbitmq ,rocketmq都有什么优点,缺点啊???

如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路

说一下TCP 'IP四层?

http的工作流程?? ?http1.0 http1.1http2.0 具体哪些区别啊?

TCP三次握手,四层分手的工作流程画一下流程图为什么不是四次五次或者二次啊?

画一下https的工作流程?具体如何实现啊?如何防止被抓包啊??

源码中所用到的经典设计思想及常用设计模式

系统架构如何选择合适日志技术(log4j、log4j2、slf4j、jcl…….)

springAOP的原理,springAOP和Aspectj的关系,springAOP的源码问题

dubbo框架的底层通信原理

RPC通信原理,分布式通信原理

如何利用springCloud来架构微服务项目

如何正确使用docker技术

springMVC的底层原理、如何从源码来分析其原理

mybaits的底层实现原理,如何从源码来分析mybaits

mysql的索引原理,索引是怎么实现的

索引的底层算法、如何正确使用、优化索引

springboot如何快速构建系统

zk原理知道吗zk都可以干什么Paxos算法知道吗?说一下原理和实现?

如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路

分布式事务知道吗? 你们怎么解决的?

请问你做过哪些JVM优化?使用什么方法达到什么效果?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值