02 2020 档案

摘要:数据类型的局限 之前我们一直在说,程序主要就是数据以及对数据的操作,而为了方便操作数据,高级语言引入了数据类型的概念,Java定义了八种基本数据类型,而类相当于是自定义数据类型,通过类的组合和继承可以表示和操作各种事物或者说对象。 但,这种只是将对象看做属于某种数据类型,并按该类型进行操作,在一些情 阅读全文
posted @ 2020-02-29 23:45 Ivy_Xu 阅读(569) 评论(0) 推荐(0)
摘要:继承是把双刃剑 通过前面几节,我们应该对继承有了一个比较好的理解,但之前我们说继承其实是把双刃剑,为什么这么说呢?一方面是因为继承是非常强大的,另一方面是因为继承的破坏力也是很强的。 继承的强大是比较容易理解的,具体体现在: 子类可以复用父类代码,不写任何代码即可具备父类的属性和功能,而只需要增加特 阅读全文
posted @ 2020-02-29 23:34 Ivy_Xu 阅读(227) 评论(0) 推荐(0)
摘要:第15节我们介绍了继承和多态的基本概念,而上节我们进一步介绍了继承的一些细节,本节我们通过一个例子,来介绍继承实现的基本原理。需要说明的是,本节主要从概念上来介绍原理,实际实现细节可能与此不同。 例子 这是基类代码: public class Base { public static int s; 阅读全文
posted @ 2020-02-29 23:21 Ivy_Xu 阅读(310) 评论(0) 推荐(0)
摘要:上节,我们探讨了动态代理,在前几节中,我们多次提到了类加载器ClassLoader,本节就来详细讨论Java中的类加载机制与ClassLoader。 类加载器ClassLoader就是加载其他类的类,它负责将字节码文件加载到内存,创建Class对象。与之前介绍的反射、注解、和动态代理一样,在大部分的 阅读全文
posted @ 2020-02-29 22:59 Ivy_Xu 阅读(319) 评论(0) 推荐(0)
摘要:前面两节,我们介绍了反射和注解,利用它们,可以编写通用灵活的程序,本节,我们来探讨Java中另外一个动态特性 - 动态代理。 动态代理是一种强大的功能,它可以在运行时动态创建一个类,实现一个或多个接口,可以在不修改原有类的基础上动态为通过该类获取的对象添加方法、修改行为,这么描述比较抽象,下文会具体 阅读全文
posted @ 2020-02-29 18:43 Ivy_Xu 阅读(251) 评论(0) 推荐(0)
摘要:上节我们介绍了继承和多态的基本概念,基本概念是比较简单的,子类继承父类,自动拥有父类的属性和行为,并可扩展属性和行为,同时,可重写父类的方法以修改行为。 但继承和多态概念还有一些相关的细节,本节就来探讨这些细节,具体包括: 构造方法 重名与静态绑定 重载和重写 父子类型转换 继承访问权限 (prot 阅读全文
posted @ 2020-02-29 18:27 Ivy_Xu 阅读(220) 评论(0) 推荐(0)
摘要:继承 上节我们谈到,将现实中的概念映射为程序中的概念,我们谈了类以及类之间的组合,现实中的概念间还有一种非常重要的关系,就是分类,分类有个根,然后向下不断细化,形成一个层次分类体系。这种例子是非常多的: 在自然世界中,生物有动物和植物,动物有不同的科目,食肉动物、食草动物、杂食动物等,食肉动物有狼、 阅读全文
posted @ 2020-02-29 16:50 Ivy_Xu 阅读(209) 评论(0) 推荐(0)
摘要:正所谓,道生一,一生二,二生三,三生万物,如果将二进制表示和运算看做一,将基本数据类型看做二,基本数据类型形成的类看做三,那么,类的组合以及下节介绍的继承则使得三生万物。 上节我们通过类Point介绍了类的一些基本概念和语法,类Point中只有基本数据类型,但类中的成员变量的类型也可以是别的类,通过 阅读全文
posted @ 2020-02-29 16:39 Ivy_Xu 阅读(487) 评论(0) 推荐(0)
摘要:类 上节我们介绍了函数调用的基本原理,本节和接下来几节,我们探索类的世界。 程序主要就是数据以及对数据的操作,为方便理解和操作,高级语言使用数据类型这个概念,不同的数据类型有不同的特征和操作,Java定义了八种基本数据类型,其中,四种整形byte/short/int/long,两种浮点类型float 阅读全文
posted @ 2020-02-29 16:24 Ivy_Xu 阅读(285) 评论(0) 推荐(0)
摘要:栈 上节我们介绍了函数的基本概念,在最后我们提到了一个系统异常java.lang.StackOverflowError,栈溢出错误,要理解这个错误,我们需要理解函数调用的实现机制。本节就从概念模型的角度谈谈它的基本原理。 我们之前谈过程序执行的基本原理:CPU有一个指令指示器,指向下一条要执行的指令 阅读全文
posted @ 2020-02-29 15:56 Ivy_Xu 阅读(354) 评论(0) 推荐(0)
摘要:函数 前面几节我们介绍了数据的基本类型、基本操作和流程控制,使用这些已经可以写不少程序了。 但是如果需要经常做某一个操作,则类似的代码需要重复写很多遍,比如在一个数组中查找某个数,第一次查找一个数,第二次可能查找另一个数,每查一个数,类似的代码都需要重写一遍,很罗嗦。另外,有一些复杂的操作,可能分为 阅读全文
posted @ 2020-02-29 15:42 Ivy_Xu 阅读(318) 评论(0) 推荐(0)
摘要:循环 上节我们介绍了流程控制中的条件执行,根据具体条件不同执行不同操作。本节我们介绍流程控制中的循环,所谓循环就是多次重复执行某些类似的操作,这个操作一般不是完全一样的操作,而是类似的操作。都有哪些操作呢?这个例子太多了。 展示照片,我们查看手机上的照片,背后的程序需要将照片一张张展示给我们。 播放 阅读全文
posted @ 2020-02-29 15:23 Ivy_Xu 阅读(336) 评论(0) 推荐(0)
摘要:条件执行 前面几节我们介绍了如何定义数据和进行基本运算,为了对数据有透彻的理解,我们介绍了各种类型数据的二进制表示。 现在,让我们回顾程序本身,只进行基本操作是不够的,为了进行有现实意义的操作,我们需要对操作的过程进行流程控制。流程控制中最基本的就是条件执行,也就 是说,某些操作只能在某些条件满足的 阅读全文
posted @ 2020-02-29 15:15 Ivy_Xu 阅读(370) 评论(0) 推荐(0)
摘要:本节探讨定时任务,定时任务的应用场景是非常多的,比如: 闹钟程序或任务提醒,指定时间叫床或在指定日期提醒还信用卡 监控系统,每隔一段时间采集下系统数据,对异常事件报警 统计系统,一般凌晨一定时间统计昨日的各种数据指标 在Java中,有两种方式实现定时任务: 使用java.util包中的Timer和T 阅读全文
posted @ 2020-02-28 01:11 Ivy_Xu 阅读(808) 评论(0) 推荐(0)
摘要:前面两节讨论了Java 8中的函数式数据处理,那是对38节到55节介绍的容器类的增强,它可以将对集合数据的多个操作以流水线的方式组合在一起。本节继续讨论Java 8的新功能,主要是一个新的类CompletableFuture,它是对65节到82节介绍的并发编程的增强,它可以方便地将多个有一定依赖关系 阅读全文
posted @ 2020-02-28 00:18 Ivy_Xu 阅读(227) 评论(0) 推荐(0)
摘要:我们在67节和68节实现了线程的一些基本协作机制,那是利用基本的wait/notify实现的,我们提到,Java并发包中有一些专门的同步工具类,本节,我们就来探讨它们。 我们要探讨的工具类包括: 读写锁ReentrantReadWriteLock 信号量Semaphore 倒计时门栓CountDow 阅读全文
posted @ 2020-02-27 23:39 Ivy_Xu 阅读(337) 评论(0) 推荐(0)
摘要:上节,我们提到,在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java并发包提供了一个方便的方法,使用CompletionService,这是一个接口,它的实现类是ExecutorCompletionService 阅读全文
posted @ 2020-02-27 23:14 Ivy_Xu 阅读(142) 评论(0) 推荐(0)
摘要:上节介绍了单个字符的封装类Character,本节介绍字符串类。字符串操作大概是计算机程序中最常见的操作了,Java中表示字符串的类是String,本节就来详细介绍String。 字符串的基本使用是比较简单直接的,我们来看下。 基本用法 可以通过常量定义String变量 String name = 阅读全文
posted @ 2020-02-27 00:42 Ivy_Xu 阅读(227) 评论(0) 推荐(0)
摘要:包装类 Java有八种基本类型,每种基本类型都有一个对应的包装类。 包装类是什么呢?它是一个类,内部有一个实例变量,保存对应的基本类型的值,这个类一般还有一些静态方法、静态变量和实例方法,以方便对数据进行操作。 Java中,基本类型和对应的包装类如下表所示: 基本类型 包装类 boolean Boo 阅读全文
posted @ 2020-02-27 00:37 Ivy_Xu 阅读(269) 评论(0) 推荐(0)
摘要:前面两节我们介绍了如何通过流的方式读写文件内容,本节我们介绍文件元数据和目录的一些操作。 文件和目录操作最终是与操作系统和文件系统相关的,不同系统的实现是不一样的,但Java中的java.io.File类提供了统一的接口,底层它会通过本地方法调用操作系统和文件系统的具体实现,本节,我们就来介绍Fil 阅读全文
posted @ 2020-02-26 22:13 Ivy_Xu 阅读(334) 评论(0) 推荐(0)
摘要:上节我们介绍了如何以字节流的方式处理文件,我们提到,对于文本文件,字节流没有编码的概念,不能按行处理,使用不太方便,更适合的是使用字符流,本节就来介绍字符流。 我们首先简要介绍下文本文件的基本概念、与二进制文件的区别、编码、以及字符流和字节流的区别,然后我们介绍Java中的主要字符流,它们有: Re 阅读全文
posted @ 2020-02-26 22:07 Ivy_Xu 阅读(362) 评论(0) 推荐(0)
摘要:本节我们介绍在Java中如何以二进制字节的方式来处理文件,上节我们提到Java中有流的概念,以二进制方式读写的主要流有: InputStream/OutputStream: 这是基类,它们是抽象类。 FileInputStream/FileOutputStream: 输入源和输出目标是文件的流。 B 阅读全文
posted @ 2020-02-26 19:04 Ivy_Xu 阅读(661) 评论(0) 推荐(0)
摘要:上节,我们初步探讨了Java并发包中的任务执行服务,实际中,任务执行服务的主要实现机制是线程池,本节,我们就来探讨线程池。 基本概念 线程池,顾名思义,就是一个线程的池子,里面有若干线程,它们的目的就是执行提交给线程池的任务,执行完一个任务后不会退出,而是继续等待或执行新任务。线程池主要由两个概念组 阅读全文
posted @ 2020-02-26 01:21 Ivy_Xu 阅读(325) 评论(0) 推荐(0)
摘要:Java并发包提供了一套框架,大大简化了执行异步任务所需的开发,本节我们就来初步探讨这套框架。 在之前的介绍中,线程Thread既表示要执行的任务,又表示执行的机制,而这套框架引入了一个"执行服务"的概念,它将"任务的提交"和"任务的执行"相分离,"执行服务"封装了任务执行的细节,对于任务提交者而言 阅读全文
posted @ 2020-02-26 00:38 Ivy_Xu 阅读(440) 评论(0) 推荐(0)
摘要:本节,我们来探讨Java并发包中的各种队列。Java并发包提供了丰富的队列类,可以简单分为: 无锁非阻塞并发队列:ConcurrentLinkedQueue和ConcurrentLinkedDeque 普通阻塞队列:基于数组的ArrayBlockingQueue,基于链表的LinkedBlockin 阅读全文
posted @ 2020-02-26 00:16 Ivy_Xu 阅读(214) 评论(0) 推荐(0)
摘要:上节我们介绍了ConcurrentHashMap,ConcurrentHashMap不能排序,容器类中可以排序的Map和Set是TreeMap和TreeSet,但它们不是线程安全的。Java并发包中与TreeMap/TreeSet对应的并发版本是ConcurrentSkipListMap和Concu 阅读全文
posted @ 2020-02-25 23:26 Ivy_Xu 阅读(206) 评论(0) 推荐(0)
摘要:本节介绍一个常用的并发容器 - ConcurrentHashMap,它是HashMap的并发版本,与HashMap相比,它有如下特点: 并发安全 直接支持一些原子复合操作 支持高并发、读操作完全并行、写操作支持一定程度的并行 与同步容器Collections.synchronizedMap相比,迭代 阅读全文
posted @ 2020-02-25 23:07 Ivy_Xu 阅读(226) 评论(0) 推荐(0)
摘要:本节以及接下来的几节,我们探讨Java并发包中的容器类。本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet,讨论它们的用法和实现原理。它们的用法比较简单,我们需要理解的是它们的实现机制,Copy-On-Write,即写时拷贝或写时复制,这是解决并发 阅读全文
posted @ 2020-02-25 22:51 Ivy_Xu 阅读(221) 评论(0) 推荐(0)
摘要:上节我们介绍了显式锁,本节介绍关联的显式条件,介绍其用法和原理。显式条件也可以被称做条件变量、条件队列、或条件,后文我们可能会交替使用。 用法 基本概念和方法 锁用于解决竞态条件问题,条件是线程间的协作机制。显式锁与synchronzied相对应,而显式条件与wait/notify相对应。wait/ 阅读全文
posted @ 2020-02-25 22:40 Ivy_Xu 阅读(272) 评论(0) 推荐(0)
摘要:在66节,我们介绍了利用synchronized实现锁,我们提到了synchronized的一些局限性,本节,我们探讨Java并发包中的显式锁,它可以解决synchronized的限制。 Java并发包中的显式锁接口和类位于包java.util.concurrent.locks下,主要接口和类有: 阅读全文
posted @ 2020-02-25 22:13 Ivy_Xu 阅读(248) 评论(0) 推荐(0)
摘要:从本节开始,我们探讨Java并发工具包java.util.concurrent中的内容,本节先介绍最基本的原子变量及其背后的原理和思维。 原子变量 什么是原子变量?为什么需要它们呢? 在理解synchronized一节,我们介绍过一个Counter类,使用synchronized关键字保证原子更新操 阅读全文
posted @ 2020-02-25 21:05 Ivy_Xu 阅读(213) 评论(0) 推荐(0)
摘要:本节主要讨论一个问题,如何在Java中取消或关闭一个线程? 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种情况,比如说: 很多线程的运行模式是死循环,比如在生产者/消费者模式中,消费者主体 阅读全文
posted @ 2020-02-25 20:44 Ivy_Xu 阅读(182) 评论(0) 推荐(0)
摘要:本节继续上节的内容,探讨如何使用wait/notify实现更多的协作场景。 同时开始 同时开始,类似于运动员比赛,在听到比赛开始枪响后同时开始,下面,我们模拟下这个过程,这里,有一个主线程和N个子线程,每个子线程模拟一个运动员,主线程模拟裁判,它们协作的共享变量是一个开始信号。我们用一个类FireF 阅读全文
posted @ 2020-02-25 19:50 Ivy_Xu 阅读(204) 评论(0) 推荐(0)
摘要:上节介绍了多线程之间竞争访问同一个资源的问题及解决方案synchronized,我们提到,多线程之间除了竞争,还经常需要相互协作,本节就来介绍Java中多线程协作的基本机制wait/notify。 都有哪些场景需要协作?wait/notify是什么?如何使用?实现原理是什么?协作的核心是什么?如何实 阅读全文
posted @ 2020-02-25 16:36 Ivy_Xu 阅读(305) 评论(0) 推荐(0)
摘要:上节我们提到了多线程共享内存的两个问题,一个是竞态条件,另一个是内存可见性,我们提到,解决这两个问题的一个方案是使用synchronized关键字,本节就来讨论这个关键字。 用法 synchronized可以用于修饰类的实例方法、静态方法和代码块,我们分别来看下。 实例方法 上节我们介绍了一个计数的 阅读全文
posted @ 2020-02-25 12:59 Ivy_Xu 阅读(230) 评论(0) 推荐(0)
摘要:在之前的章节中,我们都是假设程序中只有一条执行流,程序从main方法的第一条语句逐条执行直到结束。从本节开始,我们讨论并发,在程序中创建线程来启动多条执行流,并发和线程是一个复杂的话题,本节,我们先来讨论Java中线程的一些基本概念。 创建线程 线程表示一条单独的执行流,它有自己的程序执行计数器,有 阅读全文
posted @ 2020-02-25 12:37 Ivy_Xu 阅读(263) 评论(0) 推荐(0)
摘要:cache与db不一致的原因,读与写出现并发。 理论上,給cache设置过期时间,是保证最终一致性到解决方案。这种方案下,写操作以数据库为准。更新cache失败,只要到了过期时间,后面的读请求会从数据库中读取新值存入cache。不过,实际开发中只设过期时间不足以满足需求,出现3种策略。 先更新DB, 阅读全文
posted @ 2020-02-24 17:36 Ivy_Xu 阅读(2701) 评论(0) 推荐(0)
摘要:在前面搭建的环境上加上mongodb配置文件,pom.xml增加mongo相关依赖,增加一些代码即可搭建成功。 1、增加mongdb-context.xml和mongodb.properties mongdb-context.xml 1 <?xml version="1.0" encoding="U 阅读全文
posted @ 2020-02-15 17:59 Ivy_Xu 阅读(518) 评论(0) 推荐(0)
摘要:前面一章又讲到过搭建环境遇到的问题,下面一一列举并解决。 一、maven依赖包下载失败。 本地maven安装文件中conf-setting.xml,配置阿里云镜像。 网上有很多配置阿里云镜像的配置,大同小异,但是都是没能成功的下载jar,最后发现是url又变了。所以当网上配置阿里镜像,而依赖包下载不 阅读全文
posted @ 2020-02-14 00:21 Ivy_Xu 阅读(375) 评论(0) 推荐(0)
摘要:1.新建maven项目,选择如下选项,然后进入下一步 2.输入项目相应的信息,进入下一步 3.配置maven环境,其中有个下载依赖包失败的问题,下篇将提到解决 4.点击finish,等待maven下载相应的jar包,创建src/main/webapp/WEB-INF/web.xml,src/main 阅读全文
posted @ 2020-02-14 00:10 Ivy_Xu 阅读(3240) 评论(0) 推荐(1)
摘要:import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingE 阅读全文
posted @ 2020-02-12 15:14 Ivy_Xu 阅读(429) 评论(0) 推荐(0)
摘要:ECB import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.io.IOException; import java.security.InvalidKeyException; import java.s 阅读全文
posted @ 2020-02-12 00:14 Ivy_Xu 阅读(291) 评论(0) 推荐(0)
摘要:ECB import javax.crypto.*; import javax.crypto.spec.DESKeySpec; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; i 阅读全文
posted @ 2020-02-11 22:36 Ivy_Xu 阅读(387) 评论(0) 推荐(0)
摘要:对称加密又分为分组加密和序列密码。分组密码,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。序列密码,也叫流加密(stream cyphers),一次加密明文中的一个位。是 阅读全文
posted @ 2020-02-11 16:33 Ivy_Xu 阅读(361) 评论(0) 推荐(0)
摘要:什么是加密算法?百度百科给出的解释如下: 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其 阅读全文
posted @ 2020-02-11 15:37 Ivy_Xu 阅读(1813) 评论(0) 推荐(0)