一面引言

说在前面的话:

本文适合人群:急等着换工作的人

我承认刷面试题很有用的,纵观几年来的JAVA面试题,你会发现每家都差不多。比如,你仔细观察,你会发现,HashMap的出现几率未免也太高了吧!连考察的知识点都一样,什么hash碰撞啊,并发问题啊!再比如JVM,无外乎考内存结构,GC算法等!因此,如果是为了面试,完全是有套路可以准备的!记住,基础再好,也架不住面试官天马行空的问,所以刷面试题还是很有必要的!

本文不适合人群:专攻JAVA某方面技术的人

因为这类人专攻JAVA某块技术,知识容易出现死角。贸然阅读本文,发现自己一堆题目都不会,会觉得有一种挫败感,发现自己连校招生都不如。然而,会点面试题不算什么,毕竟Homebrew作者也出现过解不出面试题,被Google拒绝,缘由就是,因为他不会翻转二叉树。难道你能说Homebrew的作者水平有问题!

正文

一面

1、自我介绍

评注:这个地方答什么随意,大部分面试官不会听你介绍,这个时间都在看简历。如果是电话面,回答时间控制在40秒到1分钟左右就行。如果是现场面,那就好办了,你注意看面试官什么时候抬头看你,一般面试官放下简历,抬头看你的时候,赶紧收尾!

回答:我叫xx,毕业于xxx,兴趣xx,做过xx项目….

2、Map 的底层结构?(HashMap)

评注:老题目了,各位面试的人员必须熟记!

回答:Map是以键值对来存储对象的,它的底层实际上是数组和链表来组成的,经典的一张图如下(别人画的);

当使用put方法时,先查找出数组位置是否存在对象,通过key.hashcode对数组长度取余;存在,则把里面的链表拿出来,判断链表里面是否存在key值与传递过来的key值一样的对象,存在,则把传递过来的value取代链表key对应的value,不存在,则直接通过链表的add()方法加到链表后面;

当使用get方法时,先查找出数组位置是否存在对象,通过key.hashcode对数组长度取余;如果不存在,则返回为空,如果存在,则遍历链表,判断链表里面是否存在key值与传递过来的key值一样的对象,存在,则把key值对应的value取出返回,不存在,则返回为空;

3、线程安全的 Map (concurrentHashMap)简单的说了下这两 1.7 和 1.8的区别,本想问下要不要深入的讲下(源码级别),结果面试官说不用了。

评注:老题目了,如果有时间,再去了解一下,解决HashMap线程安全的各种方法,以及原理!此题只能大概回答一下结构的变化,因为其中的实现代码都变了,细说可以说很久,估计面试官也没时间听!

回答:

jdk1.7中采用 Segment + HashEntry的方式进行实现,结构如下:

Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样

而jdk1.8中则

去除 Segment + HashEntry + Unsafe 的实现,

改为 Synchronized + CAS + Node + Unsafe 的实现

其结构图如下:

如上图所示,取消了Segment字段,数组中存储的就是Node。它与HashMap中的HashEntry定义很相似,但是有一些差别。它对value和next属性设置了volatile同步锁,它不允许调用setValue方法直接改变Node的value域。

另外,将原先table数组+单向链表的数据结构,变更为table数组+单向链表+红黑树的结构,在hash碰撞过多的情况下会将链表转化成红黑树。

4、项目 MySQL 的数据量和并发量有多大?

评注:此题为走向题,你的回答不同,后面问题走向就变了。

关于容量:单表行数超过 500 万行或者单表容量超过2GB,此时就要答分库分表的中间件了!那后面题目的走向就变为mycat、sharing-jdbc等分库分表中间件的底层原理了!

关于并发量:如果并发数过1200,此时就要答利用MQ或者redis等中间件,作为补偿措施,而不能直接操作数据库。那后面的题目走向就是redis、mq的原理了!

介于面试者还是一个应届生,我斗胆猜测面试者是这么答的

