- 博客(51)
- 收藏
- 关注
原创 Java泛型其实很简单(二):泛型,继承,子类型
本系列博客:Java泛型其实很简单(一):泛型类,泛型接口和泛型方法文章目录1 一个常见误区2 泛型类与子类型1 一个常见误区大家都知道:如果Student是Person的子类,那么我们可以将Children的对象赋值给Father的引用。如下:Student s = new Student();Person p = s; // OK.在面向对象中,Student和Person的关系被称为is-a关系(Studentis a Person)。因为Integeris a Number,Do
2021-01-04 23:20:47
467
原创 Java泛型其实很简单(一):泛型类,泛型接口和泛型方法
在我的学生时代,Java泛型在我眼里是一个非常难的知识点,看了许多相关的文章,最后都没能学好它。现在回头看,当时犯了两个错:看的文章不成体系,东讲一点,西讲一点;死记硬背,没有理解好。现在工作了,看到了Java官方教程中关于泛型的部分,相见恨晚。讲得真的很好,它用基础简单的例子,成体系的介绍了泛型的使用方法以及简单的原理。推荐英文好的同学可以看看:Lesson: Generics。我写的这篇博客,可以说是Java官方教程的读后笔记吧。如果有不理解或觉得我说得不准确的,欢迎留言或私信交流,我们共同
2020-12-11 11:20:57
283
1
原创 死锁与哲学家吃饭问题
一、死锁情景有5个哲学家,围坐在一张圆桌子上,桌子上放着5根筷子,分别位于两个哲学家之间,如图所示:他们有时会吃饭,有时会思考。吃饭时,哲学家会先拿起左手的那根筷子,再去拿右手的那根。当一个哲学家拿到两根筷子时,就可以开始吃饭,吃着吃着,又会放下筷子开始思考。以上描述的场景,就会出现死锁:在某一时刻,所有的哲学家同时拿起左手边的筷子,再去拿右边的筷子时,发现已经被其他哲学家拿走了。此时,所有的哲学家都在等待另一根永远拿不到的筷子,就形成了死锁。二、造成死锁的原因造成死锁有3个条件,如果出现死锁,那
2020-10-11 00:17:23
577
原创 Java的volatile关键字
一、CPU缓存给多线程带来的挑战我们先看一段简单的程序:public class VolatileTest { public static void main(String[] args) throws InterruptedException { MyThread t = new MyThread(); t.start(); Thread.sleep(1000); t.stop = true; // 语句1 }}cl
2020-09-25 16:05:56
113
原创 聊聊Java线程状态和常见误区
一、Java Thread文档关于Java的线程状态,[Java Thread文档]讲的非常的清楚了,如果英文水平有4级的话,建议直接阅读文档。(https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html)二、Java线程状态java的线程一共有6个状态:New,Runnable,Waiting,Timed_Waiting,Blocked,Terminate。这里Java使用Thread类的内部枚举类进行表示,我删除文档
2020-09-05 17:22:26
216
原创 三大线程模型之读者与写者问题(Java版)
一、前言阅读文章的过程中如果碰到不懂的,可以留言或私信我,我会抽空回答。编程过程中,我们所有遇到的多线程问题,都可以抽象为三种模型:生产者与消费者;读者与写者;哲学家吃饭问题。能搞清楚这三种模型的实现方式与解决方案,在实际编程中碰到多线程问题处理起来才能得心应手。二、读者与写者问题1. 读者与写者问题概述读者与写者问题描述的是一个多线程问题:假设我们有一个资源,它可以被读或者写,在某一时刻,可能有不同的线程尝试着对这个资源进行操作(读或写)。2. 读者与写者的线程安全问题多个线程同
2020-08-31 23:33:08
1354
原创 三大线程模型之生产者与消费者(Java版)
一、前言阅读文章的过程中如果碰到不懂的,可以留言或私信我,我会抽空回答。编程过程中,我们所有遇到的多线程问题,都可以抽象为三种模型:生产者与消费者;读者与写者;哲学家吃饭问题。能搞清楚这三种模型的实现方式与解决方案,在实际编程中碰到多线程问题处理起来才能得心应手。二、生产者与消费者1. 什么是生产者消费者?生产者与消费者描述的是这样一个多线程问题:有一个或多个生产者生产出某种物品,然后加入到某个容器中,有一个或多个消费者,会不断的从容器中取走物品。当容器满了的时候,生产者会暂时停止生产
2020-08-23 15:31:58
248
原创 同步,异步和多线程,阻塞和非阻塞的差别。
同步,异步和多线程许多人有一个误区:异步和多线程是一件事情。其实不是。我们用一个生活中的例子来解释一下三者的差别。假如你现在有三件家务需要做:1. 煎鸡蛋, 2. 煮开水,3. 打扫客厅同步:你开始煎鸡蛋,等鸡蛋煎完,再去煮开水,开水煮完再去打扫客厅。你得先做完一件事,才会开始做下一件事情,这就是同步;异步:你把鸡蛋丢进锅了,设置了一个闹钟,就去煮开水了。同样,你在开水这边也设置了一个闹...
2020-04-06 22:43:07
417
原创 Java多线程(五):内存模型
Java内存模型JVM将内存划分为栈和堆。程序运行过程中,一些本地变量与,引用放在栈中,对象放在堆中。栈是线程私有的(线程安全),每一个线程都有一个自己的栈。硬件内存结构每个线程(CPU)要执行程序时,会将数据从主内存加载到CPU缓存(寄存器),经过一定时间后再写回主内存。...
2020-03-17 23:51:58
99
原创 Java多线程(四):竞态和核心代码(Race Conditions and Critical Sections)
竞态可能会在核心代码中法师。如果某部分代码被多个线程执行,如果线程执行的顺序不一样,结果不一样,那么这块代码可以被称为核心代码。核心代码举个例子:public class Counter { protected long count = 0; public void add(long value){ this.count = this.count +...
2020-03-17 00:19:00
128
原创 Java多线程:启动线程(三)
Java线程可以执行你写的程序,当你执行main()函数时,JVM会替你创建一个main线程来执行你的程序。Java线程其实也是对象,我们可以在main()函数中创建一个Thread对象并启动它,这样当main线程在执行时,便会创建另一个线程。如何创建并启动Java线程public class JavaThreadTest { public static void main(Stri...
2020-03-13 14:19:56
123
原创 Java多线程:类单线程模型(Same-Threading)(二)
类单线程模型是多线程模型的其中一种,英文为Same-Threading。这样子翻译不知道准不准确。单线程编码简单,出错几率小,但是有一个很大的缺陷:如果你的服务器有多个CPU,或一个CPU有多个核,单线程只能使用到其中的一个CPU或一个核,造成极大的浪费。类单线程模型类单线程模型和单线程类似,,但类单线程模型有多个线程,只是每个线程都在做自己的事情,它们之间没有共享变量,工作起来就像单线程一...
2020-03-13 00:20:40
266
原创 Java多线程:(一)并发模型
并发系统可以使用不同的并发模型实现,不同的并发模型的线程通过不同的合作方式去处理任务共享状态和分离状态(shared state and separate state)共享状态:所有的线程分享某个状态,这个状态可能是一个object,共享状态可能碰到的问题有死锁,竞态等。非共享状态:不同的线程之间不会有共享的数据,当不同的线程需要交流时,他们通过分享不可变的对象,或copy出一份数据给其...
2020-03-09 00:12:51
472
原创 Java:有了Iterator,为何还需要Iterable?
一、Iterator简介直接看源码:public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } defau...
2020-01-16 16:05:00
214
原创 工厂模式
一、 简单工厂模式阿毅经营着一家垃圾回收公司,随着公司业务越做越大,回收垃圾的种类也越来越多,垃圾回收的相关代码如下:public class RecycleClient { public void recycle(Thing thing) { RecycleHandler recycleHandler; if ("horse".equals(t...
2020-01-01 15:44:52
127
原创 装饰者模式
0. 不断拓展的需求卡牌游戏有着一套严格的战力控制方案。例如我们现在开启一个机关兽活动,为了不让新服务器的玩家拥有机关兽,我们一般会做一个限制:开服天数大于X天的服务器才能开出机关兽活动。现在让你来实现这个返回活动时间的接口,你会如何设计?听起来很简单:public interface Time { long[] getActivityTime();} public clas...
2019-12-14 18:12:14
61
原创 MySQL优化:利用索引
文章目录0.什么是索引1. MySQL是如何利用索引进行优化2. 优化主键,外键2.1 主键2.2 外键3. 单列索引和多列索引3.1 单列索引(Column Indexes)3.2 多列索引(Multiple-Cloumns Indexes)3.3 如何知道本次查询使用了哪些索引?4. InnoDB索引分析集合(Index Statistics Collection)4.1 前置知识4.2 av...
2019-12-01 18:41:35
96
原创 笑谈设计模式:策略模式
一、 惊!某程序员手持板砖走向策划,原因竟然是?!阿毅是某公司的程序员,最近负责项目关于武将模块的开发,需求是这样子的:武将需要有名称,品质,可以进行升级,觉醒,不同武将升级,觉醒的逻辑可能相同也可能不同;目前需要实现刘备和关羽两个武将。”不就是简单的面向对象吗?我一天就能搞定“,阿毅心里想。一天过后,代码长这样子:public abstract class Hero { prote...
2019-11-30 16:26:26
132
原创 记一次SQL优化
INDEX:The most important preconditions for using indexes for GROUP BY are that all GROUP BY columns reference attributes from the same index, and that the index stores its keys in order写了这么一条SQLEXP...
2019-11-25 10:42:19
156
原创 DIY一个Java8的Collector:MyListCollector
目标完成一个简单的MyListCollector,能将对应的Stream转换为ListCollector是什么?举个具体的例子:list.stream().filter(x -> x > 2).collect(new MyListCollector());我们想要将一个list中大于2的所有元素都筛选出来,首先list转化为stream,对每一个元素进行判断。但是判断完以后...
2019-10-13 20:40:19
84
原创 实现Function[String, Long],为何String::valueOf可以,Long::toString却不可以?
public class TestMyFunction { public static void main(String[] args) { Function<Long, String> f1 = String::valueOf; Function<Long, String> f2 = Long::toString; //Error!...
2019-09-28 17:20:23
444
原创 Java8 lambda表达式实战(一·)
一、 提出需求对于程序员来说,唯一不变的需求就是需求永远在变化。你永远不知道,产品经理明天会提出一个怎么样的需求。今天产品经理告诉程序员你:“小吴啊,我们需要完成一个可以筛选出红色苹果的功能。”思考一下,你会如何实现呢?最简单的方法: public static List<Apple> appleColorFilter(List<Apple> appleList) {...
2019-09-27 00:14:05
505
1
原创 redis开发与运维读书笔记:第二章
2.1 预备2.1.1 全局命令keys *:查询所有的key,遍历所有的key,时间复杂度为O(n)。当数据量很大时,会非常慢,线上不建议使用;dbsize:返回所拥有的key的数量。redis内部有一个记录当前key数量的值,因此时间复杂度为O(1);exists:检查key是否存在;del:删除指定的key,可批量操作;expire:设置过期时间;ttl:返回key的剩余存货...
2019-09-25 23:37:39
124
原创 Java8 lambda表达式之方法引用
static 方法引用public interface Find { public int toFind();}public class MyClass { public static int myFind() { //do something... }}我们想要快捷的利用MyClass中的myFind()来实现Find接口,我们可以这样:Find finder = My...
2019-09-16 16:09:46
184
原创 为何子类泛型List无法赋值给父类泛型List?
先来看代码:public class GenericTest { public static void main(String[] args) { List<Dog> dogs = new ArrayList<>(); List<Animal> animals = new ArrayList<>(); ...
2019-08-25 16:34:26
4429
2
原创 Java RMI入门
使用使用JavaRMI服务?一共只需要五步!创建一个Remtote接口,继承java.rmi.Remote。java.rmi.Remote是一个没有任何方法的接口,它只是定义的一个规则,我们自己实现的接口必须继承它。在自定义的接口中的所有方法必须抛出RemoteException异常。在自定义接口中的所有方法的返回值和参数必须是基本数据类型或者继承了Serializable接口。在Ja...
2019-08-17 15:30:06
88
原创 Set? set和Set set的区别?
Set<?> set和Set set的区别?Set set这种形式的set,表示set中可以存放任何一种类型的数据,往set中存放数据没有任何数据,但是这样子做是不安全的,因为你无法确定你拿出来的是什么。public class RawType { public static void main(String[] args) { Set set = n...
2019-08-16 17:40:06
1275
原创 Java多态
一、向上转型(Upcasting)我们先来看一个演奏乐器的代码:public enum Note { MIDDLE_C, C_SHARP, B_FLAT;}public class Instrument { public void play(Note n) { System.out.println("Instrument plays: " ...
2019-08-09 10:49:44
327
原创 Java检出异常和非检出异常
检出异常和非检出异常的区别检出异常需要在发生异常的方法中解决,或者抛出。而非检出异常没有这个要求。非检出异常就是RuntimeException。检出异常存在的意义函数就是供外部使用的,它可以理解为一个接口,它有义务告知调用者,它有可能发生一些怎么样的错误,让调用者选择相应的手段来解决它。非检出异常的意义非检出异常(RuntimeException),比如说:NullPointerExc...
2019-07-26 11:02:37
159
原创 Java异常(Java Exception)
文章目录1. 什么是Java异常?2. Exception和Error的区别和联系3. java程序是如何处理异常的?4. 一个简单的异常的例子5. 程序员如何解决异常1. 什么是Java异常?java异常是指在Java程序运行期间,碰到的一些非预期的事件,这些非预期的时间会导致程序非正常终止。2. Exception和Error的区别和联系区别:exception:可以捕获err...
2019-07-25 23:17:40
153
原创 设计模式之模板方法模式
1、模板方法模式的作用想象一下泡茶和冲咖啡的过程:泡茶:1. 煮开水;2. 打开茶包;3. 将茶包放入开水中;4. 加入蜂蜜;重咖啡:1. 煮开水;2. 打开咖啡包;3. 使用开水冲咖啡;4. 加入白糖;如果现在要你来实现程序,执行这两个过程。你要怎么做呢?最简单直接的做法:class Coffee { void prepareRecipe() { boilWat...
2019-07-22 23:58:48
388
原创 设计模式之适配器模式
什么是适配器模式如果现在你的手机需要充电,但是你的充电器是两个插,而电源却是三个插,这时候怎么办?我们通过一个适配器,将三插的电源转换为两插的,这就叫适配器模式。适配器模式实例public interface Duck { void quack(); void fly();}public class BlackDuck implements Duck { @Ov...
2019-07-16 22:58:01
86
原创 Java泛型
文章目录一 、为什么要使用泛型?二 、泛型是如何工作的?三、泛型的具体应用1. 泛型类,接口2. 泛型方法四、泛型通配符五、什么情况下无法使用泛型一 、为什么要使用泛型?现在,有下面两个类:class A{ public void a() { //do something }}class B { public void b() { //do something }}...
2019-07-14 20:29:34
59
原创 设计模式之命令模式
1. 需求现在,你接到了这样一个需求:给一个遥控器添加功能,每一个按键都对应一个功能。这样的需求该如何实现呢?2. 实现思路引入命令模式,命令Command对应一个接口,我们所有的具体的命令都实现在Command接口,每一个具体的命令都有对应具体的物体,如灯,风扇等。遥控器Remote对应一个类,Remote的成员变量为Command,我们的遥控器并不关心Command中具体到底是什么物体,...
2019-07-11 21:57:49
62
原创 如何解决ClassNotFoundException:com.mysql.jdbc.driver
报错原因这个错误是由于JVM无法找到mysql-connector这个包所导致的,所有,我们需要做的就是把mysql-connector包导入工程。maven项目:添加相关依赖javaweb项目:导入Jar。需要注意的点最新的mysql-connector建议将com.mysql.jdbc.driver改为com.mysql.cj.jdbc.driverTomcat7.0以后,需...
2019-07-02 17:52:28
968
原创 设计模式之观察者模式
如果你现在接了一个需求: 需要搭建一个天气预报站,用于接收实时天气信息:温度,可见度,气压。然后又许多的显示器,根据天气预报站数据的变化,来显示不同的信息。如何实现改需求?上面这个问题,就引出了观察者模式。观察者模式什么是观察者模式: 观察者模式是一个1对多的关系,主要组成又Subject,Observer。Subject就是天气预报站,而Observer就是显示器。Observer通过订阅...
2019-06-28 21:46:53
75
原创 Java Lambda之BiFunction
BiFunctionBiFunction<T, U, R>表示可以接收两个参数,返回一个结果。T,U分别表示第一,第二个参数,R表示结果。BiFuntion可以用lambda表达式来实现。Example 1:import java.util.function.BiFunction;public class Main { public static void main...
2019-06-25 11:56:28
906
原创 设计模式之设计模式入门
刚入职的公司正在开发一款游戏DuckSim,它用了最传统的面向对象来设计各种类之间的关系:display()是抽象的,因为不同种类的鸭子有不同的表现方式。为了打败其它同类型游戏,产品经理提出了这个一个新的需求:“我们需要给我的的鸭子加一个fly()的功能!”如何实现这个功能呢?最直接的方式,直接在父类Duck中添加fly()方法。然而,在代码提交后的第二天,测试找到了我:“阿毅,你的代...
2019-06-20 17:15:22
112
原创 设计模式之装饰着模式
小王家里新开了一家咖啡店,咖啡店里面有两种咖啡:白咖啡和黑咖啡。Java代码如下:public abstract class Coffee { private String description; //咖啡简介 public Coffee(String description) { this.description = description; }...
2019-06-19 15:29:33
97
原创 Java反射机制
1、类对象和对象的区别?假设,我们有如下类:public class Hero { public String name; public float hp; public int damage; public int id; static String copyright; static { System.out.prin...
2019-06-16 17:18:48
384
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人