Java基础知识
1. 面向对象和面向过程的区别
面向过程
面向对象
2. Java 语言有哪些特点
3. 什么是 JDK 什么是 JRE 什么是 JVM 三者之间的联系与区别
4. 什么是字节码 采用字节码的最大好处是什么
先看下 java 中的编译器和解释器:
采用字节码的好处:
5. Java和C++的区别
6. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同
7. Java 应用程序与小程序之间有那些差别
8. 字符型常量和字符串常量的区别
9. 构造器 Constructor 是否可被 override
10. 重载和重写的区别
11. Java 面向对象编程三大特性:封装、继承、多态
封装
继承
多态
12. String 和 StringBuffer、StringBuilder 的区别是什么 String 为什么是不可变的
13. 自动装箱与拆箱
14. 在一个静态方法内调用一个非静态成员为什么是非法的
15. 在 Java 中定义一个不做事且没有参数的构造方法的作用
16. import java和javax有什么区别
17. 接口和抽象类的区别是什么 ...
Java虚拟机(jvm)
Java面试通关手册(Java学习指南)github地址(欢迎star和pull):https://github.com/Snailclimb/Java_Guide
下面是按jvm虚拟机知识点分章节总结的一些jvm学习与面试相关的一些东西。一般作为Java程序员在面试的时候一般会问的大多就是Java内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM内存管理这些问题了。这些内容参考周的《深入理解Java虚拟机》中第二章和第三章就足够了对应下面的深入理解虚拟机之Java内存区域:和深入理解虚拟机之垃圾回收这两篇文章。
常见面试题
深入理解虚拟机之Java内存区域:
介绍下Java内存区域(运行时数据区)。
对象的访问定位的两种方式。
深入理解虚拟机之垃圾回收
如何判断对象是否死亡(两种方法)。
简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。
垃圾收集有哪些算法,各自的特点?
HotSpot为什么要分为新生代和老年代?
常见的垃圾回收器有那些?
介绍一下CMS,G1收集器。
Minor Gc和Full GC 有什么 ...
Java集合框架常见面试题总结
List,Set,Map三者的区别及总结
List:对付顺序的好帮手
List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
Set:注重独一无二的性质
不允许重复的集合。不会有多个元素引用相同的对象。
Map:用Key来搜索的专家
使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。
Arraylist 与 LinkedList 区别Arraylist底层使用的是数组(存读数据效率高,插入删除特定位置效率低),LinkedList底层使用的是双向循环链表数据结构(插入,删除效率特别高)。学过数据结构这门课后我们就知道采用链表存储,插入,删除元素时间复杂度不受元素位置的影响,都是近似O(1)而数组为近似O(n),因此当数据特别多,而且经常需要插入删除元素时建议选用LinkedList.一般程序只用Arraylist就够用了,因为一般数据量都不会蛮大,Arraylist是使用最多的集合类。
ArrayList 与 Vector 区别Vector类的所有方法都是同步的。可 ...
LinkedList
简介LinkedList是一个实现了List接口和Deque接口的双端链表。LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性;LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法:
List list=Collections.synchronizedList(new LinkedList(...));
内部结构分析如下图所示:看完了图之后,我们再看LinkedList类中的一个内部私有类Node就很好理解了:
private static class Node<E> { E item;//节点值 Node<E> next;//后继节点 Node<E> prev;//前驱节点 Node(Node<E> prev, E element, Node<E> next) { ...
final、static、this、super
final 关键字final关键字主要用在三个地方:变量、方法、类。
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。
static 关键字static 关键字主要有以下四种使用场景:
修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式: ...
static
static 关键字static 关键字主要有以下四种使用场景
修饰成员变量和成员方法
静态代码块
修饰类(只能修饰内部类)
静态导包(用来导入类中的静态资源,1.5之后的新特性)
修饰成员变量和成员方法(常用)被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。
方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
HotSpot 虚拟机中方法区也常被称为 “永久代”,本质上两者并不等价。仅仅是因为 HotSpot 虚拟机设计团队用永久代来实现方法区而已,这样 HotSpot 虚拟机的垃圾收集器就可以像管理 Java 堆一样管理这部分内存了。但是这并不是一个好主意,因为这样更容易遇到内存溢出问题。
调用格式:
...
synchronized
以下内容摘自我的 Gitchat :Java 程序员必备:并发知识系统总结,欢迎订阅!
Github 地址:https://github.com/Snailclimb/JavaGuide/edit/master/Java相关/synchronized.md
synchronized关键字最主要的三种使用方式的总结
修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁
修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份,所以对该类的所有对象都加了锁)。所以如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。
修饰代码块,指 ...
可能是把Java内存区域讲的最清楚的一篇文章
写在前面(常见面试题)基本问题:
介绍下 Java 内存区域(运行时数据区)
Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)
对象的访问定位的两种方式(句柄和直接指针两种方式)
拓展问题:
String类和常量池
8种基本类型的包装类和常量池
1 概述对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
2 运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。这些组成部分一些是线程私有的,其他的则是线程共享的。
线程私有的:
程序计数器
虚拟机栈
本地方法栈
线程共享的:
堆
方法区
直接内存
2.1 程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指 ...
多线程系列
多线程系列文章下列文章,我都更新在了我的博客专栏:Java并发编程指南。
Java多线程学习(一)Java多线程入门
Java多线程学习(二)synchronized关键字(1)
Java多线程学习(二)synchronized关键字(2)
Java多线程学习(三)volatile关键字
Java多线程学习(四)等待/通知(wait/notify)机制
Java多线程学习(五)线程间通信知识点补充
Java多线程学习(六)Lock锁的使用
Java多线程学习(七)并发编程中一些问题
Java多线程学习(八)线程池与Executor 框架
多线程系列文章重要知识点与思维导图
Java多线程学习(一)Java多线程入门
Java多线程学习(二)synchronized关键字(1)
注意:可重入锁的概念。
另外要注意:synchronized取得的锁都是对象锁,而不是把一段代码或方法当做锁。 如果多个线程访问的是同一个对象,哪个线程先执行带synchronized关键字的方法,则哪个线程就持有该方法,那么其他线程只能呈等待状态。如果多个线程访问的是多个对象 ...
多线程系列
多线程系列文章下列文章,我都更新在了我的博客专栏:Java并发编程指南。
Java多线程学习(一)Java多线程入门
Java多线程学习(二)synchronized关键字(1)
Java多线程学习(二)synchronized关键字(2)
Java多线程学习(三)volatile关键字
Java多线程学习(四)等待/通知(wait/notify)机制
Java多线程学习(五)线程间通信知识点补充
Java多线程学习(六)Lock锁的使用
Java多线程学习(七)并发编程中一些问题
Java多线程学习(八)线程池与Executor 框架
多线程系列文章重要知识点与思维导图
Java多线程学习(一)Java多线程入门
Java多线程学习(二)synchronized关键字(1)
注意:可重入锁的概念。
另外要注意:synchronized取得的锁都是对象锁,而不是把一段代码或方法当做锁。 如果多个线程访问的是同一个对象,哪个线程先执行带synchronized关键字的方法,则哪个线程就持有该方法,那么其他线程只能呈等待状态。如果多个线程访问的是多个对象 ...
并发容器总结
一 JDK 提供的并发容器总结
二 ConcurrentHashMap
三 CopyOnWriteArrayList
3.1 CopyOnWriteArrayList 简介
3.2 CopyOnWriteArrayList 是如何做到的?
3.3 CopyOnWriteArrayList 读取和写入源码简单分析
3.3.1 CopyOnWriteArrayList 读取操作的实现
3.3.2 CopyOnWriteArrayList 写入操作的实现
四 ConcurrentLinkedQueue
五 BlockingQueue
5.1 BlockingQueue 简单介绍
5.2 ArrayBlockingQueue
5.3 LinkedBlockingQueue
5.4 PriorityBlockingQueue
六 ConcurrentSkipListMap
七 参考
一 JDK 提供的并发容器总结JDK提供的这些容器大部分在 java.util.concurrent 包中。
ConcurrentHashMap: 线程安全的HashMap
CopyOnWr ...
搞定JVM垃圾回收就是这么简单
上文回顾:《可能是把Java内存区域讲的最清楚的一篇文章》
写在前面本节常见面试题:问题答案在文中都有提到
如何判断对象是否死亡(两种方法)。
简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。
如何判断一个常量是废弃常量
如何判断一个类是无用的类
垃圾收集有哪些算法,各自的特点?
HotSpot为什么要分为新生代和老年代?
常见的垃圾回收器有那些?
介绍一下CMS,G1收集器。
Minor Gc和Full GC 有什么不同呢?
本文导火索
当需要排查各种 内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。
1 揭开JVM内存分配与回收的神秘面纱Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。
JDK1.8之前的堆内存示意图:
从上图可以看出堆内存分为新生代、老年代和永久代。新生代又被进一步分为:Eden 区+Survivor1 区+Survivor2 区。值得注意的是,在 JDK ...
设计模式
下面是自己学习设计模式的时候做的总结,有些是自己的原创文章,有些是网上写的比较好的文章,保存下来细细消化吧!
创建型模式:
创建型模式概述:
创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。
创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
创建型模式系列文章推荐:
单例模式:
深入理解单例模式——只有一个实例
工厂模式:
深入理解工厂模式——由对象工厂生成对象
建造者模式:
深入理解建造者模式 ——组装复杂的实例
原型模式:
深入理解原型模式 ——通过复制生成实例
结构型模式:
结构型模式概述:
结构型模式(Structural Pattern): 描述如何将类或者对象结合在一起形成更大的结 ...
这几道Java集合框架面试题几乎必问
Arraylist 与 LinkedList 异同
补充:数据结构基础之双向链表
ArrayList 与 Vector 区别
HashMap的底层实现
JDK1.8之前
JDK1.8之后
HashMap 和 Hashtable 的区别
HashMap 的长度为什么是2的幂次方
HashMap 多线程操作导致死循环问题
HashSet 和 HashMap 区别
ConcurrentHashMap 和 Hashtable 的区别
ConcurrentHashMap线程安全的具体实现方式/底层具体实现
JDK1.7(上面有示意图)
JDK1.8 (上面有示意图)
集合框架底层数据结构总结
Collection
1. List
2. Set
Map
推荐阅读:
Arraylist 与 LinkedList 异同
1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循 ...
Java的12个语法糖
原创 | 不了解这12个语法糖,别说你会Java!原创 Hollis Hollis 2019-05-13 08:30
△Hollis, 一个对Coding有着独特追求的人△
这是Hollis的第 212 篇原创分享。
作者 l Hollis
来源 l Hollis(ID:hollischuang)
本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理
语法糖语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。
有意思的是,在编程领域,除了语法糖,还有语法盐和语法糖精的说法,篇幅有限这里不做扩展了。
我们所熟知的编程语言中几乎都有语法糖。作者认为,语法糖的多少是评判一个语言够不够牛逼的标准之一。
很多人说Java是一个“低糖语言”,其实从Java 7开始 ...