Java工程师应该掌握的相关知识(基础篇01)

自己并不是 CS 科班出身,学习 Java 的时间也不长,但自己比较喜欢这行业。所以想写一些文章记录一些自己想去详细了解的知识,并且希望能分享出来大家进行讨论,一起进步~

我比较喜欢问题驱动学习的形式,所以经常会看一些大公司的面试题了解自己的不足,下面有五道面试题与大家讨论。下面讨论的问题出自 —— 你应该知道的JAVA面试题

1. Java 线程的状态

这算是一个比较常见的问题了,经常在不同的面经里看见,但经常又记了大概就忘记。
Java 线程在某个时刻只能处于以下六种状态
1. 新建(NEW),线程尚未启动的状态。
1. 可运行(RUNNABLE),可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统(例如处理器)的其他资源。
1. 阻塞中(BLOCKED),一个线程试图获取监视器锁(JVM规范实现的内容,每个对象和类在逻辑上都是和一个监视器相关联的),但该锁正在被其它线程持有时的状态。例如进入Synchronize块或者其它线程线程调用了Object.wait方法。
1. 等待(WAITING),一个线程调用了 Object.wait、Thread.join或者LockSupport.park后的状态。例如一个线程调用了 Object.wait 等待 Object.notify 或者 Object.notifyAll 方法。
1. 计时等待(TIMED_WAITING),就是触发等待状态的相关方法加上时间参数的状态。
1. 终止(TERMINATED),线程被终止(抛出一个未被捕获的异常)或正常退出的状态。

参考资料:JDK8 的 Thread 源码,相关源码在1742行开始

2. 进程和线程的区别,进程间如何通讯,线程间如何通讯

我也没上过操作系统的课,只能基于搜索的资料与自己的理解和大家讨论。
进程和线程都是基于一个 CPU 时间段的描述,线程是基于进程的进一步划分。现代 OS 中,进程是 CPU 资源分配的最小单位,线程是 CPU 调度的最小单位。进程之前通讯依靠系统资源,线程之间通讯依靠 JVM 提供的方法。
用户下达运行程序的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一程序,却不会相冲突。
维基百科相关解释:进程需要一些资源才能完成工作,如CPU使用时间、内存、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。
那基于多线程能依赖于多核心执行,就是说多个核心能同时运行一个进程?
进程与线程似乎还与操作系统,语言实现有关,并没有找到很好的资料,欢迎大家讨论。

3. HashMap 的数据结构是什么?如何实现的。和 HashTable,ConcurrentHashMap 的区别

HashMap 是基于 Node 为元素的数组,Node 实现了 Map.Entry 接口,实现上来说有几个关键的点

  • put时计算出相应的hash值映射到相应的桶中。
  • 如果一个桶中有多个元素则将该通内部元素构造成链表提高索引效率。
  • 如果内部链表长度超过 TREEIFY_THRESHOLD 的值(默认为8)将其转换成红黑树,如果红黑树内元素小于 UNTREEIFY_THRESHOLD 大小时将其转换为链表。
  • HashMap 默认的初始容量(DEFAULT_INITIAL_CAPACITY)为16,默认的负载因子(DEFAULT_LOAD_FACTOR)为0.75。
  • 负载因子表示 HashMap 对表空间的使用程度,负载因子高时表内空间就越紧凑,检索效率就低,占用空间就相对来说小。
  • 当容量不足时会出发 resize 方法在达到最大值之前会默认扩大两倍,达到最大值就不进行扩容。

Hashtable 是遗留类,很多映射的常用功能与 HashMap 类似,不同的是它承自 Dictionary 类,并且是线程安全的,任一时间只有一个线程能写 Hashtable,并发性不如 ConcurrentHashMap,因为 ConcurrentHashMap 引入了分段锁。Hashtable 不建议在新代码中使用,不需要线程安全的场合可以用 HashMap 替换,需要线程安全的场合可以用 ConcurrentHashMap 替换。
ConcurrentHashMap 大量的使用了 Unsafe 的本地方法,使用分段锁,降低了锁粒度,提高了在竞争激烈的情况下的性能。Guava 的缓存就是参考其实现的。
参考资料:
https://tech.meituan.com/java-hashmap.html
http://www.infoq.com/cn/articles/ConcurrentHashMap/
https://my.oschina.net/ovirtKg/blog/777520

4. 索引有什么用?如何建索引?

索引相当于目录的功能,例如我们翻书时想快速找到自己感兴趣的章节就要通过索引。如果没有索引时我们只能一页一页的去找自己想要的内容。不同的数据库实现的索引不同,MySQL 中常用的有 B-TREE(从技术上说是B+TREE) 和哈希索引。
就我个人经验来说,创建索引时我会使用 explain 调试和业务相关的语句,当读写都在一个数据库中时要少建索引,避免插入效率低,因为插入时索引自然要去更新一遍,当索引太多时更新就会对整个流程有影响。
避免冗余的索引,例如 AB 索引就维护了 A 的索引,了解 B+TREE 的结构很直观的就能理解,MySQL会针对搜索做优化,但使用索引的效率低时就选择不用索引。
选择合适的索引顺序,原则上说选择性高的索引应放在前面,但又要考虑索引利用率的问题。当然如果实现了读写分离,那就可以随意建索引了!

