java基础
文章平均质量分 71
hsj1213522415
在校学生
展开
-
代码优雅之路-避免大量if...else方法二
这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。订单实体:service接口:传统实现根据订单类型写一堆的if else:使用策略模式实现利用策略模式,只需要两行即可实现业务逻辑:可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会...原创 2019-11-27 10:07:47 · 427 阅读 · 0 评论 -
分库分表?如何做到永不迁移数据和避免热点?
一、前言中大型项目中,一旦遇到数据量比较大,小伙伴应该都知道就应该对数据进行拆分了。有垂直和水平两种。垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。如下图,独立的拆分出订单库和用户库。水平拆分的概念,是同一个业务数据量大之后,进行水平拆分。上图中订单数据达到了4000万,我们也知道mysql单表存储量推荐是百万级,如果不进行处理,mysql单表...转载 2019-11-27 09:40:14 · 268 阅读 · 0 评论 -
java线程池原理
Java ThreadPoolExecutor线程池原理及源码分析一、源码分析(基于JDK1.6)ThreadPoolExecutor是使用最多的线程池组件,了解它的原始资料最好是从从设计者(Doug Lea)的口中知道它的来龙去脉。在Jdk1.6中,ThreadPoolExecutor直接继承了AbstractExecutorService,并层级实现了ExecutorService和E...原创 2019-11-23 23:50:53 · 289 阅读 · 0 评论 -
代码优雅之路-建造者模式的使用
建造者模式是一种创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示。主要特点是通过逐步添加单体对象形成一个复杂的对象。建造者模式有两种写法,为:原型用法:原型写法中的builder分为四个模块:Product:被构造的复杂对象Builder:抽象接口BuilderImpl:抽象接口的具体实现Director:接口的构造者和使用者上代码...原创 2019-11-20 23:03:53 · 285 阅读 · 0 评论 -
代码优雅之路-避免大量new
使用工厂模式-通用1//抽象产品类public abstract class Product { public void method1(){ //所有产品的共性 } //抽象方法 具体有继承它的类去实现 public abstract void method2();}//产品实现类 public class ConcretProduct1 extends Pro...原创 2019-11-18 23:56:00 · 195 阅读 · 0 评论 -
代码优雅之路-避免大量if...else方法
避免大量if...else方法根据if中的条件定义对应的类型/** * @author * @date 2019/4/11 */public class CompensationTask { private CompensationTaskType compensationTaskType; private String data; private ...原创 2019-11-17 23:53:57 · 698 阅读 · 0 评论 -
缓存中存储数据推荐格式
不要使用二进制格式当使用如protoBuf、msgpack或者java自带的二进制格式进行序列化时候,为了节约数据量的原因,会将类里的字段按字段在类中出现的顺序进行序列化。当我们因为需求进行升级时,可能会对类里的字段进行增删或者移动。此时,我们之前存储在jimdb里的数据在读取回来进行反序列化时就会报错。因为上述原因,我们推荐用顺序兼容&新增字段兼容的序列化方式,如JSON,进行数...原创 2019-11-08 11:44:29 · 572 阅读 · 0 评论 -
Tomcat启动时 Illegal access: this web application instance has been stopped already的处理
现象在接入日志采集client包时,总时出些奇怪的问题,昨天接入日志采集,但是加入后,就是启不来;tomcat 有异常信息 信息: Illegal access:thisweb application instance has been stopped already. Could not load org.apache.kafka.common.metrics.Met...原创 2019-04-24 08:59:28 · 11216 阅读 · 0 评论 -
Java浅拷贝和深拷贝
对象拷贝(ObjectCopy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部数据。Java中有三种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)、延迟拷贝(Lazy Copy)。浅拷贝浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精原创 2017-10-17 15:15:08 · 361 阅读 · 0 评论 -
使用序列化实现对象的拷贝
在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能的提升非常明显。然而拷贝分为深拷贝和浅拷贝之分,但是浅拷贝存在对象属性拷贝不彻底问题。浅拷贝问题代码如下:public class Person implements Cloneable{ /*原创 2017-10-17 16:20:08 · 233 阅读 · 0 评论 -
Java动态代理机制
在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。InvocationHandler:InvocationHandler is the interface implemented by the invocation handler of原创 2017-09-07 16:03:19 · 187 阅读 · 0 评论 -
多态
多态的定义:是指允许不同类的对象对同一消息作出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。多态需要用到的技术:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒原创 2017-10-02 13:16:35 · 205 阅读 · 0 评论 -
Java中的static关键字
static的含义在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块。Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用,堆内存主要存放一些对象。在JVM加载一个类的时候,若该类存在static修饰的成员变量原创 2017-10-17 22:06:46 · 246 阅读 · 2 评论 -
HashMap和TreeMap
首先在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对。HashMap 是基于哈希表(线程安全的,不允许使用null键)的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。不保证映射的顺序,特别是它不保证该顺序恒久不变(即迭代的顺序不一定原创 2017-09-15 12:42:25 · 1340 阅读 · 0 评论 -
堆中基本操作方法伪代码分析
堆其实是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在O(1)~O(logn)之间。堆的几个基本操作:上浮 shift_up;下沉 shift_down插入 push弹出 pop取顶 top堆排序 heap_sortShift_up( i )//i为当前节点{ while( i / 2 >= 1) {原创 2017-09-14 15:49:45 · 1199 阅读 · 0 评论 -
Java抽象类和接口
Java抽象类在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要原创 2017-09-07 22:12:15 · 249 阅读 · 0 评论 -
TCP的三次握手和四次挥手,以及两次握手为什么不行?
TCP三次握手和四次挥手的全过程三次握手: 第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包A原创 2017-09-08 12:49:10 · 2064 阅读 · 0 评论 -
JVM方法内联
1. 函数的调用过程。调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。 这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。也就是通常说的压栈和出栈。 因此,函数调用要有一定的时间和空间方面的开销。那么对于那些函数体代码不是很大,又频繁调用的函数来说,这个时间原创 2017-09-27 09:38:53 · 402 阅读 · 1 评论 -
修饰符volatile和synchronized的区别联系
关键字volatitle的主要作用是使变量在多个线程间可见。关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。public class RunThread extends Thread { private volatile boolean isRunning = true; public boolean isRunning(){原创 2017-09-03 15:40:33 · 496 阅读 · 0 评论 -
内部类学习笔记
1.为什么使用内部类?使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响1.1.使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,使用内部类还能够为我们带来如下特性:(1)、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独。(2)、在单个外围类中,原创 2017-06-02 20:38:52 · 203 阅读 · 0 评论