首页 文章 精选 留言 我的

精选列表

搜索[Java],共10000篇文章
优秀的个人博客,低调大师

java设计模式之原型模式-浅克隆与深克隆

《2019年阿里云双11活动拼团》:https://www.aliyun.com/1111/2019/group-buying-share【限时】1年86元,3年229元,用来建站和编程学习【附WordPress建站教程】 定义:原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 ​ 在应用程序中,有些对象比较复杂,其创建过程过于复杂,而且我们又需要频繁的利用该对象,如果这个时候我们按照常规思维new该对象,那么务必会造成资源浪费,这个时候我们就希望可以利用一个已有的对象来不断对他进行复制就好了,这就是编程中的“克隆”。原型模式直接操作底层二进制流,在创建复杂对象是效率提升明显。 ​ UML类图: ​ ​ ​ 浅克隆与深克隆: ​ 浅克隆:当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制。 深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将被复制。 浅克隆: public class Person implements Cloneable { private String name; private boolean gender; private Interest interest; public Person(String name, boolean gender, Interest interest) { this.name = name; this.gender = gender; this.interest = interest; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public Interest getInterest() { return interest; } public void setInterest(Interest interest) { this.interest = interest; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender=" + gender + ", interest=" + interest + '}'; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public static void main(String[] args) throws CloneNotSupportedException { Interest interest = new Interest("摄影"); Person gg = new Person("gg",false,interest); System.out.println(gg); Person dxy = (Person)gg.clone(); dxy.setName("dxy"); dxy.setGender(true); dxy.interest.setName("咖啡"); System.out.println(dxy); System.out.println(gg); } } class Interest{ private String name; public Interest(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Interest{" + "name='" + name + '\'' + '}'; } } 运行结果: ​` Person{name='gg', gender=false, interest=Interest{name='摄影'}} Person{name='dxy', gender=true, interest=Interest{name='咖啡'}} Person{name='gg', gender=false, interest=Interest{name='咖啡'}} ​ ​ ​ 浅克隆对于引用类型,只克隆了引用,因此两个对象的interest公共同一个内存地址,一个对象变化,会引起另一个对象响应的变化。 ​ 深克隆: ​ public class Person implements Cloneable { private String name; private boolean gender; private Interest interest; public Person(String name, boolean gender, Interest interest) { this.name = name; this.gender = gender; this.interest = interest; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public Interest getInterest() { return interest; } public void setInterest(Interest interest) { this.interest = interest; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender=" + gender + ", interest=" + interest + '}'; } @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone(); //直接调用object对象的clone()方法! //添加如下代码实现深复制(deep Clone) Person person = (Person) obj; person.interest = (Interest)this.interest.clone(); //把属性也进行克隆! return obj; } public static void main(String[] args) throws CloneNotSupportedException { Interest interest = new Interest("摄影"); Person gg = new Person("gg",false,interest); System.out.println(gg); Person dxy = (Person)gg.clone(); dxy.setName("dxy"); dxy.setGender(true); dxy.interest.setName("咖啡"); System.out.println(dxy); System.out.println(gg); } } class Interest implements Cloneable { private String name; public Interest(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "Interest{" + "name='" + name + '\'' + '}'; } } 运行结果: ​ Person{name='gg', gender=false, interest=Interest{name='摄影'}} Person{name='dxy', gender=true, interest=Interest{name='咖啡'}} Person{name='gg', gender=false, interest=Interest{name='摄影'}} ​ 通过对引用类型值Interest添加clone方法,并且对Person对象的clone方法改造,实现深克隆。 ​ ​ ​ ​ 此外还可以通过序列化和反序列化的方式实现深复制。 ​ public class Person implements Serializable { private String name; private boolean gender; private Interest interest; public Person(String name, boolean gender, Interest interest) { this.name = name; this.gender = gender; this.interest = interest; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public Interest getInterest() { return interest; } public void setInterest(Interest interest) { this.interest = interest; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender=" + gender + ", interest=" + interest + '}'; } public static void main(String[] args) throws CloneNotSupportedException,ClassNotFoundException,IOException { Interest interest = new Interest("摄影"); Person gg = new Person("gg",false,interest); System.out.println(gg); //使用序列化和反序列化实现深复制 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(gg); byte[] bytes = bos.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); Person dxy = (Person) ois.readObject(); //克隆好的对象! dxy.interest.setName("咖啡"); System.out.println(dxy); System.out.println(gg); } } class Interest implements Serializable{ private String name; public Interest(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Interest{" + "name='" + name + '\'' + '}'; } } 运行结果: ​ Person{name='gg', gender=false, interest=Interest{name='摄影'}} Person{name='gg', gender=false, interest=Interest{name='咖啡'}} Person{name='gg', gender=false, interest=Interest{name='摄影'}} ​` 优点: ​ 当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程。 直接操作二进制流,可以提高实例的创建效率。 缺点: ​ 需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则。 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。 此外clone对象时,不调用构造方法,无视构造方法的权限。 ​

