03 2020 档案

摘要:java有预置线程池:newSingleThreadExecutor,newFixedThreadPool,newCacheedThreadPool,newScheduledThreadPool,newWorkStealingPool。如果不适合,还可以使用ThreadPoolExecutor创建自 阅读全文
posted @ 2020-03-31 19:48 Ivy_Xu 阅读(2477) 评论(0) 推荐(0)
摘要:方法切点 execution,作用方法,最常用。指定方法返回类型,类名,方法名,参数名等与方法相关的部件。 @annotation,作用方法。方法注解类名 目标类切点 within,作用目标类。指定全路径类名。 target,作用目标类。指定类名。 @within,作用目标类。类型注解类名。 @ta 阅读全文
posted @ 2020-03-31 00:11 Ivy_Xu 阅读(1307) 评论(0) 推荐(0)
摘要:锁优化 自适应的自旋锁 自旋锁,为了让线程等待,让线程执行一个忙循环(自旋)。超过10次仍然没有成功获取锁,线程挂起。 自适应的自旋锁,前一次在同一个锁上的自旋时间和锁的拥有者的状态决定。在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在进行中,那么虚拟机就会认为这次自旋也很有可能再次 阅读全文
posted @ 2020-03-30 23:47 Ivy_Xu 阅读(658) 评论(0) 推荐(0)
摘要:DFA DFA即Deterministic Finite Automaton,也就是确定有穷自动机。在实现文字过滤的算法中,DFA是比较好的实现算法。 具体是什么原理呢? 存在如下几个敏感词:日本人、日本鬼子、*.*.*。 首先:query 日 > {本}、query 本 >{人、鬼子}、query 阅读全文
posted @ 2020-03-30 21:47 Ivy_Xu 阅读(1868) 评论(0) 推荐(0)
摘要:CPU与内存通信,通过地址、数据、控制总线。 地址总线:特定内存寻址 数据总线:对选择的内存进行读写 控制总线:确定数据的读写 阅读全文
posted @ 2020-03-28 16:23 Ivy_Xu 阅读(2069) 评论(0) 推荐(0)
摘要:内存 共享主存和高速缓存(工作内存)。CPU高速缓存(L1,2)产生原因读写主存没有CPU执行指令快,他是某个CPU独有,只与该CPU运行的线程有关。 内存可见性 简单的说,CPU对数据的修改,对其他CPU立刻可见。下面我们详细地说。 CPU修改数据,首先对工作内存修改,再同步主内存。单线程中,变量 阅读全文
posted @ 2020-03-28 16:04 Ivy_Xu 阅读(1314) 评论(0) 推荐(0)
摘要:synchronized与ReentrantLock都是可重入锁,区别两者之前,先介绍可重入锁的概念。 可重入锁 同一个线程可以在对象锁还没释放时,可再次获取这个对象的锁。同一个线程每次获取锁,锁的计数器加1,释放一次锁,计数器减1,直到计数器为0,完全释放锁。 synchronized与Reent 阅读全文
posted @ 2020-03-28 10:34 Ivy_Xu 阅读(257) 评论(0) 推荐(0)
摘要:本节探讨Character类,它的基本用法我们在包装类第一节已经介绍了,本节不再赘述。Character类除了封装了一个char外,还有什么可介绍的呢?它有很多静态方法,封装了Unicode字符级别的各种操作,是Java文本处理的基础,注意不是char级别,Unicode字符并不等同于char,本节 阅读全文
posted @ 2020-03-27 21:57 Ivy_Xu 阅读(296) 评论(0) 推荐(0)
摘要:本节继续探讨包装类,主要介绍Integer类,下节介绍Character类,Long与Integer类似,就不再单独介绍了,其他类基本已经介绍完了,不再赘述。 一个简单的Integer还有什么要介绍的呢?它有一些二进制操作,我们来看一下,另外,我们也分析一下它的valueOf实现。 为什么要关心实现 阅读全文
posted @ 2020-03-27 21:42 Ivy_Xu 阅读(265) 评论(0) 推荐(0)
摘要:Dobbo 阿里开源的高性能、轻量级的RPC框架,提供服务自动注册、服务自动发现等高效服务治理方案,可以和Spring无缝集成。底层使用Netty,基于TCP协议,配合Hession序列化完成RPC通信。 组成部分之间关系 其中,container负责启动,加载,运行服务提供者。 整体架构 接口服务 阅读全文
posted @ 2020-03-27 01:04 Ivy_Xu 阅读(519) 评论(0) 推荐(0)
摘要:RPC 远程过程调用协议。通过网络从远程计算机程序请求服务,不关心底层网络技术的协议。简而言之,RPC从一台机器(客户端)通过参数传递的方式调用另一台机器(服务器)的方法(服务)并得到返回结果。 RPC干了什么? 确定客户端与服务端间的通信协议 高效网络通信(一般选择Netty作为网络通信框架) 服 阅读全文
posted @ 2020-03-27 00:29 Ivy_Xu 阅读(1004) 评论(0) 推荐(0)
摘要:前面两节讨论了Java 8中的函数式数据处理,那是对38节到55节介绍的容器类的增强,它可以将对集合数据的多个操作以流水线的方式组合在一起。本节继续讨论Java 8的新功能,主要是一个新的类CompletableFuture,它是对65节到83节介绍的并发编程的增强,它可以方便地将多个有一定依赖关系 阅读全文
posted @ 2020-03-25 22:15 Ivy_Xu 阅读(538) 评论(0) 推荐(0)
摘要:上节初步介绍了Java 8中的函数式数据处理,对于collect方法,我们只是演示了其最基本的应用,它还有很多强大的功能,比如,可以分组统计汇总,实现类似数据库查询语言SQL中的group by功能。 具体都有哪些功能?有什么用?如何使用?基本原理是什么?本节进行详细讨论,我们先来进一步理解下col 阅读全文
posted @ 2020-03-25 14:40 Ivy_Xu 阅读(360) 评论(0) 推荐(0)
摘要:上节我们介绍了Lambda表达式和函数式接口,本节探讨它们的应用,函数式数据处理,针对常见的集合数据处理,Java 8引入了一套新的类库,位于包java.util.stream下,称之为Stream API,这套API操作数据的思路,不同于我们在38节到55节介绍的容器类API,它们是函数式的,非常 阅读全文
posted @ 2020-03-25 00:54 Ivy_Xu 阅读(407) 评论(0) 推荐(0)
摘要:在之前的章节中,我们的讨论基本都是基于Java 7的,从本节开始,我们探讨Java 8的一些特性,主要内容包括: 传递行为代码 - Lambda表达式 函数式数据处理 - 流 组合式异步编程 - CompletableFuture 新的日期和时间API 本节,我们先讨论Lambda表达式,它是什么? 阅读全文
posted @ 2020-03-24 00:15 Ivy_Xu 阅读(258) 评论(0) 推荐(0)
摘要:上节,我们介绍了Java中的标准序列化机制,我们提到,它有一些重要的限制,最重要的是不能跨语言,实践中经常使用一些替代方案,比如XML/JSON/MessagePack。 Java SDK中对这些格式的支持有限,有很多第三方的类库,提供了更为方便的支持,Jackson是其中一种,它支持多种格式,包括 阅读全文
posted @ 2020-03-23 23:46 Ivy_Xu 阅读(458) 评论(0) 推荐(0)
摘要:在前面几节,我们在将对象保存到文件时,使用的是DataOutputStream,从文件读入对象时,使用的是DataInputStream, 使用它们,需要逐个处理对象中的每个字段,我们提到,这种方式比较啰嗦,Java中有一种更为简单的机制,那就是序列化。 简单来说,序列化就是将对象转化为字节流,反序 阅读全文
posted @ 2020-03-23 23:18 Ivy_Xu 阅读(249) 评论(0) 推荐(0)
摘要:docker可以构建私有PaaS,k8s提供容器的编排功能。docker基于PaaS产生的,k8s基于docker产生的。可以说,它们是PaaS的衍生品。 docker用作自动化应用打包、部署,自动化测试和持续集成,构建私有PaaS PaaS核心解决代码完成后部署、运行、运维、监控一系列事情。(持续 阅读全文
posted @ 2020-03-23 22:42 Ivy_Xu 阅读(1405) 评论(0) 推荐(0)
摘要:容器虚拟化操作系统,容器间共享同一套操作系统资源。虚拟机虚拟硬件,在其上运行一个完整操作系统。 docker定义 容器平台 自动执行重复性任务,例如搭建和配置开发环境 便于创建和使用容器,把应用放在容器 进行版本管理,复制,分享,修改 docker优势 一致的运行环境。docker镜像提供完整的运行 阅读全文
posted @ 2020-03-23 20:31 Ivy_Xu 阅读(694) 评论(0) 推荐(0)
摘要:总结排序算法前,先对排序算法中出现的术语进行说明。 1.术语说明 稳定与不稳定:a在b前,若a=b,排序后a一定还在b前,这就说明稳定 内外排序:基于内存排序,就是内排序 时间复杂度:算法耗费的时间 空间复杂度:耗费内存的大小 2.算法分类 下面详细介绍算法。 1.冒泡排序 这是最常见的排序。从第一 阅读全文
posted @ 2020-03-23 19:59 Ivy_Xu 阅读(259) 评论(0) 推荐(0)
摘要:类加载机制 class文件加载到内存 数据校验,解析,初始化 可被jvm直接使用的java类型 类加载方式: 隐式。程序运行过程中碰到new等方式生成对象,隐式调用类加载器加载对应的类到jvm 显示。利用反射,class.forname显示加载 类加载器类型: bootstrap加载器:java核心 阅读全文
posted @ 2020-03-23 16:34 Ivy_Xu 阅读(154) 评论(0) 推荐(0)
摘要:垃圾回收算法: 标记-清除算法 标记无用对象,再进行清除回收 无法清除垃圾碎片,不需要移动对象 复制算法 按容量划分2个相等的内存区域。当一块用完,将活着的对象复制到另一块上,再对当前使用区域清除 每次只使用一个区域,内存使用率不高。对于存活率高的对象频繁复制 标记-整理算法 标记无用对象,让活着的 阅读全文
posted @ 2020-03-23 16:11 Ivy_Xu 阅读(398) 评论(0) 推荐(0)
摘要:continue:跳出当层循环 break:跳出上层循环 return:结束当前方法,返回。不执行return下面的代码 标记:跳出多层循环。在循环体外定义一个标记,然后在里层循环体使用带标记的break语句 阅读全文
posted @ 2020-03-23 15:00 Ivy_Xu 阅读(2653) 评论(0) 推荐(0)
摘要:常见的优化数据库结构方法: 字段多的表分解多个表,分库分表 中间表 适当增加冗余字段 接下来具体说下分库分表。 1、垂直分表 表的相关性拆分不同的表,表现形式一张列比较多的表拆分多张子表。 特点: 多张子表需要主键,所以主键出现冗余 这种场景使用元表中,尤有些列常用,有些列不常用 查询所有数据要jo 阅读全文
posted @ 2020-03-23 14:29 Ivy_Xu 阅读(520) 评论(0) 推荐(0)
摘要:优化shema、SQL语句 索引 缓存 主从复制,读写分离 数据拆分。垂直拆分,分布式;水平拆分,选择sharding key,改变表结构做一定的冗余,SQL语句尽量带sharding key 优化分页,减少加载的数据 优化分页: 子查询。比如,select * from table where a 阅读全文
posted @ 2020-03-21 17:56 Ivy_Xu 阅读(187) 评论(0) 推荐(0)
摘要:建立服务器与数据库连接 数据库拿到SQL 解析执行 读取数据到内存,进行业务逻辑处理 发给客户端 关闭连接,释放资源 阅读全文
posted @ 2020-03-21 17:17 Ivy_Xu 阅读(1113) 评论(0) 推荐(0)
摘要:存储引擎Storage engine:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。 常见存储引擎: InnoDB:支持ACID事务,提供行级锁和外键的约束。处理大数据容量 MyISAM:不提供事务支持,不支持行级锁和外键 memory:数据存在内存 InnoDB与MyIS 阅读全文
posted @ 2020-03-21 17:09 Ivy_Xu 阅读(358) 评论(0) 推荐(0)
摘要:第一范式:每个列不可拆分 第二范式:在第一范式上,非主键列完全依赖主键,而不能依赖主键一部分 第三范式:在第二范式上,非主键列只能依赖主键,不依赖其他非主键 设计数据库结构,尽量遵守3范式。考虑性能等问题,可以不严格遵守。 阅读全文
posted @ 2020-03-21 16:55 Ivy_Xu 阅读(244) 评论(0) 推荐(0)
摘要:我们以MySQL为例,来说明btree索引算法和hash索引算法。首先,我们先了解一下索引,以及btree和hash是什么。 索引原理 索引用来快速寻找特定的数据值,如果没有索引,查询时需要遍历整张表。原理大概是这样: 把创建了索引的列内容排序 排序结果生成倒排表 在倒排表内容上拼上数据地址 在查询 阅读全文
posted @ 2020-03-21 15:20 Ivy_Xu 阅读(1925) 评论(0) 推荐(0)
摘要:一、聚簇索引 数据与索引放在一起,找到索引就找到数据 二、非聚簇索引 数据与索引存储分开 这里说的数据与索引一起还是分开指的是在btree叶子节点是否只存在索引。 使用场景 动作描述 使用聚簇索引 使用非聚簇索引 列经常被分组排序 应 应返回某范围内的数据 应 不应一个或极少不同值 不应 不应小数目 阅读全文
posted @ 2020-03-21 14:17 Ivy_Xu 阅读(443) 评论(0) 推荐(0)
摘要:组合索引,就是多个列组成一个索引。 划重点:最左前缀匹配原则是组合索引最重要的一个原则。 什么意思呢?我们举例说明,a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d 阅读全文
posted @ 2020-03-21 13:58 Ivy_Xu 阅读(3593) 评论(0) 推荐(0)
摘要:去重可以用set,这里使用jdk8 stream去重。 例如: 1 public static void main(String[] args) { 2 String subStr = "a"; 3 List<String> list = new ArrayList<>(Arrays.asList( 阅读全文
posted @ 2020-03-18 19:34 Ivy_Xu 阅读(2335) 评论(0) 推荐(0)
摘要:思路: 1.用map记录数组元素和出现次数,treemap不能用,如果元素是null,treemap put报错。 2.比较使用Comparator或者Comparable。(默认升序) 比如: 1 public static void main(String[]args){ 2 String[] 阅读全文
posted @ 2020-03-18 14:53 Ivy_Xu 阅读(485) 评论(0) 推荐(0)
摘要:1.NoClassDefFoundError 是一个 Error 类型的异常,是由 JVM 引起的,不应该尝试捕获这个异常。引起该异常的原因是 JVM 或 ClassLoader 尝试加载某类时在内存中找不到该类的定义,该动作发生在运行期间,即编译时该类存在,但是在运行时却找不到了,可能是变异后被删 阅读全文
posted @ 2020-03-18 00:04 Ivy_Xu 阅读(164) 评论(0) 推荐(0)
摘要:一、运行时异常(非受检异常):RuntimeException NullPointerException,ArrayIndexOutBoundException,ClassCastException,IndexOutOfBoundsException,ArrayStoreException,Buff 阅读全文
posted @ 2020-03-17 23:59 Ivy_Xu 阅读(1076) 评论(0) 推荐(0)
摘要:REST命名规范,简单总结: 请求API的URL定位资源 请求METHOD对资源的操作类型 细一点说: 逻辑层级 复数 全部小写 使用 - 代替 _ 阅读全文
posted @ 2020-03-17 15:09 Ivy_Xu 阅读(1524) 评论(0) 推荐(0)
摘要:GET 获取。操作安全。不管操作多少次,资源状态不变 PUT 更新/新增。操作幂等。不管进行多少次,结果一样 POST 新增。操作既不安全也不幂等 DELETE 删除。操作幂等 POST/PUT区别: POST作用集合资源,PUT作用具体资源。通俗地说,POST的URL在服务端确定,PUT的URL在 阅读全文
posted @ 2020-03-17 14:57 Ivy_Xu 阅读(326) 评论(0) 推荐(0)
摘要:JVM:类加载器,运行时数据区(Java内存),执行引擎,本地接口 运行时数据区(JVM内存/Java内存): 堆:对象实例 方法区:类信息,常量,静态变量,编译后的代码 栈:局部变量表,方法出口 程序计数器:行号指示器。循环,跳转等基础指令 本地方法栈:VM调用native方法 执行引擎: gc 阅读全文
posted @ 2020-03-17 08:55 Ivy_Xu 阅读(1066) 评论(0) 推荐(1)
摘要:在日常一般的开发模式中,都是同步开发,调用方法时,通过方法的参数将数据传入,并通过方法的返回值返回结果。但是多线程属于异步开发,理论上,它的运行和结束是不可预料的。当然,java已经可以解决这个问题,比如https://www.cnblogs.com/ivy-xu/p/12375276.html,h 阅读全文
posted @ 2020-03-16 15:18 Ivy_Xu 阅读(1587) 评论(0) 推荐(0)
摘要:详细的可以看38节,总体来说就是,扩容原来的1.5倍。(老数组copy到新数组) 在用无参构造来创建对象的时候其实就是创建了一个空数组,长度为0。这个时候先分配一个默认大小10,再进行扩容。 在有参构造中,传入的参数是正整数就按照传入的参数来确定创建数组的大小。再进行扩容。 阅读全文
posted @ 2020-03-16 14:56 Ivy_Xu 阅读(566) 评论(0) 推荐(0)
摘要:缓存雪崩 缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决方案: 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效 阅读全文
posted @ 2020-03-10 22:40 Ivy_Xu 阅读(2264) 评论(0) 推荐(0)
摘要:from > on > join > where > group by > having > select > distinct > order by > limit,详细https://blog.csdn.net/mine_song/article/details/70185744 阅读全文
posted @ 2020-03-03 19:36 Ivy_Xu 阅读(791) 评论(0) 推荐(0)
摘要:学生表:学号,姓名,出生日期,性别 成绩表:学号,课程号,分数 课程表:课程号,课程名字 老师表:老师号,姓名 # 查询没选课程的学生人数select count(1) from student s left join score sc on s.sid = sc.sid where sc.cid 阅读全文
posted @ 2020-03-03 18:54 Ivy_Xu 阅读(1553) 评论(0) 推荐(0)
摘要:单例模式就是说无论程序如何运行,采用单例设计模式永远只会有一个实例化对象产生。 单例实现原理: (1)构造方法私有化。(2)创建该类的实例化对象,并将其封装成private static类型。(3)定义一个静态方法返回该类的实例。 1.饿汉式 1 /** 2 * 3 * 单例模式的实现:饿汉式,线程 阅读全文
posted @ 2020-03-03 11:30 Ivy_Xu 阅读(211) 评论(0) 推荐(0)
摘要:1.开闭原则(OCP),对扩展开放,对修改关闭。即在使这个模块可以在不被修改的前提下被扩展。2.里氏替换原则(LSP):在任何父类出现的时候都可以用他的子类来替代。3.单一职责原则(SRP):高内聚低耦合。4.接口隔离原则(ISP):一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不 阅读全文
posted @ 2020-03-03 11:23 Ivy_Xu 阅读(164) 评论(0) 推荐(0)
摘要:Spring Bean是事物处理组件类和实体类(POJO)对象的总称,Spring Bean被Spring IOC容器初始化,装配和管理。 或者简单的理解就是对象。 作用域: singlton:单例模式,对象在容器中全局唯一,在IOC容器初始化的时候该对象就会被创建 prototype:多例模式,在 阅读全文
posted @ 2020-03-03 11:11 Ivy_Xu 阅读(528) 评论(0) 推荐(0)
摘要:启动类上面的注解是@SpringBootApplication,它是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解: @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。 @EnableAutoConfigurati 阅读全文
posted @ 2020-03-02 18:00 Ivy_Xu 阅读(4176) 评论(0) 推荐(0)
摘要:Spring Boot有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。使用DEV工具,嵌入式tomcat将重新启动。 添加依赖: 1 <dependency> 2 3 <groupId>org.sp 阅读全文
posted @ 2020-03-02 17:49 Ivy_Xu 阅读(1061) 评论(0) 推荐(0)
摘要:Spring JavaConfig是Spring社区的产品,他提供了配置Spring IOC容器的纯Java方法。因此它有助于避免使用XML配置。 优点: 1.面向对象的配置。 由于配置被定义为JavaConfig中的类,因此用户可以充分使用Java中的面向对象功能。一个配置类可以继承另一个,重写它 阅读全文
posted @ 2020-03-02 17:42 Ivy_Xu 阅读(1407) 评论(0) 推荐(0)
摘要:核心配置文件 bootstrap (.yml 或者 .properties) application (.yml 或者 .properties) bootstrap:是应用程序的父上下文。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。 applicati 阅读全文
posted @ 2020-03-02 17:34 Ivy_Xu 阅读(1292) 评论(0) 推荐(0)
摘要:优点: 一、独立运行 Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。 二、简化配置 默认配置,内嵌容器。 三、应用监控 Spri 阅读全文
posted @ 2020-03-02 17:18 Ivy_Xu 阅读(1440) 评论(0) 推荐(0)
摘要:Spring Boot是一种框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等。使用Spring Boot可以做到专注于Spring应用的开发,而无需过多关注XML的配置。Spring Boot使用“习惯优于配置”的理念,开发人员可以不用或者只需要很少的Spring配置就可以让企业 阅读全文
posted @ 2020-03-02 16:54 Ivy_Xu 阅读(502) 评论(0) 推荐(0)
摘要:要管理基于微服务的应用程序,容器是最简单的选择。它帮助用户单独部署和开发。可以使用Docker将微服务封装到容器的镜像中。没有任何额外的依赖或工作,微服务可以使用这些元素。 阅读全文
posted @ 2020-03-02 15:06 Ivy_Xu 阅读(462) 评论(0) 推荐(0)
摘要:优点: 微服务可以轻松适应其他框架或技术。 单个进程的失败不会影响整个系统。 为大企业和小型团队提供支持。 可以在相对较短的时间内独立部署 缺点: 大量协作。 繁重的架构 - 系统是分布式的,架构涉及很多。 过多的计划来处理操作开销。 阅读全文
posted @ 2020-03-02 15:01 Ivy_Xu 阅读(575) 评论(0) 推荐(0)
摘要:端到端测试:验证工作流中的所有流程,以检查一切是否按预期工作。它还确保系统以统一的方式工作,从而满足业务需求。 阅读全文
posted @ 2020-03-02 14:31 Ivy_Xu 阅读(628) 评论(0) 推荐(0)
摘要:大概要求: 1、总成绩高的排在前面。 2、总成绩相同的情况下,语文成绩高的排在前面。 3、在总成绩,语文成绩都相同的情况下,数学成绩高的排在前面。 4、在成绩都相同的情况下,先输入的同学排在前面。 实体类: 1 public class Student{ 2 String name; 3 int r 阅读全文
posted @ 2020-03-02 02:23 Ivy_Xu 阅读(838) 评论(0) 推荐(0)
摘要:上节介绍完了并发,从本节开始,我们来探讨Java中的一些动态特性,包括反射、类加载器、注解和动态代理等。利用这些特性,可以以优雅的方式实现一些灵活和通用的功能,经常用于各种框架、库和系统程序中,比如: 在63节介绍的实用序列化库Jackson,利用反射和注解实现了通用的序列化/反序列化机制 有多种库 阅读全文
posted @ 2020-03-01 18:15 Ivy_Xu 阅读(270) 评论(0) 推荐(0)
摘要:从38节到54节,我们介绍了多种容器类,本节进行简要总结,我们主要从三个角度进行总结: 用法和特点 数据结构和算法 设计思维和模式 用法和特点 我们在52节展示过一张图,其中包含了容器类主要的接口和类,我们还是用这个图总结一下: 容器类有两个根接口,分别是Collection和Map,Collect 阅读全文
posted @ 2020-03-01 18:01 Ivy_Xu 阅读(222) 评论(0) 推荐(0)
摘要:上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类。 第二类方法大概可以分为两组: 接受其他类型的数据,转换为一个容器接口,目的是使其他类型的数据更为方便的参与到容器类协作体系中,这是一种常见 阅读全文
posted @ 2020-03-01 17:52 Ivy_Xu 阅读(313) 评论(0) 推荐(0)
摘要:之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的。 都有哪些功能呢?大概可以分为两类: 对容器接口对象进行操作 返回一个容器接口对象 对于第一类,操作大概可以分为三组: 查找和替换 阅读全文
posted @ 2020-03-01 17:41 Ivy_Xu 阅读(260) 评论(0) 推荐(0)
摘要:从38节到51节,我们介绍的都是具体的容器类,上节我们提到,所有具体容器类其实都不是从头构建的,它们都继承了一些抽象容器类。这些抽象类提供了容器接口的部分实现,方便了Java具体容器类的实现,理解它们有助于进一步理解具体容器类。 此外,通过继承抽象类,自定义的类也可以更为容易的实现容器接口。为什么需 阅读全文
posted @ 2020-03-01 17:26 Ivy_Xu 阅读(293) 评论(0) 推荐(0)
摘要:前面我们介绍了队列Queue的两个实现类LinkedList和PriorityQueue,LinkedList还实现了双端队列接口Deque,Java容器类中还有一个双端队列的实现类ArrayDeque,它是基于数组实现的。 我们知道,一般而言,由于需要移动元素,数组的插入和删除效率比较低,但Arr 阅读全文
posted @ 2020-03-01 17:13 Ivy_Xu 阅读(276) 评论(0) 推荐(0)
摘要:45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大的元素,元素个数不确定,数据量可能很大,甚至源源不断到来,但需要知道到目前为止的最大的前K个元素。这 阅读全文
posted @ 2020-03-01 16:54 Ivy_Xu 阅读(234) 评论(0) 推荐(0)
摘要:上节介绍了堆的基本概念和算法,本节我们来探讨堆在Java中的具体实现类 - PriorityQueue。 我们先从基本概念谈起,然后介绍其用法,接着分析实现代码,最后总结分析其特点。 基本概念 顾名思义,PriorityQueue是优先级队列,它首先实现了队列接口(Queue),与LinkedLis 阅读全文
posted @ 2020-03-01 16:42 Ivy_Xu 阅读(244) 评论(0) 推荐(0)
摘要:前面几节介绍了Java中的基本容器类,每个容器类背后都有一种数据结构,ArrayList是动态数组,LinkedList是链表,HashMap/HashSet是哈希表,TreeMap/TreeSet是红黑树,本节介绍另一种数据结构 - 堆。 引入堆 之前我们提到过堆,那里,堆指的是内存中的区域,保存 阅读全文
posted @ 2020-03-01 16:29 Ivy_Xu 阅读(197) 评论(0) 推荐(0)
摘要:41节介绍了HashSet,我们提到,HashSet有一个重要局限,元素之间没有特定的顺序,我们还提到,Set接口还有另一个重要的实现类TreeSet,它是有序的,与HashSet和HashMap的关系一样,TreeSet是基于TreeMap的,上节我们介绍了TreeMap,本节我们来详细讨论Tre 阅读全文
posted @ 2020-03-01 16:13 Ivy_Xu 阅读(229) 评论(0) 推荐(0)
摘要:40节介绍了HashMap,我们提到,HashMap有一个重要局限,键值对之间没有特定的顺序,我们还提到,Map接口有另一个重要的实现类TreeMap,在TreeMap中,键值对之间按键有序,TreeMap的实现基础是排序二叉树,上节我们介绍了排序二叉树的基本概念和算法,本节我们来详细讨论TreeM 阅读全文
posted @ 2020-03-01 16:04 Ivy_Xu 阅读(222) 评论(0) 推荐(0)
摘要:40节介绍了HashMap,41节 介绍了HashSet,它们的共同实现机制是哈希表,一个共同的限制是没有顺序,我们提到,它们都有一个能保持顺序的对应类TreeMap和TreeSet,这两个类的共同实现基础是排序二叉树,为了更好的理解TreeMap/TreeSet,本节我们先来介绍排序二叉树的一些基 阅读全文
posted @ 2020-03-01 15:34 Ivy_Xu 阅读(218) 评论(0) 推荐(0)
摘要:上节介绍了HashMap,提到了Set接口,Map接口的两个方法keySet和entrySet返回的都是Set,本节,我们来看Set接口的一个重要实现类HashSet。 与HashMap类似,字面上看,HashSet由两个单词组成,Hash和Set,Set表示接口,实现Set接口也有多种方式,各有特 阅读全文
posted @ 2020-03-01 14:48 Ivy_Xu 阅读(195) 评论(0) 推荐(0)
摘要:前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用?是如何实现的?本节详细介绍。 字面上看,HashMap由两个单词组成,Hash和Map,这里Map不 阅读全文
posted @ 2020-03-01 14:42 Ivy_Xu 阅读(157) 评论(0) 推荐(0)
摘要:上节我们介绍了ArrayList,ArrayList随机访问效率很高,但插入和删除性能比较低,我们提到了同样实现了List接口的LinkedList,它的特点与ArrayList几乎正好相反,本节我们就来详细介绍LinkedList。 除了实现了List接口外,LinkedList还实现了Deque 阅读全文
posted @ 2020-03-01 14:22 Ivy_Xu 阅读(206) 评论(0) 推荐(0)
摘要:从本节开始,我们探讨Java中的容器类,所谓容器,顾名思义就是容纳其他数据的,计算机课程中有一门课叫数据结构,可以粗略对应于Java中的容器类,我们不会介绍所有数据结构的内容,但会介绍Java中的主要实现,并分析其基本原理和主要实现代码。 前几节在介绍泛型的时候,我们自己实现了一个简单的动态数组容器 阅读全文
posted @ 2020-03-01 13:25 Ivy_Xu 阅读(300) 评论(0) 推荐(0)
摘要:35节介绍了泛型的基本概念和原理,上节介绍了泛型中的通配符,本节来介绍泛型中的一些细节和局限性。 这些局限性主要与Java的实现机制有关,Java中,泛型是通过类型擦除来实现的,类型参数在编译时会被替换为Object,运行时Java虚拟机不知道泛型这回事,这带来了很多局限性,其中有的部分是比较容易理 阅读全文
posted @ 2020-03-01 12:44 Ivy_Xu 阅读(255) 评论(0) 推荐(0)
摘要:上节我们介绍了泛型的基本概念和原理,本节继续讨论泛型,主要讨论泛型中的通配符概念。通配符有着令人费解和混淆的语法,但通配符大量应用于Java容器类中,它到底是什么?本节,让我们逐步来解析。 更简洁的参数类型限定 在上节最后,我们提到一个例子,为了将Integer对象添加到Number容器中,我们的类 阅读全文
posted @ 2020-03-01 12:22 Ivy_Xu 阅读(278) 评论(0) 推荐(0)
摘要:之前章节中我们多次提到过泛型这个概念,从本节开始,我们就来详细讨论Java中的泛型,虽然泛型的基本思维和概念是比较简单的,但它有一些非常令人费解的语法、细节、以及局限性,内容比较多。 所以我们分为三节,逐步来讨论,本节我们主要来介绍泛型的基本概念和原理,下节我们重点讨论令人费解的通配符,最后一节,我 阅读全文
posted @ 2020-03-01 12:02 Ivy_Xu 阅读(199) 评论(0) 推荐(0)
摘要:数组是存储多个同类型元素的基本数据结构,数组中的元素在内存连续存放,可以通过数组下标直接定位任意元素,相比我们在后续章节介绍的其他容器,效率非常高。 数组操作是计算机程序中的常见基本操作,Java中有一个类Arrays,包含一些对数组操作的静态方法,本节主要就来讨论这些方法,我们先来看怎么用,然后再 阅读全文
posted @ 2020-03-01 11:34 Ivy_Xu 阅读(253) 评论(0) 推荐(0)
摘要:上节介绍了String,提到如果字符串修改操作比较频繁,应该采用StringBuilder和StringBuffer类,这两个类的方法基本是完全一样的,它们的实现代码也几乎一样,唯一的不同就在于,StringBuffer是线程安全的,而StringBuilder不是。 线程以及线程安全的概念,我们在 阅读全文
posted @ 2020-03-01 11:13 Ivy_Xu 阅读(262) 评论(0) 推荐(0)
摘要:上节介绍了单个字符的封装类Character,本节介绍字符串类。字符串操作大概是计算机程序中最常见的操作了,Java中表示字符串的类是String,本节就来详细介绍String。 字符串的基本使用是比较简单直接的,我们来看下。 基本用法 可以通过常量定义String变量 String name = 阅读全文
posted @ 2020-03-01 11:03 Ivy_Xu 阅读(161) 评论(0) 推荐(0)
摘要:上节我们介绍了异常的基本概念和异常类,本节我们进一步介绍对异常的处理,我们先来看Java语言对异常处理的支持,然后探讨在实际中到底应该如何处理异常。 异常处理 catch匹配 上节简单介绍了使用try/catch捕获异常,其中catch只有一条,其实,catch还可以有多条,每条对应一个异常类型,比 阅读全文
posted @ 2020-03-01 10:53 Ivy_Xu 阅读(211) 评论(0) 推荐(0)
摘要:之前我们介绍的基本类型、类、接口、枚举都是在表示和操作数据,操作的过程中可能有很多出错的情况,出错的原因可能是多方面的,有的是不可控的内部原因,比如内存不够了、磁盘满了,有的是不可控的外部原因,比如网络连接有问题,更多的可能是程序的编程错误,比如引用变量未初始化就直接调用实例方法。 这些非正常情况在 阅读全文
posted @ 2020-03-01 01:03 Ivy_Xu 阅读(279) 评论(0) 推荐(0)
摘要:内部类 之前我们所说的类都对应于一个独立的Java源文件,但一个类还可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部类。 为什么要放到别的类内部呢?一般而言,内部类与包含它的外部类有比较密切的关系,而与其他类关系不大,定义在类内部,可以实现对外部完全隐藏,可以有更好的封装性,代码 阅读全文
posted @ 2020-03-01 00:30 Ivy_Xu 阅读(255) 评论(0) 推荐(0)
摘要:基本概念 上节提到了一个概念,抽象类,抽象类是什么呢?顾名思义,抽象类就是抽象的类,抽象是相对于具体而言的,一般而言,具体类有直接对应的对象,而抽象类没有,它表达的是抽象概念,一般是具体类的比较上层的父类。 比如说,狗是具体对象,而动物则是抽象概念,樱桃是具体对象,而水果则是抽象概念,正方形是具体对 阅读全文
posted @ 2020-03-01 00:01 Ivy_Xu 阅读(527) 评论(0) 推荐(0)