每天学会一点点(JAVA基础)

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

  虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。

  Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

  “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

  Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

3.是否可以在static环境中访问非static变量?

  static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

 4.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

  当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。

  Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

  Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。

5.接口和抽象类的区别是什么?

  Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

  接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

  类可以实现很多个接口,但是只能继承一个抽象类

  类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

  抽象类可以在不提供接口方法实现的情况下实现接口。

  Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

  Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

  接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

6.什么是值传递和引用传递?

  对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

  对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。

7.概括的解释下线程的几种可用状态。

  就绪(Runnable):线程准备运行,不一定立马就能开始执行。

  运行中(Running):进程正在执行线程的代码。

  等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

  睡眠中(Sleeping):线程被强制睡眠。I/O阻塞(Blocked on I/O):等待I/O操作完成。

  同步阻塞(Blocked on Synchronization):等待获取锁。

  死亡(Dead):线程完成了执行。

8.如何确保N个线程可以访问N个资源同时又不导致死锁?

  使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

9.Java集合类框架的基本接口有哪些?

  Java集合类里面最基本的接口有:

  Collection:代表一组对象,每一个对象都是它的子元素。

    Set:不包含重复元素的Collection。

    List:有顺序的collection,并且可以包含重复元素。

  Map:可以把键(key)映射到值(value)的对象,键不能重复。

10.什么是迭代器(Iterator)?

  Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。

11.Iterator和ListIterator的区别是什么?

  Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。

  Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

  ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

12.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

  Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。

  java.util包下面的所有的集合类都是快速失败的,java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

13.Java中的HashMap的工作原理是什么?

  Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。

14.hashCode()和equals()方法的重要性体现在什么地方?

  Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

15.HashMap和Hashtable有什么区别? 

  HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:

  HashMap允许键和值是null,而Hashtable不允许键或者值是null。

  Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。

  HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。

16.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

  Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

  Array大小是固定的,ArrayList的大小是动态变化的。

  ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

17.ArrayList和LinkedList有什么区别?

  ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

  ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

  相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

  LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

18.Comparable和Comparator接口是干什么的?列出它们的区别。

  Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

  Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

 19.什么是Java优先级队列(Priority Queue)?

   PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

20.Enumeration接口和Iterator接口的区别有哪些?

   Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

21.HashSet和TreeSet有什么区别?

  HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。

  另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。

22.Java中Exception和Error有什么区别?

  Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

23.throw和throws有什么区别?

  throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。

24.数据库连接池是什么意思?

   像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候,会消耗大量的资源,成本是非常高的。可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供。在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。

25.解释下Servlet的生命周期。

  对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用Servlet(译者注:这里应该是Servlet而不是server)的destroy()方法把Servlet删除掉。

26.什么是cookie?session和cookie有什么区别?

  cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:

  无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。

在存储的数据量方面session和cookies也是不一样的。session能够存储任意的Java对象,cookie只能存储String类型的对象。

27.线程安全的定义

  当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替进行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么称这个类是线程安全的.。

  通常与锁一起出现:除了synchronized之外,还经常被问起的是juc中的Lock接口,其具体实现主要有两种:可重入锁,读写锁。这些都没问题的话,还会被询问到分布式下的同步锁,一般借助于中间件实现,如Redis,Zookeeper等,开源的Redis分布式锁实现有Redisson,回答注意点有两点:一是注意锁的可重入性(借助于线程编号),二是锁的粒度问题。除此之外就是一些juc的常用工具类如:CountdownLatch,CyclicBarrir,信号量。

28.线程

  创建线程有几种方式:这个时候应该毫不犹豫的回答1种。面试官会有些惊讶于你的回答,因为似乎他已经习惯了听到Thread和Runnable2种方式的“标准答案”。其实,仔细审题会发现,java创建线程只有一种方式:Thread。Runnable是代表任务,无论是Callable,Runnable,ThreadPool,最终都是Thread,所以2种的回答一定是错误的。

29.反射

  对JAVA中反射的理解:运行时操作一个类的神器,可以获取构造器,方法,成员变量,参数化类型...使用案例如Hibernate,BeanUtils。

  利用反射,将json映射成map。

30.Spring

  不长的面试官生涯中,比较烦的一件事便是:当我还没问全:“聊一聊你对Spring的理解”这句话时,部分面试者的脸上已经浮现出了笑容,并迫不及待的回答:AOP和IOC。这本无可厚非,但一旦这成了条件反射式的回答,便违背了面试的初衷。

  在面试中,Spring从狭义上可以被理解成Spring Framework&SpringMVC。而广义上包含了Spring众多的开源项目,如果面试者连spring.io都没有访问过,私以为是不应该的扣分项。

  Spring常见的问题包括:Spring Bean的scope取值,BeanFactory的地位,@Transactionl相关(传播机制和隔离级别),SpringMVC工作流程。

