一网打尽java注解-克隆-面向对象设计原则-设计模式
文章目录
- 注解
- 内置注解
- 元注解
- 对象克隆
- 为什么要克隆?
- 如何克隆
- 浅克隆
- 深克隆
- Java设计模式
- 什么是设计模式?
- 为什么要学习设计模式?
- 建模语言
- 类
- 接口
- 类之间的关系
- 依赖关系
- 关联关系
- 聚合关系
- 组合关系
- 继承关系
- 实现关系
- 面向对象设计原则
- 单一职责
- 开闭原则
- 里氏替换原则
- 依赖倒置
- 接口隔离
- 迪米特原则
- 组合/聚合服用原则
- 原则总结:
- 设计原则的核心思想
- 23种设计模式
- 常用的设计模式
- 单例模式
- 饿汉式单例
- 懒汉式单例
- Runtime类
注解
注解:也叫标注,用于包、类、变量、方法、参数上。可以通过反射获取标注。可以在编译期间使用,也可以被编译到字节码文件中,运行时生效。
内置注解
内置注解:Java语言已经定义好的注解。
@Overread:用于方法重写。
@Deprecated:标记过时方法。
@SuppressWarnings:指示编译器去忽略注解中声明的警告。
@FunctionalInterface:用于指标被修饰的接口是函数式接口。
元注解
元注解:修饰注解的注解。
@Target:用于描述注解作用于那些元素上。
CONSTRUCTOR//用于描述构造器
FIELD//用于描述域
LOCAL_VARIABLE//用于描述局部变量
METHOD//用于描述方法
PACKAGE//用于描述包
PARAMETER//用于描述参数
TYPE//用于描述类、接口(包括注解类型) 或enum声明
@Retention:表示注解什么时候生效。
SOURCE//在源文件中有效(即源文件保留)
CLASS//在class文件中有效(即class保留)
RUNTIME//在运行时有效(即运行时保留)
对象克隆
克隆:在一个现有的对象基础上克隆一个新的对象。
为什么要克隆?
通过new出来的对象,所有属性都是空值或者默认值,希望将原来对象的属性也一并赋值给一个新的对象。
//一下情况并不是克隆,只是将对象地址赋值给了另一个对象.
Student stu1 = new Student();
Student stu2 = stu1;
如何克隆
- 类实现Cloneable接口,重写Object类中的clone方法。
- 通过序列化来实现。
java语言中数据类型分为基本数据类型和引用数据类型,基本数据类型的值可以直接进行复制,但是引用数据类型只能复制引用地址。所以浅克隆和深克隆的区别就在于是否支持引用类型的成员变量的复制。
浅克隆
不支持对象中的引用类型复制值,仅仅复制地址。
简单来说就是,当对象被克隆时只复制它本身,和其他基本数据类型的成员变量,而引用类型的对象并没有复制。
深克隆
支持对象中的引用类型成员变量复制值,引用类型成员变量也会克隆一个新的对象。
简单来说,就是除了对象本身被复制外,对象包含的所有成员变量也将复制。
Java设计模式
设计模式本来是在建筑上使用的,后来运用于程序设计。
什么是设计模式?
设计模式是指一套被反复使用,代码设计经验的总结。针对一些问题的解决方式,经过很长时间的修改打磨最终成为一种固定的模式。
为什么要学习设计模式?
在面向对象的基础上(继承、封装、多态),更好的理解和运用。
使用设计模式的优点:
可以提高程序员的思维、编程、设计能力;
使程序更加标准化,提高软件开发效率;
使得代码的可重用性高,可读性强,灵活性好,可维护性强;
更好的理解源代码。
建模语言
统一建模语言(Unified Modeling Language,UML)是一种用于软件系统分析和设计的语言工具,用于帮助开发人员进行思考和记录思路的结果。
UML图:通过不同的图形和符号,描述软件模型以及各个元素之间的联系。
类图:是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及他们与其它类之间的关系等。类图是面向对象建模的主要组成部分。
类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化人们对系统的理解;类图是系统分析与设计的产物。
类
类是指具有相同属性、方法和关系的对象的抽象,它封装了数据的行为,是面向对象程序设计的基础,具有封装、继承和多态三种特性。
在UML中,类的UML:
—no:long 表示不可见参数no的数据类型为long;
+display():void表示方法display为public,且返回值为void;
protected(#)
接口
接口是一种特殊的类,它具有类的结构但是不能实例化,只可以被子类实现。它包含抽象操作,但是不包含属性。它描述了类或组件对外可见的动作。
在UML中,接口使用一个带有名称的圆圈表示。
类之间的关系
在系统中,类并不是孤立存在的,类与类之间存在一定关系的。根据类之间的耦合度从弱到强依次为:依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系。
依赖关系
依赖关系是一种临时关系。代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成某些功能。
在UML类图中,依赖关系使用带箭头的虚线表示,从使用类指向被依赖类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLETOFmh-1692757184340)(
)]
关联关系
关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师与学生等。关联关系是类与类之间最常用的一种关系,分为关联关系,聚合关系和组合关系。
关联关系一般分为单向关联、双向关联、自关联。
单向关联:
在 UML 类图中单向关联用一个带箭头的实线表示。上图表示每个顾客都有一个地址,这通过让 Customer 类持有一个类型为 Address 的成员变量类实现。
双向关联:
从上图中我们很容易看出,所谓的双向关联就是双方各自持有对方类型的成员变量。
在 UML 类图中,双向关联用一个不带箭头的直线表示。
自关联:
自关联在 UML 类图中用一个带有箭头且指向自身的线表示。上图的意思就是Node 类包含类型为 Node 的成员变量,也就是“自己包含自己”。
聚合关系
聚合关系是关联关系的一种,是整体与部分之间的关系。
聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。例如,学校与老师的关系,学校包含老师,但如果学校停办了,老师依然存在。
在 UML 类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体。
组合关系
组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。
在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。例如,头和嘴的关系,没有了头,嘴也就不存在了。
在 UML 类图中,组合关系用带实心菱形的实线来表示,菱形指向整体。
继承关系
继承关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系。
在 UML 类图中,继承关系用带空心三角箭头的实线来表示,箭头从子类指向父类。在代码实现时,使用面向对象的继承机制来实现继承关系。例如上图, Student 类和 Teacher 类都是 Person 类的子类。
实现关系
实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
在 UML 类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。例如上图,汽车和船实现了交通工具。
面向对象设计原则
如何同时提高系统的可维护性和可服用性。就需要遵从面向对象语言设计原则,可以在进行设计方案时减少设计错误,提高软件的实际水平。
单一职责
单一职责可以理解为一个类只负责一个功能领域中的相应职责。
优点:低耦合、高内聚。
开闭原则
开闭原则:扩展开放,修改关闭。
系统的需求是一直在变化的,因此在设计时需要考虑怎样设计才能在需求改变时,系统依旧可以稳定。
需要系统进行抽象化设计,抽象化是开闭原则的关键。在进行软件设计时提前将一些可能会改变的类设计为抽象类来隔离变化。在发生变化时,无需对抽象类进行改动,只需要添加具体类来实现业务功能即可。在不修改自己原有的代码的基础上扩展功能。
/*开闭原则案例*/
public class CarDemo {public static void main(String[] args) {new CarFactory().createCar(1);new CarFactory().createCar(2);new CarFactory().createCar(3);new CarFactory().createCar(4);new CarFactory().createCar(5);}}/*汽车工程类,专门负责造汽车*/
class CarFactory{/*违反了开闭原则,后期如果添加新的汽车类,则需要修改代码*/public void createCar(int type){if(type==1){System.out.println("造宝马汽车"+new Car("宝马汽车"));}else if(type==2){System.out.println("造奥迪汽车"+new Car("奥迪汽车"));}else{System.out.println("造大众汽车"+new Car("大众汽车"));}}}class Car{String name;public Car(String name) {this.name = name;}
}
class CarDemo{public static void main(String[] args) {new CarFactory().carfactory(new BMW());new CarFactory().carfactory(new Aodi());new CarFactory().carfactory(new DaZhong());}}class CarFactory{void carfactory(Car car){car.createCar();}
}//扩展业务时只需要继承Car类无需修改原代码
abstract class Car{public abstract void createCar();
}class BMW extends Car{@Overridepublic void createCar() {System.out.println("造宝马汽车");}
}class Aodi extends Car{@Overridepublic void createCar() {System.out.println("造奥迪汽车");}
}class DaZhong extends Car{@Overridepublic void createCar() {System.out.println("造大众汽车");}
}class BC extends Car{@Overridepublic void createCar() {System.out.println("造奔驰汽车");}
}
优点:适应性强、灵活、稳定、可扩展性强、可复用。
里氏替换原则
回顾继承:
优势:提高了代码的复用性,提高了代码的扩展性。
弊端:继承是侵入式(只要继承,就必须拥有父类的属性和方法);继承机制很大的增加了耦合性(父类被子类继承,父类功能修改会影响子类)。
里氏替换原则:继承必须确保父类所拥有的性质子类中必然成立。
里氏替换原则的定义:通俗的讲就是,子类继承父类时除添加新的方法完成新增功能外尽量不要重写父类的方法。
public class CalculatorDemo{public static void main(String[] args) {System.out.println(new SuperCalculator().sum(5,5,5));}}
//计算器 基类
class Calculator {//加法public int add(int a,int b){return a+b;}//减法public int sub(int a,int b){return a-b;}
}
/*超级计算器子类
*/
class SuperCalculator extends Calculator{//重写了父类加法@Overridepublic int add(int a, int b) {return a+b+5;}//求和方法 子类新增的功能public int sum(int a,int b,int c){//调用add(),但是子类重写了父类方法,此处调用的子类方法发生了变化,这里相当于调用了重写的add方法,int result = add(a,b);//重写add后结果为20,不重写结果为15return result+c;}
}
里氏替换原则的作用:功能正确性得到保障,实现开闭原则的重要方式之一,降低了需求变更时引入的风险。
依赖倒置
上层模块不应该依赖底层模块,它们都应该依赖于抽象
简单讲就是:要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。就是针对抽象层编程,面向接口编程。
接口隔离
使用多个接口,而不使用单一的总接口,不强迫新功能实现不需要的方法。
迪米特原则
一个对象应该对其他对象有最少的了解
就是只对直接朋友进行交流
public class Demeter {public static void main(String[] args) {new SchoolManger().printAllEmployee(new CollegeManger());}
}/*学校员工类*/
class SchoolEmployee{private String id;public void setId(String id){this.id = id;}public String getId(){return id;}
}/*学院员工类*/
class CollegeEmployee{private String id;public void setId(String id){this.id = id;}public String getId(){return id;}
}//学院员工管理管理类
class CollegeManger{//生成学院所有的员工public List<CollegeEmployee> getCollegeEmployee(){ArrayList<CollegeEmployee> collegeEmployeeArrayList = new ArrayList<CollegeEmployee>();for (int i = 0; i <10 ; i++) {CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工的id="+i); //添加学院员工collegeEmployeeArrayList.add(collegeEmployee);}return collegeEmployeeArrayList;}}
//学校员工管理类
class SchoolManger {//生成学校的员工public List<SchoolEmployee> getSchoolEmployee() {ArrayList<SchoolEmployee> employeeArrayList = new ArrayList<SchoolEmployee>();for (int i = 0; i < 5; i++) {SchoolEmployee employee = new SchoolEmployee();employee.setId("学校的员工id=" + i);employeeArrayList.add(employee);}return employeeArrayList;}//输出学校员工和学院员工信息public void printAllEmployee(CollegeManger collegeManger) {//获取到学校员工List<SchoolEmployee> employeeArrayList = this.getSchoolEmployee();System.out.println("--------学校员工--------");for (SchoolEmployee employee1 : employeeArrayList) {System.out.println(employee1.getId());}System.out.println("--------学院员工--------");List<CollegeEmployee> collegeEmployees = collegeManger.getCollegeEmployee();//此处学校管理类中出现CollegeEmployee,此类与SchoolManger并非直接朋友,不合理for (CollegeEmployee collegeEmployee : collegeEmployees) {System.out.println(collegeEmployee.getId());}}
}
public class Demeter {public static void main(String[] args) {new SchoolManger().printAllEmployee(new CollegeManger());}
}/*学校员工类*/
class SchoolEmployee{private String id;public void setId(String id){this.id = id;}public String getId(){return id;}
}/*学员员工类*/
class CollegeEmployee{private String id;public void setId(String id){this.id = id;}public String getId(){return id;}
}//学院员工管理管理类
class CollegeManger{//生成学员所有的员工public List<CollegeEmployee> getCollegeEmployee(){ArrayList<CollegeEmployee> collegeEmployeeArrayList = new ArrayList<CollegeEmployee>();for (int i = 0; i <10 ; i++) {CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工的id="+i); //添加学院员工collegeEmployeeArrayList.add(collegeEmployee);}return collegeEmployeeArrayList;}public void printCollegeEmployee(){List<CollegeEmployee> collegeEmployee = getCollegeEmployee();for (CollegeEmployee employee : collegeEmployee) {System.out.println("学员员工id="+employee.getId());}}}
//学校员工管理类
class SchoolManger {//生成学校的员工public List<SchoolEmployee> getSchoolEmployee() {ArrayList<SchoolEmployee> employeeArrayList = new ArrayList<SchoolEmployee>();for (int i = 0; i < 5; i++) {SchoolEmployee employee = new SchoolEmployee();employee.setId("学校的员工id=" + i);employeeArrayList.add(employee);}return employeeArrayList;}//输出学校员工和学院员工信息public void printAllEmployee(CollegeManger collegeManger) {//获取到学校员工List<SchoolEmployee> employeeArrayList = this.getSchoolEmployee();System.out.println("--------学校员工--------");for (SchoolEmployee employee1 : employeeArrayList) {System.out.println(employee1.getId());}//CollegeManger与SchoolManger是直接朋友,相互之间访问System.out.println("--------学员员工-----------");collegeManger.printCollegeEmployee();}
}
组合/聚合服用原则
优先使用组合,使系统更灵话,其次才考虑继承,达到复用的目的。
案例:现在假设有一个 A 类,里面有两个方法,有一个类 B,想要复用这两个方法,请问有几种方案?
方案一:让B继承A;
方案二:B中引用A;
方案三:方法传参;
原则总结:
开闭原则:要求对扩展开放,对修改关闭
里氏替换原则:不要破坏继承体系
依赖倒置原则:要求面向接口编程
单一职责原则:实现类职责要单一
接口隔离原则:在设计接口的时候要精简单一
迪米特法则:只与直接的朋友的通信
合成复用原则:尽量使用聚合和组合的方式,而不是使用继承
设计原则的核心思想
找出应用中可能需要变化之处,独立出来,不要和不需要变化的代码混在一起
针对接口编程,而坏是针对实现编程
为了交互对象的松耦合设计而努力
遵循设计原则:就是为了让程序高内聚,低耦合
23种设计模式
https://www.runoob.com/design-pattern/design-pattern-tutorial.html
- 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
- 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
- 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
- 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
- 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
- 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
- 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
- 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
- 装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。
- 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
- 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复 用。
- 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
- 模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
- 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
- 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
- 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
- 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能 力。
- 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
- 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
- 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数 据,而不暴露聚合对象的内部表示。
- 访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
- 备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
- 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。
常用的设计模式
单例模式
有些系统或者项目中,为了节省资源、保证数据内容的一致性,对某些类要求只能创建一个对象实例。如Windows中的只能打开一个任务管理器,这样可以避免因为打开多个任务管理器窗口而造成内存资源浪费,或者出现各个窗口显示的内容不一致等错误。
特点:
只能有一个实例对象
单例对象必须由单例类自行创建(关联关系中的自关联)
单例类需要对外提供一个访问单例的全局访问点
单例模式实现形式有两种:饿汉式、懒汉式。
饿汉式单例
在类被加载时创建对象,不存在线程安全问题。
public class Window {//创建静态对象,随着类的加载一起加载private static Window window = new Window();private Window(){}//构造方法私有化,防止外部直接构造//提供给外部获取实例对象的方法public static Window getWindow() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return window;}
}
public class Test {public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{System.out.println(Window.getWindow());}).start();}}
}
/*
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
com.single.demo1.Window@6bfcab86
*/
//由结果可以看出创建的十个对象是同一个对象
懒汉式单例
在类加载的时候不创建对象,在使用的时候创建。这时生成的对象需要我们自己进行控制,存在线程安全问题。
public class Window {private static Window window=null;private Window(){}
/*懒汉式单例会出现线程安全问题:在多线程访问时,可能会有多个线程同时进行到if,就会创建出多个对象*/public static Window getWindow(){if(window==null){window = new Window();}return window;}
}
//解决方法1.给方法加锁, 可以解决,但是效率低,一次只能有一个线程进入获取public static synchronized Window getWindow() {if (window == null) {window = new Window();}return window;}
//解决方法2.给代码块加锁,双重检索+synchronized
public static Window getWindow(){if(window==null){synchronized(Window.class){if(window == null){window = new Window3();}}}return window;}
经过上面两次改进任然存在问题,就是指令重排问题,new一个对象的时候一般步骤为:申请空间——调用构造方法——将对象地址赋值给引用变量。
问题:在一个线程先将半成品对象地址赋值给引用变量时暂停了,另一线程来了引用变量不为空,指向半成品对象。
解决方法:在解决办法2的基础上加volatile
private static volatile Window window=null;
Runtime类
Jdk 中的源码 Runtime 类就是一个单例类,利用 Runtime 类可以启动新的进程或进行相关运行时环境的操作。比如,取得内存空间以及释放垃圾空间。
相关文章:

