![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JAVA基础
文章平均质量分 94
DS
这是一条海鱼
这个作者很懒,什么都没留下…
展开
-
微服务和微服务架构概念引入
一、单体架构从单体架构说起 ,一个单体架构工程对应一个归档包(war),这个war包包含了该工程的所有功能。我们成为这种应用为单体应用,也就是我们常说的单体架构(一个war包打天下)。 具体描述: 就是在我们的一个war包种,聚集了各种功能以及资源,比如JSP JS,CSS等。而业务种包含了我们的用户模块,订单模块,支付模块等等.1.1 单体架构图1.2 单体架构优缺点总结优点:①: 架构简单明了,没有”花里胡哨“的问题需要解决。②:开发,测试,部署简单(尤其是运维人员 睡着都会笑醒)缺点:原创 2022-03-28 14:16:09 · 389 阅读 · 0 评论 -
java收集器Collector
一、收集器Collector//T:表示流中每个元素的类型。 A:表示中间结果容器的类型。 R:表示最终返回的结果类型。public interface Collector<T, A, R> { Supplier<A> supplier()//生成容器 BiConsumer<A,T> accumulator()//是添加元素 BinaryOperator<A> combiner()//是合并容器 Function<A,R&原创 2022-03-08 23:20:32 · 3720 阅读 · 0 评论 -
java高并发基础篇之多线程Future设计模式
Futurepublic interface Future1、取消任务boolean cancel(boolean mayInterruptIfRunning)传入true会中断线程停止任务,而传入false则会让线程正常执行至完成,但是会让未执行的任务不执行boolean isCancelled()判断线程是否被取消(cancel)如果任务已经完成,已经被取消或者因为其他原因而无法取消,则false疑问,false参数并不会停止任务,那么cancel(false)有什么用呢?传.原创 2020-05-13 23:25:22 · 305 阅读 · 0 评论 -
java高并发基础篇之调度线程池
一、ScheduledExecutorService一、public interface ScheduledExecutorService extends ExecutorService1、发布异步非周期任务<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) ScheduledFuture<?> schedule(Runnable com.原创 2020-05-12 00:45:37 · 354 阅读 · 0 评论 -
java高并发基础篇之线程池
一、接口Executorvoid execute(Runnable command) //提交一个任务,这是个异步方法,不会堵塞当前程序二、接口ExecutorService1、批量提交同步任务会堵塞当前线程,只有这个方法提交的任务都完成才会进入下一步//执行所以任务,单只返回其中一个任务的结果<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedExcep原创 2020-05-11 01:18:43 · 626 阅读 · 0 评论 -
java高并发基础篇之ForkJoin框架
前言从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果。主要有两步:1、任务切分;2、结果合并;其底层使用了工作窃取(work-stealing)算法:工作窃取是指某个线程从其他队列里窃取任务来执行,一个大任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并未每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。比如线程1负责处理1队列里的任务原创 2020-05-12 00:46:10 · 405 阅读 · 0 评论 -
java高并发基础篇之阻塞和唤醒线程LockSupport
前言在java并发包下各种同步组件的底层实现中,LockSupport的身影处处可见。JDK中的定义为用来创建锁和其他同步类的线程阻塞原语。我们可以使用它来阻塞和唤醒线程,功能和wait,notify有些相似,但是LockSupport比起wait,notify功能更强大,也好用的多。本文主要介绍使用wait,notify阻塞唤醒线程和使用LockSupport阻塞唤醒线程一、使用wait,notify阻塞唤醒线程public class Test2 { private static fi原创 2020-05-09 17:16:01 · 332 阅读 · 0 评论 -
java高并发基础篇之锁的使用
前言锁像synchronized同步块一样,是一种线程同步机制。让自Java 5开始,java.util.concurrent.locks包提供了另一种方式实现线程同步机制——Lock。那么问题来了既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock呢?这个问题我们下面讨论java.util.concurrent.locks包中包含了一些锁的实现,所以我们不需要重复造轮子了。但是我们仍然需要去了解怎样使用这些锁,且了解这些实现背后的理论也是很有用处的。本文将从下面几个方面原创 2020-05-10 17:36:58 · 558 阅读 · 0 评论 -
java高并发基础篇之线程执行顺序的控制
前言本文主要介绍CountDownLatch,CyclicBarrier,Semaphore一、CountDownLatch1、构造方法CountDownLatch(int count) 2、线程睡眠除非当前存器计数到零,或者指定的等待时间过去,或者线程被interrupted了void await() throws InterruptedExceptionboolean await(long timeout, TimeUnit unit) throws InterruptedExce原创 2020-05-10 00:44:17 · 674 阅读 · 0 评论 -
java高并发高级篇之原子类与不可变对象
不变性如果某个对象在被创建后其状态就不能被修改,那么这个对象就称为不可变对象。线程安全性是不可变对象的固有属性之一,它们的不变性条件是由构造函数创建的,只要它们的状态 不改变,那么这些不变性条件就能得以维持。不可变对象一定是线程安全的。不可变对象很简单。它们只有一种状态,并且该状态由构造函数来控制。在程序设计中, 一个最困难的地方就是判断复杂对象的可能状态。然而,判断不可变对象的状态却很简单...原创 2020-05-08 16:13:52 · 749 阅读 · 0 评论 -
java高并发基础篇之Java内存模型与线程
前言并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类“压榨”计算机运算能力的最有力武器。硬件的效率与一致性在正式讲解Java虚拟机并发相关的知识之前,我们先花费一点时间去了解一下物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对虛拟机的实现也有相当大的参考意义。“让计算机并发执行若干个运算任务...原创 2020-05-07 21:30:49 · 189 阅读 · 0 评论 -
java高并发基础篇之线程安全与锁优化
前言synchronized和volatile是java提供的两个解决并发问题的关键字,本文将深入解析synchronized和volatile的实现原理,并可从中了解内存屏障、对象头、自旋锁、偏向锁等内容。一、volatile特性volatile是java虚拟机提供的最轻量级的同步机制。当一个变量定义为volatile之后,它将具备两种特性:1、保证此变量对所有线程的可见性,即当一个线程...原创 2020-05-08 10:02:47 · 317 阅读 · 0 评论 -
java高并发基础篇之Java与线程
前言并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论 并发,大多数都与线程脱不开关系。既然我们这本书探讨的话题是Java虚拟机的特性, 那讲到Java线程,我们就从Java线程在虚拟机中的实现开始讲起。线程的实现我们知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程 的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等)...原创 2020-05-07 20:15:36 · 282 阅读 · 0 评论 -
java字符流
前言输入流:把数据(键盘输入、鼠标、扫描仪等等外设设备)读入到内存(程序)中输出流:把内存(程序)中的数据输出到外设或其他地方,从文件角度简单总结就是,输入流就是读数据,输出流就是写数据。在这个过程中,始终把内存作为参考点。在JAVA语言中,定义了专门的类用来表示输入和输出,这些类放在java.io包中。按数据传输单位划分,可以分为字节流和字符流。本文重点介绍字符流Reader:输入流、继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符16位Writer:输出流、继承自Wr原创 2020-05-31 21:36:53 · 3859 阅读 · 0 评论 -
JavaIO文件File
前言File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。1、构造器File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一原创 2020-05-31 21:36:20 · 998 阅读 · 0 评论 -
java字节流
前言输入流:把数据(键盘输入、鼠标、扫描仪等等外设设备)读入到内存(程序)中输出流:把内存(程序)中的数据输出到外设或其他地方,从文件角度简单总结就是,输入流就是读数据,输出流就是写数据。在这个过程中,始终把内存作为参考点。在JAVA语言中,定义了专门的类用来表示输入和输出,这些类放在java.io包中。按数据传输单位划分,可以分为字节流和字符流。本文重点介绍字节流InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节8位,类图如下Output原创 2020-05-31 21:35:45 · 2127 阅读 · 0 评论 -
java序列化
1.为什么需要序列化?第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。第二种情况是:需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象。2.什么是序列化序列化(serialization)是把一个对象的状态写入 一个字节流的过原创 2020-05-31 21:34:58 · 310 阅读 · 0 评论 -
java迭代器
前言迭代器是一种模式、详细可见其设计模式,可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部一、Iterablepublic interface Iterable实现这个接口允许一个对象成为“For-each”语句的目标。//执行特定动作的每一个元素的 Iterable直到所有元素都被处理或操作抛出异常。default void forEach(Consumer<? super T&g原创 2020-05-31 18:03:29 · 1556 阅读 · 0 评论 -
java集合工具类Collections
前言java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作一、元素操作1、增加值static <T> boolean addAll(Collection<? super T> c, T... elements) 将所有指定的元素添加到指定的集合中。 案例ArrayList<Number原创 2020-05-31 17:48:05 · 382 阅读 · 0 评论 -
java集合Collection及其子接口简述
前言Java 的集合主要按两种接口分类:Collection, Map。本文重点介绍:Collection,下图是其常用子接口一、Collectionpublic interface Collection<E> extends Iterable<E>集合的特点:1、集合中存储的元素是对象。2、集合的长度是可变的;3、集合是不可以存储基本数据类型的1、添加boolean add(E e)//确保此集合包含指定的元素(可选操作)。 boolean addAll(C原创 2020-05-31 16:49:46 · 1058 阅读 · 0 评论 -
java集合LinkedList
LinkedList概述public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.SerializableList 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove原创 2020-05-31 16:43:20 · 175 阅读 · 0 评论 -
java集合ArrayList
ArrayList概述ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口。Collection是所有集合类的父类。ArrayList使用非常广泛,不论是数据库表查询,excel导入解析,还是网站数据爬取都需要使用到,了解ArrayList原理及使用方法显得非常重要。每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细原创 2020-05-31 16:16:06 · 327 阅读 · 0 评论 -
java集合Map及其子接口简述
一、Mappublic interface Map<K,V>1、增加V put(K key, V value)void putAll(Map<? extends K,? extends V> m)2、删除void clear()V remove(Object key)default boolean remove(Object key, Object value)3、替换default V replace(K key, VnewValue)default.原创 2020-05-31 01:55:38 · 550 阅读 · 0 评论 -
java并发集合ConcurrentHashMap
前言HashMap是我们最常用的数据结构之一,它方便高效,但遗憾的是,HashMap是线程不安全的,在并发环境下,在HashMap的扩容过程中,可能造成散列表的循环锁死。而线程安全的HashTable使用了大量Synchronized锁,导致了效率非常低下。幸运的是,并发编程大师Doug Lea为我们提供了ConcurrentHashMap,它是线程安全版的HashMap。一、源码分析基础知识//Node数组的最多长度private static final int MAXIMUM_CAPACIT原创 2020-05-31 01:54:25 · 203 阅读 · 0 评论 -
java集合TreeMap
TreeMap概述public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable一个红黑树基于NavigableMap实现。 该地图是根据排序natural ordering其密钥,或通过Comparator在地图创建时提供,这取决于所使用的构造方法。请注意,如果这个排序的映射要正确地实现Map接口,那原创 2020-05-31 01:34:41 · 241 阅读 · 0 评论 -
java集合LinkedHashMap
1111原创 2020-05-30 23:06:38 · 613 阅读 · 2 评论 -
java集合HashMap
HashMap概述哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中HashMap的实现原理进行讲解,并对JDK7的HashMap源码进行分析。什么是哈希表在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对原创 2020-05-30 23:03:47 · 650 阅读 · 0 评论 -
java格式化字符串Formatter
前言在java中我们格式化一个字符串的方法有很多,最基本的就是不断地用+号来加出一个String但是这样的操作有很多的问题,而且有的时候也非常的不方便,这个时候我们就要用到其他的工具。类似C的printf的格式方法,在java中也是有的,写成System.out.printf();还有另外一种方法就是使用Formatter类,这个类可以说是功能强大,能格式化任何信息。在学习Formatter之前,我们先学习下格式化符号一、格式化符号1、标识1、-将是左对齐的。(默认是右对齐),不可以与“用0原创 2020-05-22 01:11:39 · 1105 阅读 · 0 评论 -
java工具类UUID、Math、Random、StringJoiner
一、UUIDUID全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。UUID的应原创 2020-05-22 01:09:40 · 369 阅读 · 0 评论 -
java非空检查工具类Objects,Optional
一、ObjectsJDK7里面新增的Objects类,本类由一些操作对象的静态工具方法构成,这些工具方法包括了非空检查、方法的非空参数检查、 比较对象的hashCode、为对象返回一个字符串表示、比较两个对象等。 本文是以java8版本介绍Objects类1、判断对象是否为null//判断一个对象是否为空,如果为空返回truestatic boolean isNull(Object obj); //判断一个对象是否为空,如果不为空返回truestatic boolean原创 2020-05-22 01:06:17 · 1074 阅读 · 0 评论 -
java-Base64编码工具类
一、什么是Base64?百度百科中对Base64有一个很好的解释:“Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法”。什么是“可打印字符”呢?为什么要用它来传输8Bit字节码呢?在回答这两个问题之前我们有必要来思考一下什么情况下需要使用Base64?Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因原创 2020-05-21 21:34:30 · 4014 阅读 · 0 评论 -
java字符串String
前言String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享1、构造器参数是字节数组bytes - 要解码为字符的 byteoffset - 要解码的第一个 byte 的索引(包括)length - 要解码的 byte 数String(byte[] bytes)String(byte[] bytes, Charset cha原创 2020-05-21 21:32:45 · 225 阅读 · 0 评论 -
java正则表达式
一、PatternPattern是正则表达式的编译表示形式。指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象1、字段摘要1、获取Pattern对象static Pattern compile(String regex)//将给定的正则表达式编译到模式中。 static Pattern compile(String regex, int flags)//将给定的正则表达式编译到具有给定标志的模式中。2、创建匹配器Matcher match原创 2020-05-21 16:34:53 · 121 阅读 · 0 评论 -
Java异常
一、异常机制概述异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。异常处理的流程当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,在所有的finally块代码被执行和当前线程的所属原创 2020-05-21 15:19:19 · 834 阅读 · 0 评论 -
java反射框架总结
概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。下图是java反射框架简述1、接口 AnnotatedElement表示目前正在此 VM 中运行的程序的一个已注释元素。该接口允许反射性地读取注释。由此接口中的方法返回的所有注释都是不可变并且可序列化的。调用者可以修改已赋值数组枚举成员的访问器返回的数组;这不会对其他调用者返回的数组产生任何影响。原创 2020-05-19 16:14:54 · 762 阅读 · 0 评论 -
Java时间戳Instant和时钟Clock
一、Instant我们已经知道,计算机存储的当前时间,本质上只是一个不断递增的整数。Java提供的System.currentTimeMillis()返回的就是以毫秒表示的当前时间戳。这个当前时间戳在java.time中以Instant类型表示,我们用Instant.now()获取当前时间戳,效果和System.currentTimeMillis()1、静态方法,获取对象其实我们还可以通过Date的Instant toInstant()方法获取Instant对象static Instant o原创 2020-05-19 15:20:09 · 1254 阅读 · 0 评论 -
java时间区间类
Period一、字段static Period ZERO二、获取对象static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)static Period from(TemporalAmount amount)static Period of(int years, int months, int days)static Period ofDays(int days)stati原创 2020-05-19 15:01:08 · 953 阅读 · 0 评论 -
java时区时间ZoneOffset, ZoneId,OffsetTime,OffsetDateTime,ZonedDateTime
ZoneOffsetpublic final class ZoneOffsetextends ZoneIdimplements TemporalAccessor, TemporalAdjuster, Comparable, Serializable时区偏移量1、获取static ZoneOffset of(String offsetId)使用ID获取 ZoneOffset的实例。static ZoneOffset ofHours(int hours)获得 ZoneOffset的实例原创 2020-05-19 14:52:53 · 4437 阅读 · 0 评论 -
java日期类LocalDate,LocalDateTime,LocalTime, YearMonth, Year, MonthDay
前言LocalDate,LocalDateTime,LocalTime, YearMonth, Year, MonthDay,它们代表与上下文相结合的本地日期/时间。这些类主要用于不需要在上下文中明确指定时区的情况,他们是线程安全的类 格式LocalDate yyyy-MM-DDLocalDateTimeLocalTimeYearMonthYearMonthDay一、LocalDate1、静态方法,获取对象static Loc原创 2020-05-19 14:20:38 · 2480 阅读 · 0 评论 -
java日期格式化DateTimeFormatter
前言使用旧的Date对象时,我们用SimpleDateFormat进行格式化显示。使用新的LocalDateTime或ZonedLocalDateTime时,我们要进行格式化显示,就要使用DateTimeFormatter。和SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的。线程的概念我们会在后面涉及到。现在我们只需要记住:因为SimpleDateFormat不是线程安全的,使用的时候,只能在方法内部创建新的局部变量。而DateTimeForm原创 2020-05-18 00:02:59 · 6359 阅读 · 0 评论