回答:数据量估计就三四百万吧,并发量就五六百左右!

5、你对数据库了解多少?

评注:因为你答的数据量和并发量不大,因此中间件这块没啥好问的。因此,题目走向变为数据库底层!另外,此题为引导题,面试官在给你机会引向你最擅长的方面!

回答:了解常见数据库调优方法,索引优化等!

6、你说下数据库的索引实现和非主键的二级索引

评注:这个问题是根据上面,你的回答而问出来的!记得引向自己最擅长的数据库基础知识!默认是回答mysql数据库的

回答:

从数据结构角度:

B-Tree索引,数据结构就是一颗B+树。

Hash索引,Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤。基本不用!

R-Tree索引,仅支持geometry数据类型,也基本不用!

至于非主键的二级索引,这个实际上问的就是非聚簇索引!非聚簇索引本身就是一颗B+树,其根节点指向聚簇索引的B+树,具体的请看这篇文章《MySQL(Innodb)索引的原理》

7、项目用的是 SpringBoot ,你能说下 Spring Boot 与 Spring 的区别吗?

评注:基础题,会spring boot的,基本都答的上来。就算没准备过,当场思考下都可以回答的出来!也是属于引导题!

回答:

  • Spring Boot可以建立独立的Spring应用程序;
  • 内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再做部署工作了。
  • 无需再像Spring那样搞一堆繁琐的xml文件的配置;
  • 可以自动配置Spring;
  • 提供了一些现有的功能,如量度工具,表单数据验证以及一些外部配置这样的一些第三方功能;
  • 提供的POM可以简化Maven的配置

8、SpringBoot 的自动配置是怎么做的?

评注:此题也是根据你的第七问,进一步提问而得出。

回答:

先答为什么需要自动配置?

顾名思义,自动配置的意义是利用这种模式代替了配置 XML 繁琐模式。以前使用 Spring MVC ,需要进行配置组件扫描、调度器、视图解析器等,使用 Spring Boot 自动配置后,只需要添加 MVC 组件即可自动配置所需要的 Bean。所有自动配置的实现都在 spring-boot-autoconfigure 依赖中,包括 Spring MVC 、Data 和其它框架的自动配置。

接着答spring-boot-autoconfigure 依赖的工作原理?

spring-boot-autoconfigure 依赖的工作原理很简单,通过 @EnableAutoConfiguration 核心注解初始化,并扫描 ClassPath 目录中自动配置类对应依赖。比如工程中有木有添加 Thymeleaf 的 Starter 组件依赖。如果有,就按按一定规则获取默认配置并自动初始化所需要的 Bean。

其实还能再继续答@EnableAutoConfiguration 注解的工作原理!不过篇幅太长,答到上面那个地步就够了!

9、MyBatis 定义的接口,怎么找到实现的?

评注:mybatis底层原理题,考察有没有看过mybatis的原理。博主刚好曾经自己写过一个mybatis,所以此题恰巧答的上来。

博主内心活动:"现在校招的都这么牛逼了么!"

回答:一共五步

  • 1. Mapper 接口在初始SqlSessionFactory 注册的。
  • 2. Mapper 接口注册在了名为 MapperRegistry 类的 HashMap中, key = Mapper class value = 创建当前Mapper的工厂。
  • 3. Mapper 注册之后,可以从SqlSession中get
  • 4. SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。
  • 5. 动态代理的 代理类是 MapperProxy ,这里边最终完成了增删改查方法的调用。

10、Java 内存结构

评注:基础题,这个应该学JAVA的都会吧!送分题!如果博主没理解错应该是在问JVM的内存结构!

回答:JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配;

方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);栈又分为java虚拟机栈和本地方法栈主要用于方法的执行。

11、对象是否可 GC?

评注:这个问题就是在问,JVM如何判断对象是否需要被回收!不用答引用计数法,答可达性分析算法就行。

回答:

这个算法的基本思路是通过一些列称为“GC Roots”的对象作为起始点,从这些点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象需要被回收.

如图:

上图中o3,o4对象没有任何GC Roots可达到,所有这两个对象不可用了,需要被GC回收

Java可作为GC Roots的对象包括下面几种:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中产量引用的对象
  • 本地方法栈中JNI引用的对象

12、Minor GC 和 Full GC

评注:基础题,会JVM调优的,基本都会!我只是奇怪,怎么没问Major GC呢?我们还是把Major GC也给答了吧!

回答:

堆内存是JVM中最大的一块由年轻代和老年代组成。

那么,从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。

Major GC 是清理老年代。

Full GC 是清理整个堆空间—包括年轻代和老年代。

13、垃圾回收算法

评注:基础题,博主斗胆猜测,应该是在问垃圾回收算法有哪些。面试官应该没有耐心去听你一个个去背算法概念!

回答:

标记-清除算法、标记整理算法、复制算法、分代收集算法

14、垃圾回收器 G1

评注:上面的题目更深入的问法。JVM可以配置不同的回收器。比如Serial, Parallel和CMS几种垃圾回收器。以Serial Collector(串行回收器)为例,它在在年轻代是一个使用标记-复制算法的回收器。在老年代使用的是标记-清扫-整理算法。

另外,关于G1回收器可以问的点很多,此题作者没有描述清楚究竟问的是G1回收器的那个点,就满回答一下概念吧!

如果是我来问,我就直接给你场景,问你该用哪种回收器了。直接问回收器,那就比较容易了!

常用参数:

-XX:+UseSerialGC:在新生代和老年代使用串行收集器

-XX:+UseParNewGC:在新生代使用并行收集器

//自己查询吧,太多了!

回答:

G1 GC是Jdk7的新特性之一、Jdk7+版本都可以自主配置G1作为JVM GC选项。G1 将整个堆划分为一个个大小相等的小块(每一块称为一个region),每一块的内存是连续的,每个块也会充当 Eden、Survivor、Old三种角色,但是它们不是固定的,这使得内存使用更加地灵活。如下图所示

执行垃圾收集时,收集线程在标记阶段和应用程序线程并发执行,标记结束后,G1 也就知道哪些区块基本上是垃圾,存活对象极少,G1 会先从这些区块下手,因为从这些区块能很快释放得到很大的可用空间,这也是为什么 G1 被取名为 Garbage-First 的原因。

15、项目里用过 ElasticSearch 和 Hbase,有深入了解他们的调优技巧吗?

评注:一个应届生搭的ElasticSearch 和 Hbase,一般都只是demo级别的,懂基本的CRUD的使用即可!一般不会去深入了解调优技巧的!这个问题如果答深入了解过,是给自己挖坑!因为这个问题,答案太广了!

回答:并没有深入了解过!

16、Spring RestTemplate 的具体实现

评注:这题问的博主有点懵!如果是我来问,我会先问访问Rest服务的客户端这么多,为什么选Spring RestTemplate?然后才来原理。这个突然就冒出一个具体实现,我是有点懵啦!

回答:

其实RestTemplate和sl4fj这种门面框架很像,本质就是在Http的网络请求中增加一个马甲,本身并没有自己的实现。对此有疑问的,可以看我的另一篇

《架构师必备,带你弄清混乱的JAVA日志体系!》

底层可以支持多种httpclient的http访问,上层为ClientHttpRequestFactory接口类,底层如下所示:

那么RestTemplate则封装了组装、发送 HTTP消息,以及解析响应的底层细节。

答到这个份上可以了,难道你还要把类之间关系的引用图,画出来?太不现实了!

17、描述下网页一个 Http 请求,到后端的整个请求过程

评注:基础题,感觉属于常识题!必会!

回答:

利用DNS进行域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户

18、多线程的常用方法和接口类及线程池的机制