一网打尽java注解-克隆-面向对象设计原则-设计模式
文章目录 注解内置注解元注解 对象克隆为什么要克隆?如何克隆浅克隆深克隆 Java设计模式什么是设计模式?为什么要学习设计模式? 建模语言类接口类之间的关系依赖关系关联关系聚合关系组合关系继承关系实现关系 面向对象设计原则单一职责开闭原…...

k8s-statefulset部署myql-Nodeport方式
目录 1、部署openebs(Elastic Block Store) 1.下载镜像(针对k8s1.19) 2.加载镜像(所有节点包括master) 3.下载yaml文件并部署 4.设置默认storageclass 2、编写相关yaml文件 1.编写secret 2.编写state…...

MySQL双主架构、主从架构
为什么要对数据库做优化? MySQL官方说法: 单表2000万数据就达到瓶颈了。所以为了保证查询效率,要让每张表的大小得到控制。 MySQL主主架构 主数据库都负责增删改查。 比如有1000W的数据,有两个主数据库,就将数据分流给…...

基于微信小程序的物流管理系统3txar
在此基础上,结合现有物流管理体系的特点,运用新技术,构建了以 springboot为基础的物流信息化管理体系。首先,以需求为依据,对目前传统物流管理基础业务进行了较为详尽的了解和分析。根据需求分析结果进行了系统的设计&…...

