java程序员面试笔试
光明顶上的5G
作者5G,目前专注于Java后端技术的学习
展开
-
进程间通信的五种方式
参考文章1.管道特点:1.它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端2.它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)3.它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中2.FIFO特点:1.FIFO可以在无关的进程之间交换数据,与无名管道不同2.FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。(FIFO的通信方式原创 2020-10-21 17:07:27 · 537 阅读 · 1 评论 -
分库分表是什么,什么情况下需要用分库分表
1、什么是分库分表?顾名思义,即把存于一个库的数据分散到多个库中,把存于一个表的数据分散到多个表中。2、什么情况下需要分库分表?当一个数据库被创建之后,随着时间的推移和业务量的增加,数据库中表以及表中的数据量就会越来越多,就有可能出现两种弊端:(1)数据库的存储资源是有限的,其负载能力也是有限的,数据的大量积累肯定会导致其处理数据的能力下降;(2)数据量越多,那么对数据的增删改查操作的...转载 2019-03-26 13:48:14 · 6473 阅读 · 0 评论 -
线程池参数设置技巧
一、ThreadPoolExecutor的重要参数corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭 queueCapacity:任务队列容量(阻塞队列) 当核心线...转载 2019-03-22 20:11:58 · 724 阅读 · 0 评论 -
线程池的七个参数
在Java中,我们一般通过集成Thread类和实现Runnnable接口,调用线程的start()方法实现线程的启动。但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的创建线程和销毁进程会大大的降低系统运行的效率。线程池正是为了解决多线程效率低的问题而产生的,他使得线程可以被复用,就是线程执行结束后不被销毁,而是可以继续执行其他任务。(这里可以用tomcat做例子进行思考)...转载 2019-03-22 19:18:49 · 529 阅读 · 0 评论 -
乐观锁的缺点
1、ABA问题 如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间他的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没被修改过。这个问题被称为CAS操作的“ABA”问题。 JDK1.5以后的AtomicStampedReference类就提供了此种能力,其中的c...转载 2019-03-22 18:45:17 · 3599 阅读 · 3 评论 -
乐观锁常见的两种实现方式和适用场景
1、版本号机制 一般是在数据表中加上一个版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读到的version值与当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。举一个简单的例子:假设数据库中账户信息表中有一个version...转载 2019-03-22 18:28:40 · 19939 阅读 · 4 评论 -
内存泄漏与内存溢出的区别
内存溢出: 是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个Integer,但给他存了long才能存下的数,那就是内存溢出。内存泄漏: 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存迟早会被占光。内存溢出的原因:1、内存中加载的数据量过于庞大,如一...转载 2019-03-26 13:32:26 · 212 阅读 · 0 评论 -
hashMap中的get方法
HashMap的get方法的实现,其判断标准是通过hashCode和equals方法。/** * Returns the value to which the specified key is mapped, * or {@code null} if this map contains no mapping for the key. * * <p...原创 2019-03-29 17:53:33 · 11248 阅读 · 0 评论 -
乐观锁,悲观锁
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其他线程阻塞,用完后再把资源转让给其他线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁等,读锁写锁等,都是在操作之前先上锁。Java中synchronized和ReetrantLock等独占锁就是悲观锁思想的实现...转载 2019-03-22 15:59:20 · 100 阅读 · 0 评论 -
lock ,sychronized,volatile的区别
sychronized与volatile关键字区别:1、volatle关键字解决的是变量在多个线程之间的可见性;而sychronized关键字解决的是多个线程之间访问共享资源的同步性。2、volatile只能用于修饰变量,而synchronized可以修饰方法以及代码块。(volatile是线程同步的轻量级实现,所以volatile性能比synchronized要好,并且随着JDK新版本的...转载 2019-03-22 15:48:48 · 313 阅读 · 0 评论 -
JVM运行时数据区
线程私有的数据区程序计数器: 作用:记录当前线程锁执行到的字节码的行号。字节码解释器工作的时候就是通过改变你这个计数器的值来选取下一条需要执行的字节码指令。 意义:JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理器也只会执行一条线程中的指令。所以,为了保证各线程指令的安全顺利执行,每个线程都有独立的私有的程序计数器。 存储内容...原创 2019-03-25 22:43:48 · 164 阅读 · 0 评论 -
对象如何进入老年代
对象优先在新生代的eden区分配内存,但是也并不绝对,下面几种情况对象会晋升到老年代。1、大对象直接进入老年代。比如很长的字符串,或者很大的数组等。2、长期存活的对象进入老年代。在堆中分配内存的对象,其内存布局的对象头中包含了GC分代年龄标记信息。如果对象在eden区出生,那么它的GC分代年龄初始值为1,每熬过一次Minor GC而不被回收这个值会增加1岁。当他的年龄到达一定的数值时(jd...转载 2019-03-22 14:25:22 · 921 阅读 · 0 评论 -
分代回收算法
对象分类 这种算法并不是一种新的算法,而是根据对象的存活周期的不同而将内存分为几块,分别是新生代、老年代和永久代。新生代:朝生夕灭的对象(例如方法的局部变量等);老年代:存活的比较久但还是要死的对象(例如缓存对象、单例对象等);永久代:对象生成后几乎不灭的对象(例如加载过的类信息);内存区域 新生代和老年代都在Java堆,永久代在方法区。Java对象的回收...转载 2019-03-22 14:14:15 · 2746 阅读 · 0 评论 -
数据库事务
一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:1、为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统...原创 2019-03-22 20:22:52 · 126 阅读 · 0 评论 -
synchronized和lock的实现原理
目前在Java中存在两种锁机制:synchronized和lock,lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而lock给出的答案是在硬件层面依赖特殊的CPU指令,大家可能...转载 2019-03-29 18:53:29 · 387 阅读 · 0 评论 -
保证三个线程依次按顺序执行
Join方法:T3先执行,调用t2.join,让T2执行完后再执行T3.在T2的run方法中,调用t1.join(),让T1执行完后再让T2执行。public class JoinTest{ public static void main(String[] args){ final Thread t1 = new Thread(new Runnable(){ pu...转载 2019-04-11 10:08:56 · 1864 阅读 · 0 评论 -
Java虚拟机内存布局
1、程序计数器:存放当前执行指令的地址。2、虚拟机栈:描述的是Java方法执行的内存模型。每个方法在执行时都会创建一个栈帧来存储局部变量表,操作数栈,动态链接和方法出口等信息。局部变量表:存放编译期间可知的各种局部变量,包括基本数据类型和其引用类型。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,其对应的帧中对局部变量表分配的大小完全确定,在运行期间不会改变。操作数栈:方...原创 2019-04-10 23:27:29 · 436 阅读 · 0 评论 -
TCP如何保证消息顺序以及可靠性到达
TCP可靠性传输的工作原理1、停止等待协议2、连续ARQ协议TCP可靠性传输的实现1、以字节为单位的滑动窗口2、超时重传时间的选择3、选择确定SACK面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。TCP通过下列方式来提供可靠...转载 2019-03-24 16:18:34 · 1086 阅读 · 0 评论 -
五层网络协议及其功能
OSI七层模型物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。五层体系结构物理层、数据链路层、网络层、运输层、应用层。各层的作用1、物理层:比特 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 他的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后转化为1、0,也就是我们常说的数模转换与模数转换...转载 2019-03-24 14:54:55 · 2441 阅读 · 0 评论 -
手写单例模式
饿汉式class Singleton{ private static Singleton instance=new Singleeton(); private Singleton(){}; static Singleton getInstance(){ return instance; }}懒汉式class Singleton{ private sta...原创 2019-03-30 17:04:15 · 401 阅读 · 0 评论 -
三次握手和四次挥手过程详解
三次握手过程理解第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号。第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包(a...转载 2019-03-23 15:31:34 · 1174 阅读 · 0 评论 -
硬中断和软中断的区别
硬中断1、硬中断是由硬件产生的。比如像磁盘、网卡、键盘、时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。2、处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU...转载 2019-03-23 15:03:31 · 1378 阅读 · 0 评论 -
生产者消费者问题(使用notify和wait设计)
设计:产品-product类;产品库:productRepository类生产者线程消费者线程product.javapublic class Product{ private String name; private long productNo; public Product(String name,long productNo){ this.n...转载 2019-03-23 09:42:43 · 142 阅读 · 0 评论 -
删除链表中所有重复元素
public ListNode deleteDuplication(ListNode pHead){ //LinkedHashMap可以按照输入的顺序进行输出 LinkedHashMap<Integer,Integer> map = new LinkedHashMap<>(); ListNode current = pHead; while(current...转载 2019-03-26 14:14:59 · 1286 阅读 · 0 评论 -
面试题之String str = new String("abc"); 创建了几个对象
今天去面试的时候碰到了这个问题:String str = new String("abc"); 创建了几个对象,回来自己研究并查阅资料才发现答错了。。网上的争论不少,有的说是两个,答案应该是:两个或一个理由解释如下:都了解java 的字符串常量缓冲区(字符串池,字符串常量池),如果代码是这样的:[java]view plaincopyStringstr2=newSt...转载 2019-03-26 13:58:04 · 484 阅读 · 0 评论 -
vector,linkedList与arrayList区别和适用场景
List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。 3个具体实现类的相关区别如下:ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数...转载 2019-03-26 13:55:31 · 404 阅读 · 0 评论 -
TCP、UDP的区别和分别使用的场合
TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。UDP: UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。 即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥堵的行为。此外,传输途中如果出现...转载 2019-03-25 14:44:34 · 1643 阅读 · 0 评论 -
手写冒泡排序
严格定义下的写法void bubbleSort(int array[], int length){ for(int i=0;i<length;i++){ for(int j=0;j<length-i;j++){ if(array[j-1]>array[j]) swap(array[j-1],array[j]); } }}...转载 2019-03-25 14:08:08 · 955 阅读 · 0 评论 -
java创建线程的三种方式及其对比
java创建线程的三种方式及其对比一、Java中创建线程主要有三种方式:1、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。package com.th...转载 2019-03-14 23:41:56 · 85 阅读 · 0 评论 -
简单工厂、工厂方法、抽象工厂区别
结合简单示例和UML图,讲解工厂模式简单原理。一、引子话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。...转载 2019-03-14 23:31:02 · 157 阅读 · 0 评论 -
Spring Cloud 从入门到精通
课程介绍Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量。本课程由浅入深带领大家一步步攻克 Spring Cloud 各大模块,接着通过一个实例带领大家了解大型分布式微服务架构的搭建过程,最后深入源码加深对它的了解。本课程共分为四个部分:...转载 2019-03-14 23:22:20 · 125 阅读 · 0 评论 -
spring boot AOP和spring boot统一异常处理
一,spring AOPspring boot使用AOP,代码如下,代码比较简单就不细说了,直接上代码,可以使用AOP做日志处理package com.qwrt.fire.sensor.aop;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import org.aspec...转载 2019-03-14 23:20:51 · 1782 阅读 · 0 评论 -
OSI七层模型详解
转载 2019-03-14 23:18:52 · 332 阅读 · 0 评论 -
设计模式
Num1:单例模式基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。常见写法:懒汉式public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton insta...转载 2019-03-09 17:39:04 · 216 阅读 · 0 评论 -
javaEE的三层结构:web层、service层、dao层
学习JavaEE时,经常提到JavaEE三层或者四层结构四层架构展示层(web层)、业务逻辑层、数据访问层、信息资源层。四层架构是在开发企业应用时使用的非常经典的划分模式。web层负责前端展示和用户请求的处理。MVC是一个设计模式,主要用于构建用户页面,目的是把展示逻辑和逻辑分离。web层通常会使用MVC模式进行构建,经常使用的MVC框架包括spring mvc,structs等,...转载 2019-03-14 10:55:29 · 8647 阅读 · 0 评论 -
java基础知识(二)
5、字符串与数组5.1、字符串创建于存储的机制是什么字符串的声明和初始化主要有以下两种情况: 1:对于String s1 = new String("abc")语句与String s2 = new String("abc")语句,存在两个引用对象s1,s2,两个内容相同的字符串对象“abc”,它们在内存中的地址是不一样的。只要用到new总会生成新的对象。 2:对...原创 2018-12-09 16:28:36 · 294 阅读 · 0 评论 -
java基础知识(一)
目录1、基本概念1.1、java语言有哪些优点1.2、java与c/c++有何异同1.3、为什么需要public static void main(String[] args)这个方法1.4、如何实现在main方法执行前输出“Hello World”1.5、java程序初始化的顺序是怎样的1.6、java中的作用域有哪些1.7、一个java文件中是否可以定义多个类...原创 2018-11-30 18:34:43 · 246 阅读 · 0 评论 -
数据库的四种隔离级别
数据库的事务操作其实就是一组原子性的操作,要么全部操作成功,要么全部操作失败。 比如说我需要对外销售1张电影票,且登记一下销售信息到另一个表,至少需要以下3个步骤 1.查询电影票数量是否满足销售1张电影票 SELECT remain_count FROMcinema WHERE film_id = 123456789; 2.更新电影票数量UPDATE rema...转载 2019-03-14 23:44:23 · 398 阅读 · 0 评论 -
HashMap原理及put与get方法调用过程
HashMap的原理HashMap的数据结构为数组+链表,以key,value的形式存储,通过调用put和get方法来存制和取值。 它内部维护了一个entry数组。得到key的hashcode值将其移位按位与运算,然后在通过跟数组的长度-1做逻辑与运算得到一个index值来确定数据存储在entry数组当中的位置,通过链表来解决hash冲突问题。当发生碰撞了,对象将会存储在链表...转载 2019-03-19 17:46:22 · 741 阅读 · 0 评论 -
线程池
在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。 线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。...转载 2019-03-19 19:41:29 · 185 阅读 · 0 评论