评注:基础题,基本会点线程知识的,多多少少都会答点!但是这道题,我感觉范围有点大啊!可能是作者没表述清楚吧!

回答:

常用方法:

start,run,sleep,wait,notify,notifyAll,join,isAlive,currentThread,interrupt

常用接口类:

Runnable、Callable、Future、FutureTask

线程池的机制:

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,所以出现了池化技术!。

简单的线程池包括如下四个组成部分即可:

  • 线程池管理器(ThreadPoolManager):用于创建并管理线程池
  • 工作线程(WorkThread): 线程池中线程
  • 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行
  • 任务队列:用于存放没有处理的任务。提供一种缓冲机制

19、总结我的 Java 基础还是不错,但是一些主流的框架源码还是处在使用的状态,需要继续去看源码

评注:坦白说,我没看出来哪些问题体现出主流的框架还是处在使用的状态。

20、死锁

评注:牛客网原题!把原因一起答了吧!

回答:

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的原因主要是:

  • (1) 因为系统资源不足。
  • (2) 进程运行推进的顺序不合适。
  • (3) 资源分配不当等。

21、自己研究比较新的技术,说下成果!

评注:嗯,凸显自己的潜力,大家自由发挥!

22、你有什么想问的?我就问了下公司那边的情况,这个自由发挥!

评注:问问工作内容即可,千万别问什么福利啊,加班情况啊!这种问题,不要在技术面的时候问!

二面正文

1、HashMap,源码级别的问了,包括为什么线程不安全

评注:这问题一面的时候问过了,嗯,说明大家以后面试,不管是几面,复习过的知识点还是要复习,毕竟一面的面试官只会告诉二面的面试官印象,不会具体聊问了啥问题!比如,我和二面面试官说,这个候选人基础还不错,那二面面试官就会觉得:"咦,这个人基础不错,我试试是不是真的是这样!"所以难免会出现一样的题目!

另外,此题不好答。因为是关于源码级别的问,需要复习的知识点很多。大家关注一下我,我会出一篇对HashMap能问的知识点总结。比如jdk1.7和jdk1.8的hashmap结构区别、hashmap并发问题,哈希冲突的常见解决手段等!

回答: 略去。

2、死锁

评注:这问题一面的时候问过了,嗯,凸显!

回答: 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的原因主要是:

  • 因为系统资源不足。
  • 进程运行推进的顺序不合适。
  • 资源分配不当等。

3、Synchronized 和 ReentrantLock 锁机制,怎么判断重入锁的,会不会是死锁?

评注:并发基础问题,懂并发编程的,应该都会。

回答:

先答区别:

API方面:synchronized既可以修饰方法,也可以修饰代码块。ReentrantLock只能在方法体中使用。

公平锁:synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁,但可以通过带布尔值的构造函数要求使用公平锁。

等待可中断:假如业务代码中有两个线程,Thread1 Thread2。假设 Thread1 获取了对象object的锁,Thread2将等待Thread1释放object的锁。

  • 使用synchronized。如果Thread1不释放,Thread2将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁(mutual exclusion lock ,mutex)的角色,一个线程引用锁的时候,别的线程阻塞等待。
  • 使用ReentrantLock。如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。

至于判断重入锁,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。

4、进程和线程的区别?

评注:操作系统的题目,很常规!

回答:

进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。

一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。

线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。

5、进程之间如何保证同步?

评注:操作系统老题了,四种方法!

回答:上网给大家找了一张图!

6、分布式锁

评注:此题问的没头没尾的,分布式锁可以问的点很多,比如实现方式啊?性能差距啊?

回答:这题如果要详答,看我的另一篇文章《分布式之抉择分布式锁》

分布式锁有三种实现方式:数据库、缓存、Zookeeper,这里我直接罗列一下各种锁的对比吧

从理解的难易程度角度(从低到高)

数据库 > 缓存 > Zookeeper

从实现的复杂性角度(从低到高)