Maven 一键部署到 SSH 服务器
简介 利用 Maven Mojo 功能一键部署 jar 包或 war 包到远程服务器上。 配置 在 maven 的setting.xml 配置服务器 SSH 账号密码。虽然可以在工程的 pom.xml 直接配置,但那样不太安全。 <servers><server><id>iq</id><configuration&…...

docker搭建owncloud,Harbor,构建镜像
1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 拉取镜像 docker pull owncloud docker pull mysql:5.6 2、安装搭建私有仓库 Harbor 1.下载docker-compose 2.安装harbor 3.编辑 harbor.yml文件 使用./intall.sh安装 4.登录 3、编写Dockerfile制作Web应用系…...

RISC-V(1)——RISC-V是什么,有什么用
目录 1. RISC-V是什么 2. RISC-V指令集 3. RISC-V特权架构 4. RiscV的寄存器描述 5. 指令 5.1 算数运算—add/sub/addi/mul/div/rem 5.2 逻辑运算—and/andi/or/ori/xor/xori 5.3 位移运算—sll/slli/srl/srli/sra/srai 5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw …...

基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码
基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.黄金正弦优化BP神经网络2.1 BP神经网络参数设置2.2 黄金正弦算法应用 4.测试结果:5…...

Python标准库概览
Python标准库概览 知识点 标准库: turtle库(必选)标准库: random库(必选)、time库(可选) 知识导图 1、turtle库概述 turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制。turtle库绘制图形有一个基本框架&#x…...

