首页 文章 精选 留言 我的

精选列表

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

Apache Lucene 8.4.0 发布,Java 全文搜索引擎

Apache Lucene 8.4.0 发布了,Lucene 是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎、部分文本分析引擎。目的是为软件开发人员提供一个简单易用的工具包,以方便地在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 新版本的亮点包括: LatLonShape 现在支持 “CONTAINS” 关系,该关系可以查找包含查询形状的所有索引形状 并发搜索通过允许收集器跨线程共享信息,以更有效地跳过非竞争性命中,从而变得更加高效 在密集节点上更快的 FST 查找 现在可以使用 SIMD 指令解码贴子 LRUQueryCache 包括新的试探法,可防止缓存过多地影响延迟 LatLonShape 构建了更高效的树,有望提高搜索速度 BaseDirectoryReader 可以更有效地隐藏文档的子集的阅读器视图 BKD 树顶部的索引现在通过 MMapDirectory 进行了堆外存储 简单间隔查询支持高亮 超过时间时,可能会中断 DocValues 的读取 发布公告

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

声明式 API 编程框架 Mars-java 发布 3.0.9

本次更新如下: 分布式锁只需一行注解 新增文件下载功能封装 多个文件上传可以一次性接收 文件上传可以配置大小限制 分布式锁 @RedisLock(key = "自己定义一个key") public int insert(){ return 1; } 这个锁会在事务开启之前获取,在事务提交以后解锁,并且只对MarsBean有效,对API和DAO无效 如果你不需要锁住整个方法,只需要锁一小段代码,那么可以去我的官网查看相应资料 文件下载 在service实现类的方法里传入HttpMarsResponse对象,然后一行代码搞定 public void downLoad(HttpMarsResponse response) { try { File file = new File("/Users/yuye/Desktop/demo.mov"); InputStream inputStream = new FileInputStream(file); response.downLoad("文件名称",inputStream); } catch (Exception e){ } } 文件上传接收 在接收参数的实体类里面 添加如下属性 public class UserInfoDTO { //单个文件 private MarsFileUpLoad file; //多个文件 private MarsFileUpLoad[] files; } 配置文件大小限制 在配置文件里加入 以下配置 #上传文件大小(默认 1M,10M),单位k fileUpload: fileSizeMax: 100 sizeMax: 1000 同时,Mars-cloud 3.0.6也发布了 官网:http://mars-framework.com/

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

Java设计模式之原型模式(创建型模式)

定义:原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 ​ 在应用程序中,有些对象比较复杂,其创建过程过于复杂,而且我们又需要频繁的利用该对象,如果这个时候我们按照常规思维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设计模式之建造者模式(创建型模式)

《2019年阿里云双11活动拼团》:https://www.aliyun.com/1111/2019/group-buying-share【限时】1年86元,3年229元,用来建站和编程学习【附WordPress建站教程】 1 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 类型:创建类模式。 四个要素: 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。 2 代码实现 class Product { private String name; private String type; public void showProduct(){ System.out.println(“名称:”+name); System.out.println(“型号:”+type); } public void setName(String name) { this.name = name; } public void setType(String type) { this.type = type; } } abstract class Builder { public abstract void setPart(String arg1, String arg2); public abstract Product getProduct(); } class ConcreteBuilder extends Builder { private Product product = new Product(); public Product getProduct() { return product; } public void setPart(String arg1, String arg2) { product.setName(arg1); product.setType(arg2); } } public class Director { private Builder builder = new ConcreteBuilder(); public Product getAProduct(){ builder.setPart(“宝马汽车”,“X7”); return builder.getProduct(); } public Product getBProduct(){ builder.setPart(“奥迪汽车”,“Q5”); return builder.getProduct(); } } public class Client { public static void main(String[] args){ Director director = new Director(); Product product1 = director.getAProduct(); product1.showProduct(); Product product2 = director.getBProduct(); product2.showProduct(); } } 3 比较及总结 建造者模式的优点: 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。 建造者模式与工厂模式的区别: 建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。 与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。 总结: 建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册