Zookeeper >= 缓存 > 数据库

从性能角度(从高到低)

缓存 > Zookeeper >= 数据库

从可靠性角度(从高到低)

Zookeeper > 缓存 > 数据库

7、对象 GC

评注:一面问过,把一面的回答贴过来!

回答:

这个算法的基本思路是通过一些列称为“GC Roots”的对象作为起始点,从这些点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象需要被回收.

如图:

上图中o3,o4对象没有任何GC Roots可达到,所有这两个对象不可用了,需要被GC回收

Java可作为GC Roots的对象包括下面几种:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中产量引用的对象
  • 本地方法栈中JNI引用的对象

8、垃圾回收算法

评注:一面问过,把一面的回答贴过来!

回答:

标记-清除算法、标记整理算法、复制算法、分代收集算法

9、JVM 参数

评注:这个回答还是略去吧,这个问题范围太大,我不知道该怎么答。

回答:略去。

10、OOM 出现的有哪些场景?为什么会发生?

评注:常规题,只是情况太多了!

回答:

OOM for Heap (java.lang.OutOfMemoryError: Java heap space):heap的最大值不满足需要,将设置heap的最大值调高即可。

OOM for StackOverflowError (Exception in thread "main" java.lang.StackOverflowError):如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

OOM for GC (java.lang.OutOfMemoryError: GC overhead limit exceeded):此OOM是由于JVM在GC时,对象过多,导致内存溢出。

OOM for native thread created (java.lang.OutOfMemoryError: unable to create new native thread):这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。

OOM for allocate huge array (Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit):此类信息表明应用程序试图分配一个大于堆大小的数组。例如,如果应用程序new一个数组对象,大小为512M,但是最大堆大小为256M,因此OutOfMemoryError会抛出,因为数组的大小超过虚拟机的限制。

OOM for small swap (Exception in thread "main": java.lang.OutOfMemoryError: request bytes for . Out of swap space? ):抛出这类错误,是由于从native堆中分配内存失败,并且堆内存可能接近耗尽。

OOM for exhausted native memory (java.lang.OutOfMemoryErr java.io.FileInputStream.readBytes(Native Method)):由于Native memory被耗尽导致的。

11、JVM 内存结构说下吧

评注:常规题,学过JVM的都会!

回答:来一张图就好了。

有5大内存区域,按照是否被线程所共享可分为两部分,一部分是线程独占区域,包括Java栈,本地方法栈和程序计数器。还有一部分是被线程所共享的,包括方法区和堆。注意了,下一题就是问的是堆和栈的共享问题!

如下图所示

12、堆和栈的共享问题?

评注:常规题,大家应该都答的上来,属应届生常见问题!

回答:

栈内存的一个特点是数据共享,比如你线程中执行下面两句话

int i = 1;int j = 1;

如下图所示

前面定义了i=1,i和1都在栈内存内,如果再定义一个j=1,此时将j放入栈内存,然后查找栈内存中是否有1,如果有则j指向1。

堆内存没有数据共享的特点,比如你线程中执行了下面两句话

String s = new String( "Hello World" );String w = new String( "Hello World" );

此时如下图所示

13、有比较过 Http 和 RPC 吗?

评注:此题我按我的理解来答。我不确定对不对,因此我觉得http和rpc没啥可比性,不是一个级别的概念。

回答:

只要是远程调用都可以叫RPC,和是不是通过http没什么关系。

那么,调用过程,也就是通信过程之间需要协议,可以是HTTP协议、dubbo协议等、其他协议等。

14、HttpClient 你说说里面的具体实现吧?(涉及了哪些东西)

评注:此题只能回答一个大概,我找了一个架构图来进行说明

回答:

如下图所示