31.SpringBoot

  SpringBoot是当今最火的框架之一了,其starter模块自动配置的思想是面试中经常被问到的。如spring-boot-starter-data-jpa模块会默认配置JpaTransactionManager事务管理器,而spring-boot-starter-jdbc则会默认配置DataSourceTransactionManager事务管理器,两者的差异经常被用来做对比。@ConditionalOnMissingBean,@ConditionalOnBean等注解作用也需要被掌握。

32.数据库

这里的数据库还是以传统的RDBMS为主,由于存储过程,触发器等操作一般在互联网公司禁止使用,所以基本传统数据库能问的东西也并不多。

  1. 索引的分类有哪些?面试者可以尝试自己分类回答。索引和唯一索引;聚集索引和非聚集索引;数据结构可以分为Hash和B+树索引;单列索引和联合索引。常见的索引问题还包括(A,B,C)的联合索引,查询(B,C)时会不会走索引等一些数据库的小细节。

  2. 事务ACID的描述和隔离级别。

  3. mysql的explain查询分析也是面试的重点对象,一条分析结果的查询时间,影响行数,走了哪些索引都是分析的依据。

  4. 如果面试官问到存储引擎,说实话也有点为了面试而面试的感觉,掌握基本的InnoDB和Myisam的区别即可。

  5. 互联网公司可能会比较关心面试者对分库分表的掌握:mysql自带的sharding为什么一般不使用?中间件级别和驱动级别的分库分表,sharding-jdbc,cobar,mycat等开源组件的使用,分布式ID和分库键的选择也备受面试官的青睐。

33.Redis

  1. Redis的常用数据结构,这不用赘述了。

  2. Redis的持久化策略。了解RDB和AOF的使用场景即可。

  3. Redis的发布订阅。

  4. 列举Redis的使用场景。这个可以自由发挥,除了主要功能缓存之外,还包括session共享,基于Redis的分布式锁,简易的消息队列等。

  5. 了解Redis的集群和哨兵机制。

  6. 高级话题包括:缓存雪崩,缓存失效,缓存穿透,预热等。

34.Nginx

  1. 解释反向代理。

  2. 常用的负载均衡算法。掌握ip_hash ,轮询,weight,fair即可。

  3. 配置动静分离。

35. 分布式

  1. CAP和BASE原理。了解CAP只能同时保证两个的结论,以及CP和AP的选择依据。了解BASE的最终一致性原理。

  2. 重试和幂等性。如在支付场景中的异步支付回调,内外部系统对接保证一致性通常采取的保障手段。

  3. 分布式链路跟踪。Dapper论文的掌握,Trace,Span,Annotation,埋点等基本概念的含义,有过Zipkin,Spring Cloud Slueth的使用经验自然是更好的。

  4. 分布式事务。虽然我认为这本身并不是一种值得提倡的东西,出现分布式事务应当考虑一下你的限界上下文划分的是否合理。那既然有人会问,或许也有他的道理,可以尝试了解二阶段提交,三阶段提交,Paxos。

  5. 一致性Hash。抓住一致性hash环和虚拟节点两个关键点作答即可。

  6. 熔断、降级。两者的对比,以及分布式中为何两者地位很重要。

  7. 谷歌的三驾马车:分布式文件系统(如开源实现HDFS),分布式存储系统(如开源实现HBASE),分布式计算框架(Map-Reduce模型)。市面上绝大多数的海量数据问题,最终都是在考着三个东西。典型问题:2个1T的文本文件存储着URL,筛选出其中相同的URL。海量文件的word count...

36.算法

  复杂度的概念,二分查找,快排的实现,一些贪心算法,DP,数据结构,树和图论,位操作,字符串。

 37.其他

  1. 业务场景的设计。诸如让你设计一个抢红包的流程,做一个秒杀的系统等等,重点考察的是一个面试者综合考虑问题的能力。

  2. 你项目中最有挑战的一个技术点。

  3. HTTP协议,TCP/IP协议

  4. 容器技术Docker,k8s。这一块笔者没接触,不妄加讨论。

posted @ 2019-01-22 00:13  何其小静  阅读(581)  评论(0编辑  收藏  举报