两个列表的最小索引总和
题目: 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺…...

Go语言基础之切片
切片 切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合 切片的定义…...

关于java三元组的问题
在改代码的时候,发现一个奇怪的地方,举例如下 Testpublic void buildTest(){TT t new TT();Long time tnull?System.currentTimeMillis():t.getTime();System.out.println("done");}Datapublic static class TT{Long time;}这个地方运行就…...

如何正确地设置Outlook SMTP发送电子邮件(wordpress配置)
如何正确地设置Outlook SMTP发送电子邮件(wordpress配置) 作者:虚坏叔叔 博客:https://pay.xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 正在寻找正确的Outlook SMTP设置?…...

机器学习编译系列---张量程序抽象
机器学习编译系列---张量程序抽象 1. 张量函数概念的引入与抽象的必要性 1. 张量函数概念的引入与抽象的必要性 在文章机器学习编译系列—概述中提到,机器学习编译的一个很重要操作是做等价变换来减少内存或者提高运行效率。变换是以“元张量函数”(private tensor …...

python使用matplotlib实现折线图的绘制
一、意义 数据可视化可以以简洁的方式呈现出数据,发现众多数据中隐藏的规律和意义。Matplotlib是一个数学绘图库。利用它可以制作简单的图表(散点图、折线图)。然后,将基于漫步概念生成一个更有趣的数据集–根据一系列随机决策生成…...

网络协议的定义、组成和重要性?
什么是网络协议? 网络协议是在计算机网络中,用于规定通信实体之间进行数据传输和通信的规则集合。网络协议涵盖了各种通信细节,包括数据包格式、错误处理、数据传输速率等,是用于分组交换数据网络的一种协议,其任务仅…...

vue 使用print.js打印小票
官网:https://printjs.crabbly.com/ // 安装 npm install print-js --save// 引入 import printJS from print-js// 使用 printJS({printable: https://hwke.tbbug.com/images/phone/1899ed9346f64020ff4f9bbae6983952.jpg,type: image,imageStyle: width:100%;ma…...

算法通关村第6关【白银】| 树的层次遍历问题
一、基本层次遍历问题 1.二叉树的层次遍历 思路:使用队列可以很好的保存遍历状态,出队将结点左右子结点入队,用size记录下一层的元素个数,这样就能区分出层了 class Solution {public List<List<Integer>> levelOr…...

Qt与电脑管家3
1.ui页面设计技巧 最外面的widget: 上下左右的margin都置相同的值 这里有4个widget,做好一个后,后面3个可以直接复制.ui文件,然后进行微调即可。 2.现阶段实现的效果: 3.程序结构: btn1--->btn btn1---…...

Jmeter 快速生成测试报告
我们使用Jmeter工具进行接口测试或性能测试后一般是通过察看结果数、聚合报告等监听器来查看响应结果。如果要跟领导汇报测试结果,无法直接通过监听器的结果来进行展示和汇报,因为太low了,因此测试完成后去整理一个数据齐全且美观的报告是非常…...

消息队列——RabbitMQ(一)
MQ的相关概念 什么事mq MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中ÿ…...

人工智能在机器学习中的八大应用领域
文章目录 1. 自然语言处理(NLP)2. 图像识别与计算机视觉3. 医疗诊断与影像分析4. 金融风险管理5. 预测与推荐系统6. 制造业和物联网7. 能源管理与环境保护8. 决策支持与智能分析结论 🎉欢迎来到AIGC人工智能专栏~探索人工智能在机器学习中的八…...

vue3+ts使用vue-i18n
vue3ts使用vue-i18n 1、安装插件 npm install --save vue-i18nyarn add vue-i18n2、配置文件 locale/index.ts import { createI18n } from vue-i18n import zhCN from ./lang/zh-CN import enUS from ./lang/en-USexport const LOCALE_OPTIONS [{ label: 中文, value: zh…...

在Ubuntu上安装和设置RabbitMQ服务器,轻松实现外部远程访问
文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…...

Redis多机实现
Background 为啥要有多机--------------1.容错 2.从服务器分担读压力。 主从结构一大难题------------如何保障一致性,对这个一致性要求不是很高,因为redis是用来做缓存的 同时我们要自动化进行故障转移-------哨兵机制,同时哨兵也可能cra…...

ClickHouse安装及部署
文章目录 Docker快速安装Ubuntu预编译安装包安装检查是否支持SSE4.2使用预编译安装包 Tgz安装包配置文件修改修改密码配置远程访问 其他主机访问文章参考 Docker快速安装 本地pull镜像 docker run -d --name ch-server --ulimit nofile262144:262144 -p 9000:9000 -p 8123:81…...

[HarekazeCTF2019]Easy Notes-代码审计
文章目录 [HarekazeCTF2019]Easy Notes-代码审计 [HarekazeCTF2019]Easy Notes-代码审计 登录之后有几个功能点,可以添加节点,然后使用Export导出 我们查看源码, 我们发现想要拿到flag的条件时$_SESSION[admin]true 如果我们能够控制sessio…...

nginx-location正则
一 Nginx的location语法 location [||*|^~] /uri/ { … } 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求~ 区分大小写匹配(可用正则表达式)~* 不区分大小写匹配(可用正则表达式)!~ 区分大小写不匹配!~* 不区分大小写不匹配^~ 如果把这个前缀…...

微信小程序胶囊位置计算,避开胶囊位置
由于小程序在不同的手机上顶部布局会发生变化,不能正确避开胶囊位置,所以通过官方给出的胶囊信息,可以计算出胶囊位置,并避开 图示例: 此处思路是,获取胶囊底部位置,并拉开10个px 计算出来的…...

快速指南:使用Termux SFTP通过远程进行文件传输——”cpolar内网穿透“
文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP(SSH File Transfer Protocol)是一种基于SSH(Secure Shell)安全协议的文件传输协议。与FTP协议相比,SFTP使用了…...