优秀的个人博客,低调大师

深入理解Java虚拟机(JVM) --- 垃圾收集算法(中)

2 回收无效对象的过程 当经可达性算法筛选出失效的对象之后,并不是立即清除,而是再给对象一次重生的机会 判断是否覆盖finalize() 未覆盖该或已调用过该方法,直接释放对象内存 已覆盖该方法且还未被执行,则将finalize()扔到F-Queue队列中 执行F-Queue中的finalize() 虚拟机会以较低的优先级执行这些finalize(),不会确保所有的finalize()都会执行结束 如果finalize()中出现耗时操作,虚拟机就直接停止执行,将该对象清除 对象重生或死亡 如果在执行finalize()方法时,将this赋给了某一个引用,则该对象重生 如果没有,那么就会被垃圾收集器清除 注意:强烈不建议使用finalize()进行任何操作!如果需要释放资源,请用try-finally或者其他方式都能做得更好. 因为finalize(

优秀的个人博客,低调大师

Java高可用集群架构与微服务架构简单分析

序 可能大部分读者都在想,为什么在这以 dubbo、spring cloud 为代表的微服务时代,我要还要整理这种已经“过时”高可用集群架构? 本人工作上大部分团队都是7-15人编制的开发团队,对应的公司项目也大都是中小型项目,最大的项目 PV/UV 也就只有 10w/2w 。在这样的场景下,中小型公司一般都是创业起步没多久,大部分都需要本着“开源节流”、“以最小的成本把产出最大化”。微服务架构相比于高可用集群架构,个人理解,对于技术团队的成员编制相对要多一点,服务器部署成本相对也要高一点。 作为技术团队负责人,肯定要为企业整体成本考虑,否则要不了多久,便是讨薪大军的一员了吧。。。 一、如何选择 1、高可用集群 适用于中小型创业公司项目架构,小型技术团队快速迭代版本发布部署需求,前期低成本运行,爆发时可通过投入适量成本横向扩容服务器抗压。 特点: 前期技术开发成本低 一定的服务器扩容成本 核心团队编制及技能要求较少 项目发布部署基本无依赖,时间成本低 服务器运维成本一般 大而全的项目模块分离设计 更省更稳的技术架构选择 微服务架构强迫症不适用 2、微服务架构 适用于业务架构较大的中大型科技公司项目架构,系统可拆分多个项目单独运营,大型技术团队、平台产品规范化管理,前期投入一定的成本,可以低成本扩容指定服务的服务器抗压。 前期一定的技术开发成本 较低的服务器扩容成本 核心团队编制及技能要求较高 项目发布部署存在依赖,逐个部署,时间成本较高 服务器运维成本一般或较高 较清晰的项目模块分离设计 更潮更时尚的技术架构选择 二、高可用集群架构 1、必备服务器清单 负载均衡服务器 web项目服务器 缓存服务器 数据库服务器(主备) 注意:可能有人会问,若是小型项目单机服务,负载均衡是否就不需要?负载均衡主要工作是分发请求到源服务器,另一个作用也是为了保护源服务器,不暴露服务器真实IP,大幅度降低服务器被DDoS攻击的风险,可参考《被人DDoS攻击了,分析一下原理和防护》 一文。 2、扩展服务器清单 更多web项目服务器(集群负载) 异步服务服务器(配置中心、消息队列、job任务等) 数据库服务器(读写分离、主从复制) 文件服务器 2、架构图 三、微服务架构 1、服务器清单 dubbo / spring cloud 全家桶组件服务器 负载均衡服务器 A模块 web项目服务器 B模块 web项目服务器 C模块 web项目服务器 XXX模块 web项目服务器 缓存服务器 数据库服务器 文件服务器 异步服务服务器(配置中心、消息队列、job任务等) 2、架构图 注:图片来源 http://yun.itheima.com/open/217.html 四、总结 综上,我们对于高可用集群和微服务架构做了简单的场景和架构图分析,并不是说什么场景下一定要用什么架构,也不是说什么最潮流就用什么架构,而是根据实际成本和产出作为出发点做选择。 创业公司刚起步,资金可能也就百来万,搞微服务架构,光技术团队和服务器一个月的成本就占了公司一大头,产品还没上线,公司就已经倒闭了; 有资源的公司,动不动就能获得千万级甚至更高级别的融资,业务方向众多,若还只是用高可用架构,所有的业务模块都臃肿在一个项目里,不论是代码管理还是人员管理上,都是巨大的资源消耗。 My Blog blog.guijianpan.com 技术交流

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册