编程语言
文章平均质量分 71
林头头03
德玛西亚从不退缩
展开
-
java多线程总结(多处精摘,面试总结)
用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。多线程:指...原创 2018-08-04 01:56:38 · 405 阅读 · 0 评论 -
什么是JRE?Java运行环境简介
Java开发工具包(JDK),Java虚拟机(JVM)和Java运行时环境(JRE)共同构成了用于开发和运行Java应用程序的Java平台组件的强大功能。我之前介绍过JDK和JVM。 在本快速教程中,您将了解JRE,它是Java的运行时环境。 实际上,运行时环境是一种旨在运行其他软件的软件。作为Java的运行时环境,JRE包含Java类库,Java类加载器和Java虚...原创 2018-09-26 10:50:43 · 20807 阅读 · 1 评论 -
一文读懂 java对象和引用
Java对象及其引用 关于对象与引用之间的一些基本概念。 初学Java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java书中,把对象和对象的引用混为一谈。可是,如果我分不清对象与对象引用, 那实在没法很好地理解下面的面向对象技术。把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路。 为便于说明,我们先定义一个简单的类: ...转载 2018-12-13 16:33:21 · 141 阅读 · 0 评论 -
HashMap的死锁问题
问题最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。由于HashMap并非是线程安全的,所以在高并发的情况下必然会出现问题,这是一个普遍的问题,虽然网上分析的文章很多,还是觉得有必须写一篇文章,让关注我公众号的同学能够意识到这个问题,并了解这个死循环是如何产生的。...转载 2018-12-14 11:00:42 · 3547 阅读 · 0 评论 -
Java 死锁例子(注释详细)
为了测试java多线程死锁得到java多线程死锁的直观感觉,写出以下测试代码。public class DeadLock { public static String obj1 = "obj1"; public static String obj2 = "obj2"; public static void main(String[] args){ T...原创 2018-12-19 20:40:26 · 207 阅读 · 0 评论 -
HashSet 方法使用总结
HashSet类,是存在于java.util包中的类 。同时也被称为集合,该容器中只能存储不重复的对象。底层是由HashMap来存储的,因为HashSet不能重复,你知道HashMap的键不能重复就明白了这一个原理了,所以对于HashMap很熟悉的话对于HashSet就能够很快的知道底层实现。 HashSet是set接口的实现类,也是我们最常用的set集合 储存的是无序,唯一的对...原创 2018-12-10 15:38:43 · 1453 阅读 · 0 评论 -
深入浅出Java锁--Lock实现原理(底层实现)
当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。 关于synchronized的原理可以阅读再有人问你synchronized是什么,就把这篇文章...转载 2018-12-21 16:25:53 · 12845 阅读 · 3 评论 -
HashSet总结及实例,重写equals()和hashCode()
HashSet的源码作总结:HashSet在存元素时,会调用对象的hashCode方法计算出存储位置,然后和该位置上所有的元素进行equals比较。给我们最直观的感受就是两点,不可重复和无序,底层采用了HashMap结构。1. HashSet基于HashMap实现, 以HashSet的值作为HashMap的一个key, 以一个Object对象常量作为HashMap的值。2. 根据H...原创 2018-12-12 09:56:54 · 444 阅读 · 0 评论 -
HashMap,HashTable,ConcurrentHashmap区别简述
HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为11,扩容:newsize = olesize*2+1 计算index的方法:index = (hash & 0x7FFFFFFF) % tab...原创 2018-12-12 10:26:54 · 214 阅读 · 0 评论 -
常用数据结构的时间复杂度
常用数据结构的时间复杂度 数据结构 添加 查找 删除 获取索引值 Array (T[]) O(n) O(n) O(n) O(1) Linked list (LinkedLis...原创 2018-12-12 10:52:16 · 1382 阅读 · 0 评论 -
java线程池 面试题(精简)
什么是线程池?线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 为什么要使用线程池?创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再...原创 2018-12-24 20:36:09 · 67693 阅读 · 0 评论 -
简析java线程池 实现原理
什么是线程池 线程池是一种多线程处理的形式,通过把处理的任务添加到队列中,然后在创建线程后自动执行这些任务。线程池可以同时执行多个任务,如果任务队列已经满了,则新来的任务就会排队等待,线程池线程的数量永远不会大于既定最大值。Exectors APIJava类库提供了4个静态方法来创建一个线程池:newFixedThreadPool 创建一个固定长度的线程池,当到达线程最大数量...原创 2018-12-25 00:29:27 · 654 阅读 · 0 评论 -
Java锁的种类
Java中的锁主要有以下几种概念:1、同步锁 同一时刻,一个同步锁只能被一个线程访问。以对象为依据,通过synchronized关键字来进行同步,实现对竞争资源的互斥访问。2、独占锁(可重入的互斥锁) 互斥,即在同一时间点,只能被一个线程持有;可重入,即可以被单个线程多次获取。什么意思呢?根据锁的获取机制,它分为“公平锁”和“非公平锁”。Java中通过ReentrantL...原创 2019-01-07 01:22:22 · 4614 阅读 · 0 评论 -
Lock锁底层原理
当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。 关于synchronized的原理可以阅读再有人问你synchronized是什么,就把这篇文章...原创 2019-01-07 01:28:04 · 41830 阅读 · 11 评论 -
图文 什么是红黑树
今天我们用漫画的形式生动的介绍一下~红黑树————————————————————————二叉查找树(BST)具备什么特性呢?1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树也分别为二叉排序树。下图中这棵树,就是一颗典型的二叉查找树:...转载 2019-01-10 10:28:27 · 238 阅读 · 1 评论 -
Java Challengers#2:字符串比较
String方法,关键字和运算符如何处理String池中的比较 在Java中,String该类封装了一个数组char。简而言之,String是一个字符数组,用于组合您想要的单词,句子或任何其他数据。 封装是面向对象编程中最强大的概念之一。由于封装的,你不需要知道如何将字符串类的工作; 你只需要知道在它的界面上使用什么方法。当您String在Java中查看该类时,您...翻译 2018-09-24 21:47:46 · 213 阅读 · 0 评论 -
Java Challengers#3:多态性和继承
根据Venkat Subramaniam的传说,多态性是面向对象编程中最重要的概念。多态性 -或者对象基于其类型执行专门操作的能力 - 是使Java代码具有灵活性的原因。命令,观察者,装饰者,策略等设计模式以及Gang Of Four创建的许多其他模式都使用某种形式的多态性。掌握这一概念极大地提高了您通过解决方案来应对编程挑战的能力。获取代码您可以获取此挑战的源代码并在此处运行...翻译 2018-09-24 16:37:51 · 259 阅读 · 0 评论 -
Java Challengers#4使用equals()和hashcode()比较Java对象
在这个Java Challengers中,您将学习如何equals()并hashcode()在Java程序中使对象比较变得高效和简单。简而言之,这些方法协同工作以验证两个对象是否具有相同的值。 没有equals(),hashcode()我们将不得不创建非常大的“ if”比较,比较对象的每个字段。这会使代码真正令人困惑并且难以阅读。这两种方法共同帮助我们创建更灵活,更有凝聚力...翻译 2018-09-24 14:28:18 · 169 阅读 · 0 评论 -
java基础笔记--量,运算符
1B(字节) = 8bit1KB = 1024B1MB = 1024KB1GB = 1024MB1TB = 1024GB1PB = 1024TB 四类 八种 字节数 数据表示范围 整型 byte 1 ,8位 -128~...原创 2018-08-04 12:40:50 · 260 阅读 · 0 评论 -
Java基础笔记--Scanner,random,循环
Scanner类 引用数据类型的变量定义及赋值有一个相对固定的步骤或格式。数据类型 变量名 = new 数据类型();每种引用数据类型都有其功能,我们可以调用该类型实例的功能。 变量名.方法名(); Scanner使用步骤: Random随机数类的使用 ...原创 2018-08-04 12:49:10 · 253 阅读 · 0 评论 -
java基础笔记--Scanner 类(Demo)
Java Scanner 类java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。下面是创建 Scanner 对象的基本语法:Scanner s = new Scanner(System.in); 接下来我们演示一个最简单的数据输入,并通过 Scanner 类的 next() 与 nextLine() 方法获取输入的...原创 2018-08-04 13:35:00 · 731 阅读 · 0 评论 -
java案例分析--加封装
我们日常使用的电脑主机,把cpu、内存、主板等等都封装到机箱里面去。假如没有机箱的话的出现什么问题,主机、主板全部都散落在一处,然后开机没有开机按钮,那么需要我们直接操作接跳线才能把电脑开启。这样子的话假如操作不慎的话,会让机器损坏危险,那么假如用机箱封装起来的话,那么就不需要这样子做了。体现了封装的---安全特性。你拿电脑去加内存,可以直接给电脑给维修的人,等他加好内存了之后...原创 2018-08-04 13:38:10 · 968 阅读 · 0 评论 -
java死锁及其解决方法
死锁通俗点讲:死锁就是两个或两个以上的进程或线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。举个例子:当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞。比如,线程1已经持有了A锁并想要获得B锁的同时,线程2持有B锁并尝试获取A锁,那么这两个线程将永远地等待下去。再用简单一点的例子来说吧 ...原创 2018-08-04 15:42:58 · 2227 阅读 · 0 评论 -
java中Iterator用法总结
Java中Iterator用法迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所...转载 2018-08-04 23:12:05 · 19181 阅读 · 0 评论 -
java ListIterator迭代器
ListIterator迭代器的概述ListIterator 继承自 Iterator 接口(关于 Iterator 的介绍请看博客),在 Iterator 的基础上增加了 6 个方法:ListIterator与Iterator接口不同,它不仅可以向后迭代,它还可以向前迭代。ListIterator相对Iterator增加了如下几个方法:void hasPrevious()...原创 2018-08-04 23:33:29 · 5619 阅读 · 0 评论 -
快速失败(fail-fast)和安全失败(fail-safe)的区别
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount...转载 2018-08-04 23:41:54 · 140 阅读 · 0 评论 -
java笔记--Map的用法
Map接口概述我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。 Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。 Collectio...原创 2018-08-07 20:04:39 · 332305 阅读 · 27 评论 -
java 正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex)。正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。正则表达式的匹配规则参照帮助文档,在Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。我们来学习语法规则。...原创 2018-08-13 00:16:18 · 494 阅读 · 0 评论 -
String与char的互相转换
toCharArray()的用法:将字符串对象中的字符转换为一个字符数组例如: String myString="abcd";char myChar[]=myString.toCharArray();System.out.println("myChar[1]="+myChar[1]); 输出结果: myChar[1]=b ________________...原创 2018-08-13 00:52:34 · 9124 阅读 · 0 评论 -
String,StringBuilder,StringBuffer 对比
首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String String最慢的原因: String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。 ...原创 2018-08-09 01:31:55 · 181 阅读 · 0 评论 -
Queue 与List、LinkedList与 ArrayList 区别
Queue 与List、LinkedList与 ArrayList 区别List 是一个接口,不能实例化,通过实例化ArrayList 或者LinkedList来调用:List list = new ArrayList();|--List: 元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引,|-- ArrayLi...转载 2018-08-09 01:32:59 · 342 阅读 · 0 评论 -
java笔记--递归条件
写递归你需要先找到递归的递归条件和终结条件。递归的基本规则可以解释为:如果条件为继续递归 为条件做一定变换后调用自身否则 返回基本值当然,可能会出现更复杂的,但一般都是这样。所以需要找到三个地方:第一、就是在什么条件下要继续递归,在什么条件下结束递归。第二、递归时需要做什么变换才能让递归函数最终走到终结条件。第三、基本值是什么。比如递归计算N!。我们知...原创 2018-09-24 03:47:03 · 1068 阅读 · 1 评论 -
java 单例模式
单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的...原创 2019-03-14 15:15:28 · 175 阅读 · 0 评论