Httpclient将对接的服务器或者集群(相同域名)称为route,并为每个route建立若干连接,并池化在连接池里。Client通过tcp/ip协议发送请求以及接受应答,在发送请求前和接收应答后都会经由interceptor进行链式处理,在httpclient里这些interceptor被称为HttpProcessor,负责处理诸如设置报文头,报文体,编码格式等以及解析报文头,报文体,解码格式等http规范报文格式范畴内的事情。

java 取余_JAVA面试解析(有赞)相关推荐

  1. java除数取余_Java中的相除(/)和取余(%)的实现方法|chu

    取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2. ...

  2. java除余_Java中的相除(/)和取余(%)的实现方法

    取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2. ...

  3. java取余(java取余数的函数)

    java 求余数 用%就可以. int i = 5; int j = 8; int z = 8 % 5; System.out.println("余数:" + z); 结果为3.上 ...

  4. java取余运算“%”

    @java取余运算"%" demo public static void main(String[] args) {System.out.println(5%3);System.o ...

  5. JAVA面试解析(有赞二面)

    作者:孤独烟 来自:打杂的ZRJ 本文的题目出自博客 http://www.54tianzhisheng.cn/2018/07/12/youzan/ 但是作者没有给出答案,博主斗胆来制作答案版. 也是 ...

  6. java取余时前者前者小于后者_Java基本语法

    7.类型转换 Java语言和解释器限制使用强制和转换,以防止出错导致系统崩溃.整数和浮点数运算符间可以来回强制转换,但整数不能强制转换成数组或对象.对象不能被强制为基本类型. Java中整数运算符在整 ...

  7. java取余位运算_Java中对于位运算的优化以及运用与思考

    引言 随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码.之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候 ...

  8. java 取余运算 小数_java - 神奇的取余运算

    关于-10%-3=-1的问题 今天做了一道题,题目是这样的: 一下代码运行后输出结果是: int a=-10,b=-3; System.out.print(a%b); A.-1 B.2 C.-1 D. ...

  9. java取余位运算_java学习--高效的除模取余运算(n-1)hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...

最新文章

  1. golang 操作 ini配置文件
  2. 前端学习(2611):vuex实现增加
  3. MHA命令系统介绍--masterha_manager
  4. 08-01 Jmeter 核心原理与性能测试理论
  5. word2007文档无法编辑怎么办
  6. 【重磅推出】推荐系统系列教程之九:解密“看了又看”和“买了又买”(Item-Based)...
  7. 给 kibana 增加一个退出logout按钮
  8. 深度网络梯度爆炸的原因、产生的影响和解决方法(常用激活函数)
  9. 人工智能基础-数学方法-形式逻辑
  10. 计算机科学成为独立学科的奠基人,详解卡内基梅隆大学计算机学院
  11. Windows桌面图标小工具:去除桌面图标小箭头|刷新图标缓存
  12. C++语言风格流变史(转)
  13. linux性能监控工具perf,Linux性能分析中常用的工具perf介绍
  14. java面试题_度小满一面_java面经汇总
  15. oracle 查表里的字段名称和备注名称
  16. IO Workload Characterization Revisited: A Data-Mining Approach
  17. Python提取多张excel表上的数据,合并汇总到一张新表
  18. MySQL 8.0 可以操作 JSON 了!!
  19. 找完工作后的感受总结,用以共勉
  20. css背景透明文子不透明,CSS 实现背景透明 内容文字不透明 显示

热门文章

  1. 【Kafka】kafka 客户端 控制台 flink 都无法消费的情况
  2. 【ElasticSearch】Es 源码之 AutoFollowCoordinator 源码解读
  3. 【Kylin】60-20-040-集成-Kylin集成LDAP
  4. 【java】Java 最坑爹的 10 大功能点
  5. Protobuf报错Protocol message tag had invalid wire type
  6. kerberos安装配置与使用
  7. 【Kubernetes】 configmaps is forbidden User system:anonymous cannot list resource configmaps
  8. MyBatis 源码自我解读
  9. 东半球最全的 postman 使用教程
  10. linux操作系统下部署Javaweb项目教程