参考资料:高性能mysql第三版

5. ArrayList 是如何实现的,ArrayList 和 LinkedList 的区别?ArrayList 如何实现扩容?

ArrayList 是基于动态数组实现的数据结构,LinkedList 是基于双向链表实现的数据结构。所以 ArrayList 查找更快,LinkedList 占用的空间更大。由于 LinkedList 是基于链表实现的,而 ArrayList 在插入时又需要动态扩容,所以插入和删除应该理论上比 ArrayList 更快。但实际测试结果并不是如此,由于 LinkedList 的检索效率太拙计,只要在容量大小的 1/10 之前会快于 ArrayList。

时间复杂度对比

Java学习交流QQ群:589809992  禁止闲聊,非喜勿进!

时间: 2024-08-10 19:07:51

Java工程师应该掌握的相关知识(基础篇01)的相关文章

Java快速教程--vamei 学习笔记(基础篇)

链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/14/2958654.html java快速教程第2课 方法与数据成员 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/25/2964430.html java快

Javascript DOM 基础篇 01

DOM基础 DOM是什么 答:文件对象模型(Document Object Model,简称DOM),DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构!来自网络 本节了解了下面知识点: DOM节点 childNodes  nodeType 获取子节点 children parentNode 例子:点击链接,隐藏整个li offsetParent 例子:获取元素在页面上的实际位置 DOM节点(2) 首尾子节点 有兼容性问题 firstChild.firstElementChil

java NIO中的Reactor相关知识汇总 (转)

一.引子 nio是java的IO框架里边十分重要的一部分内容,其最核心的就是提供了非阻塞IO的处理方式,最典型的应用场景就是处理网络连接.很多同学提起nio都能说起一二,但是细究其背后的原理.思想往往就开始背书,说来说去都是那么几句,其中不少人并不见的真的很理解.本人之前就属于此类,看了很多书和博客,但是大多数都只是讲了三件套和怎么使用,很少会很细致的讲背后的思想,那本次我们就来扒一扒吧.     很多博客描述nio都是这么说的:基于Reactor模式实现的多路非阻塞高性能的网络IO.那么我们就

js中BOM与DOM的相关知识基础

 [函数的声明及调用] 1.>>>函数声明的格式: function 函数名(参数1,参数2,--){ // 函数体 return 结果; } >>>函数调用的格式: 直接调用:函数名(参数1的值,参数2的值,--); 事件调用:事件名=函数名(); 2.函数声明的几点强调: ① 函数名的声明,必须符合小驼峰法则(首字母小写,之后每个单词首字母大写): ② 参数列表,可以有参数,可以无参数.分别称为有参函数,无参函数: ③ 声明函数时的参数列表,称为"形参列表

网络存储协议和相关技术基础篇

SCSI SCSI是小型计算机系统接口(Small Computer System Interface)的简称,于1979首次提出,是为小型机研制的一种接口技术,现在已完全普及到了小型机,高低端服务器以及普通PC上. SCSI可以划分为SCSI-1.SCSI-2.SCSI-3,最新的为SCSI-3,也是目前应用最广泛的SCSI版本. 1.SCSI-1:1979年提出,支持同步和异步SCSI外围设备:支持7台8位的外围设备,最大数据传输速度为5MB/s. 2.SCSI-2:1992年提出,也称为F

Java基础篇(01):基本数据类型,核心点整理

本文源码:GitHub·点这里 || GitEE·点这里 一.基本类型 1.基本类型 不使用New创建,声明一个非引用传递的变量,且变量的值直接置于堆栈中,大小不随运行环境变化,效率更高.使用new创建的引用对象存储在堆中. 2.基本信息 基本类型包括如下几种:byte.short.int.long.float.double.boolean.char,可以通过相关方法查看范围大小. public class IntType01 { public static void main(String[]

JAVA常用集合框架用法详解基础篇一之Colletion接口

首先,在学习集合之前我们能够使用的可以存储多个元素的容器就是数组. 下面举几个例子主要是引出集合类的: 1.8,4,5,6,7,55,7,8  像这样的类型相同的可以使用数组来存储,本例可以用int[] arr来存储. 2."zhnagsan",true,68 像这样的可以使用StringBuilder或者StringBuffer来存储,但最终需要使用.toString()的方法转换成字符串才可以使用.即 变为:"zhnagsantrue68". 3."李

jdk源码阅读笔记之java集合框架(一)(基础篇)

结合<jdk源码>与<thinking in java>,对java集合框架做一些简要分析(本着实用主义,精简主义,遂只会挑出个人认为是高潮的部分). 先上一张java集合框架的简图: 会从以下几个方面来进行分析: java 数组; ArrayList,LinkedList与Vector; HashMap; HashSet 关于数组array: 数组的解释是:存储固定大小的同类型元素.由于是"固定大小",所以对于未知数目的元素存储就显得力不从心,遂有了集合.

Java多线程系列--“基础篇”01之 基本概念

多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学 习.接下来的内容,是对“JDK中新增JUC包”之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), notify()等接口:Thread类中的接口:synchronized关键字. 注:JUC包是指,Java.util.concurrent包,它是由Java大师Doug Lea完成并在JDK1.5版本添加到Java中的. 在进入后面章节的学习之前,先对了解一些多线程的相关概念.线程状态图