《JavaSE》---16.<抽象类接口Object类>
目录
前言
一、抽象类
1.1什么是抽象类
1.2抽象类代码实现
1.3 抽象类特点
1.4抽象类的作用
二、接口
2.1什么是接口
2.2接口的代码书写
2.3 接口使用
2.4 接口特点
2.5 实现多个接口
快捷键(ctrl + i ):
2.6接口的好处
2.7 接口间的继承
2.8 接口使用实例
实例一:
Comparable 接口(给对象排序)
2.9Clonable 接口和深拷贝
2.10 抽象类和接口的区别(常见面试题)
三、Object类
使用示范:
3.1Object类中toString()方法
3.2Object类中equals()方法
3.3Object类中hashcode()方法
前言
本篇博客主要讲解Java基础语法中的
抽象类和接口、抽象类和接口的概念、代码书写、特点、作用。实现多个接口快捷键(ctrl + i )的使用、Comparable接口(给对象排序)、Clonable接口和深拷贝、抽象类和接口的区别、Object类、Object类中的toString()方法,equals()方法,hashcode()方法
大家好,本人是普通一本的在校大学生一枚,目前在学习java。之前也学了一段时间,但是没有发布博客。本人现在已经大二结束了,开学就大三了,时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论!!!
喜欢我文章的兄弟姐妹们可以点赞,收藏和评论我的文章。喜欢我的兄弟姐妹们以及也想复习一遍java知识的兄弟姐妹们可以关注我呦,我会持续更新滴,并且追求完整。
望支持!!!!!!一起加油呀!!!!
语言只是工具,不能决定你好不好找工作,决定你好不好找工作的是你的能力!!!!!
学历本科及以上就够用了!!!!!!!!!!!!!!!!!!!!!!!!!!!!
一、抽象类
1.1什么是抽象类
如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
我们知道,所有的对象都是通过一个类来描述的。
但是并不是所有类都是用来描述对象的。
比如之前我们在面向对象系列中所提到的矩形、圆、花。他们都是图形。因此他们可以继承Shape类。而在Shape类中我们有draw方法。但是由于Shape类不是具体的图形。因此不会用到draw方法。而是矩形、圆、花它们用draw方法。因此draw方法其实在Shape类中无法具体实现。所以我们可以将Shape类设计成一个“抽象类”。而把其中的draw方法我们设计成“抽象方法”。
1.2抽象类代码实现
如果一个类被abstract修饰,那么我们称之为这是一个抽象类。
如果一个方法被abstract修饰。那么我们称之为这是一个抽象方法。抽象方法不用给出具体实现。因为实际上它是要被子类重写。从而调用子类重写的方法。通过子类实现。
// 抽象类:被abstract修饰的类
public abstract class Shape {// 抽象方法:被abstract修饰的方法,没有方法体abstract public void draw();abstract void calcArea();// 抽象类也是类,也可以增加普通方法和属性public double getArea(){return area;}protected double area; // 面积
}
如上代码。我们将Shape设计成抽象类。将draw设计成抽象方法。抽象类也可以有普通成员变量和普通成员方法。 甚至构造方法
1.3 抽象类特点
1. 抽象类不能直接实例化对象。
2. 抽象方法不能是 private 修饰的
3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
4.抽象类必须被继承。并且继承后子类需要重写父类中的抽象方法。否则子类也是抽象类。必须用abstract修饰。
5.抽象类中不一定包含抽象方法。但是有抽象方法的类一定是抽象类。
6.抽象类中可以有构造方法。让子类创建对象时可以初始化父类成员变量。
1.4抽象类的作用
我们可以使用普通类被继承。但是使用普通类继承可以在编写代码时出现很多错误。比如我们不小心在子类中调用了父类需要被子类重写的方法。而使用抽象类。父类不能被实例化。因此也就无法调用其方法。因此使用抽象类可以"预防出错"。
二、接口
2.1什么是接口
在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。
接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
2.2接口的代码书写
我们使用 interface 关键字,来定义了一个接口。它与类的定义相似。我们把class关键字换成interface。那么它就从一个类,变成一个接口了。
public interface 接口名称{// 抽象方法public abstract void method1(); // public abstract 是固定搭配,可以不写public void method2();abstract void method3();void method4();// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}
注:
1.创建接口时,接口命名一般以大写字母 I 开头。
2.接口命名一般使用形容词的单词。
3.在规范中,接口中的方法和属性不加任何修饰符。保证代码的简洁。
2.3 接口使用
接口不能被直接使用。而是需要一个“实现类”来实现接口中的所有抽象方法。
如 extends 关键字一样。我们使用 implements 关键字来实现接口
public class 类名称 implements 接口名称{// ...
}
注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
代码示例:
请实现笔记本电脑使用USB鼠标、USB键盘的例子
1. USB接口:包含打开设备、关闭设备功能
2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
3. 鼠标类:实现USB接口,并具备点击功能
4. 键盘类:实现USB接口,并具备输入功能
//USB接口
public interface USB{void openDevice();void closeDevice();
}//鼠标类,实现USB接口。
public class Mouse implements USB{@Overridepublic openDevice(){Ststem.out.println("打开鼠标!");}@Overridepublic closeDevice(){Ststem.out.println("关闭鼠标!");}public void click(){System.out.println("鼠标点击");}
}// 键盘类,实现USB接口
public class KeyBoard implements USB {@Overridepublic void openDevice() {System.out.println("打开键盘");}@Overridepublic void closeDevice() {System.out.println("关闭键盘");}public void inPut(){System.out.println("键盘输入");}
}// 笔记本类:使用USB设备
public class Computer {public void powerOn(){System.out.println("打开笔记本电脑");}public void powerOff(){System.out.println("关闭笔记本电脑");}public void useDevice(USB usb){usb.openDevice();if(usb instanceof Mouse){Mouse mouse = (Mouse)usb;mouse.click();}else if(usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard)usb;keyBoard.inPut();}usb.closeDevice();}
}// 测试类:
public class TestUSB {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();// 使用鼠标设备computer.useDevice(new Mouse());// 使用键盘设备computer.useDevice(new KeyBoard());computer.powerOff();}
}
2.4 接口特点
1. 接口类型是一种引用类型,但是不能直接new接口的对象
2.接口中的方法都是public abstract修饰的(被隐式的指定)。其他修饰符都会报错
3. 接口中的方法不能在接口中实现,只能由实现接口的类来实现。
4. 重写接口中方法时,不能使用默认的访问权限。
5. 接口中的变量会被隐式的指定为 public static final 变量。可以直接通过接口名访问
6. 接口中不能有静态代码块和构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
9. jdk8中:接口中还可以包含default方法。
2.5 实现多个接口
一个类是可以实现多个接口。
区别于
Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
快捷键(ctrl + i ):
IDEA 中使用 ctrl + i 快速实现接口。
2.6接口的好处
class Duck extends Animal implements IRunning, ISwimming, IFlying {public Duck(String name) {super(name);}@Overridepublic void fly() {System.out.println(this.name + "正在用翅膀飞");}@Overridepublic void run() {System.out.println(this.name + "正在用两条腿跑");}@Overridepublic void swim() {System.out.println(this.name + "正在漂在水上");}
}
上面的代码展示了 Java 面向对象编程中最常见的用法:
- 一个类继承一个父类, 同时实现多种接口. 继承表达的含义是 is - a 语义,
- 接口表达的含义是 具有 xxx 特性 .
猫是一种动物, 具有会跑的特性.
青蛙也是一种动物, 既能跑, 也能游泳
鸭子也是一种动物, 既能跑, 也能游, 还能飞
这样的设计。时刻牢记多态的好处, 让程序猿忘记类型. 有了接口之后, 类的使用者就不必关注具体类型, 而只关注某个类是否具备某种能力.
2.7 接口间的继承
类和类之间是单继承的,一个类可以实现多个接口,
接口与接口之间可以多继承。即:用接口可以达到 多继承的目的
使用 extends 关键字.
interface IRunning {void run();
}interface ISwimming {void swim();
}// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {}class Frog implements IAmphibious {...
}
通过接口继承创建一个新的接口 IAmphibious 表示 "两栖的".
此时实现接口创建的 Frog 类, 就继续要实现 run 方 法, 也需要实现 swim 方法.
接口间的继承相当于把多个接口合并在一起.
2.8 接口使用实例
实例一:
给对象数组排序
class Student {private String name;private int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "[" + this.name + ":" + this.score + "]";}
}
再给定一个学生对象数组, 对这个对象数组中的元素进行排序(按分数降序).
Student[] students = new Student[] {new Student("张三", 95),new Student("李四", 96),new Student("王五", 97),new Student("赵六", 92),
};
按照我们之前的理解, 数组我们有一个现成的 sort 方法, 能否直接使用这个方法呢?
是不可以的。
Arrays.sort(students);
System.out.println(Arrays.toString(students));// 运行出错, 抛出异常.
Exception in thread "main" java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
和普通的整数不一样, 两个整数是可以直接比较的, 大小关系明确. 而两个学生对象的大小关系 怎么确定? 需要我们额外指定
让我们的 Student 类实现
Comparable 接口(给对象排序)
并实现其中的 compareTo 方法
class Student implements Comparable {private String name;private int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "[" + this.name + ":" + this.score + "]";}@Overridepublic int compareTo(Object o) {Student s = (Student)o;if (this.score > s.score) {return -1;} else if (this.score < s.score) {return 1;} else {return 0;}}
}
class Main{public static void main(String[] args) {Student[] students = new Student[] {new Student("张三", 95),new Student("李四", 96),new Student("王五", 97),new Student("赵六", 92),};Arrays.sort(students);System.out.println(Arrays.toString(students));}
}
执行结果
// 执行结果
[[王五:97], [李四:96], [张三:95], [赵六:92]]
在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象. 然后比较当前对象和参数对象的大小关系(按分数来算).
- 如果当前对象应排在参数对象之前, 返回小于 0 的数字;
- 如果当前对象应排在参数对象之后, 返回大于 0 的数字;
- 如果当前对象和参数对象不分先后, 返回 0;
再次执行程序, 结果就符合预期了.
注意事项:
对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通过重写 compareTo 方法的方式, 就可以定义比较规则.
我们可以尝试自己实现一个 sort 方法来完成刚才的排序过程(使用冒泡排序)
public static void sort(Comparable[] array) {for (int bound = 0; bound < array.length; bound++) {for (int cur = array.length - 1; cur > bound; cur--) {if (array[cur - 1].compareTo(array[cur]) > 0) {// 说明顺序不符合要求, 交换两个变量的位置Comparable tmp = array[cur - 1];array[cur - 1] = array[cur];array[cur] = tmp;}}}
}
再次执行代码
sort(students);
System.out.println(Arrays.toString(students));// 执行结果
[[王五:97], [李四:96], [张三:95], [赵六:92]]
2.9Clonable 接口和深拷贝
Java 中内置了一些很有用的接口, Clonable 就是其中之一.
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要 先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.
我们点进去Clonable接口会发现
这是一个空接口,这也叫做标记接口:证明当前类是可以被克隆的!
class Animal implements Cloneable {private String name;@Overridepublic Animal clone() {Animal o = null;try {o = (Animal)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return o;}
}public class Test {public static void main(String[] args) {Animal animal = new Animal();Animal animal2 = animal.clone();System.out.println(animal == animal2);}
}
// 输出结果
// false
浅拷贝 VS 深拷贝
Cloneable 拷贝出的对象是一份 "浅拷贝" 观察以下代码:
class Money {public double m = 99.99;
}class Person implements Cloneable{public Money money = new Money();@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class TestDemo3 {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person();Person person2 = (Person) person.clone();System.out.println("通过person2修改前的结果");System.out.println(person1.money.m);System.out.println(person2.money.m);person2.money.m = 13.6;System.out.println("通过person2修改后的结果");System.out.println(person1.money.m);System.out.println(person2.money.m);}
}
// 执行结果
通过person2修改前的结果
99.99
99.99
通过person2修改后的结果
13.6
13.6
如上图,我们克隆的只是person这个对象。并没有克隆对象里面的对象。克隆之后。Money m中的引用还是指向0x65。
因此我们修改person2中的money数值为13.6后person1中的money数值也发生了改变。
这个就叫做浅拷贝。
而深拷贝就是还会克隆对象里面的对象。修改person2中的money数值为13.6后person1中的money数值不变改变。
通过clone,我们只是拷贝了Person对象。
但是Person对象中的Money对象,并 没有拷贝。
通过person2这个引用修改了m的值后,person1这个引用访问m的时候,值也发生了改变。
这里就是发生了浅拷贝。那么想一下如何实现深拷贝呢?
实现深拷贝。需要我们自己重写clone方法。如下
class Money {public double m = 99.99;
}class Person implements Cloneable{public Money money = new Money();@Overrideprotected Object clone() throws CloneNotSupportedException {Person temp =(person)super.clone();tem.m = (Money)this.m.clonereturn temp;}
}public class TestDemo3 {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person();Person person2 = (Person) person.clone();System.out.println("通过person2修改前的结果");System.out.println(person1.money.m);System.out.println(person2.money.m);person2.money.m = 13.6;System.out.println("通过person2修改后的结果");System.out.println(person1.money.m);System.out.println(person2.money.m);}
}
// 执行结果
通过person2修改前的结果
99.99
99.99
通过person2修改后的结果
99.99
13.6
此时就实现了深拷贝
2.10 抽象类和接口的区别(常见面试题)
抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别
核心区别:
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而
接口中 不能包含普通方法,和普通变量。 子类必须重写所有的抽象方法.
如之前写的 Animal 例子. 此处的 Animal 中包含一个 name 这样的属性, 这个属性在任何子类中都是存在的. 因此此 处的 Animal 只能作为一个抽象类, 而不应该成为一个接口.
class Animal {protected String name;public Animal(String name) {this.name = name;}
}
再次提醒:
抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类. 万一不小心创建了 Animal 的实例, 编译器会及时提醒我们.
三、Object类
Object是Java默认提供的一个类。
Java里面除了Object类,所有的类都是存在继承关系的。
java中所有类默认会继承Object父类。
因此所有类的对象都可以使用Object的引用进行接收。
使用示范:
class Person{}
class Student{}
public class Test {public static void main(String[] args) {function(new Person());function(new Student());}public static void function(Object obj) {System.out.println(obj);}
}
//执行结果:
Person@1b6d3586
Student@4554617c
在开发之中,
Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法。如下:
对于整个Object类中的方法需要实现全部掌握。
下面我们主要来熟悉这几个方法:toString()方法,equals()方法,hashcode()方法
3.1Object类中toString()方法
获取对象信息
如果要打印对象中的内容,可以直接重写Object类中的toString()方法,之前已经讲过了
// Object类中的toString()方法实现:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
3.2Object类中equals()方法
在Java中,==进行比较时:
a.如果==左右两侧是基本类型变量,比较的是变量中值是否相同
b.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
// Object类中的equals方法
public boolean equals(Object obj) {return (this == obj); // 使用引用中的地址直接来进行比较
}
class Person{private String name ; private int age ; public Person(String name, int age) {this.age = age ; this.name = name ;}
}
public class Test {public static void main(String[] args) {Person p1 = new Person("gaobo", 20) ; Person p2 = new Person("gaobo", 20) ; int a = 10;int b = 10;System.out.println(a == b); // 输出trueSystem.out.println(p1 == p2); // 输出falseSystem.out.println(p1.equals(p2)); // 输出false}
}
Person类重写equals方法后,然后比较:
class Person{...@Overridepublic boolean equals(Object obj) {if (obj == null) {return false ; }if(this == obj) {return true ; }// 不是Person类对象if (!(obj instanceof Person)) {return false ; }Person person = (Person) obj ; // 向下转型,比较属性值return this.name.equals(person.name) && this.age==person.age ; }
}
结论:比较对象中内容是否相同的时候,一定要重写equals方法。
3.3Object类中hashcode()方法
回忆刚刚的toString方法的源码:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
hashCode()这个方法,他帮我算了一个具体的对象位置,我们只能说它是个内存地址(但不是真的地址)。然后调用Integer.toHexString()方法,将这个地址以16进制输出。
hashcode方法源码:
public native int hashCode();
该方法是一个native方法,底层是由C/C++代码写的。我们看不到。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看
示例 代码:
class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}
}
public class TestDemo4 {public static void main(String[] args) {Person per1 = new Person("gaobo", 20) ;Person per2 = new Person("gaobo", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());}
}
//执行结果
460141958
1163157884
注意事项:
两个对象的hash值不一样。 像重写equals方法一样,我们也可以重写hashcode()方法。此时我们再来看看。
class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
public class TestDemo4 {public static void main(String[] args) {Person per1 = new Person("gaobo", 20) ;Person per2 = new Person("gaobo", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());}
}
//执行结果
460141958
460141958
注意事项:哈希值一样。
结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。
相关文章:
《JavaSE》---16.<抽象类接口Object类>
目录 前言 一、抽象类 1.1什么是抽象类 1.2抽象类代码实现 1.3 抽象类特点 1.4抽象类的作用 二、接口 2.1什么是接口 2.2接口的代码书写 2.3 接口使用 2.4 接口特点 2.5 实现多个接口 快捷键(ctrl i ): 2.6接口的好处 2.7 接…...
简单修改,让UE4/5着色器编译速度变快
简单修改,让UE4/5着色器编译速度变快 目录 简单修改,让UE4/5着色器编译速度变快 一、问题描述 二、解决方法 (一)硬件升级 (二)调整相关设置和提升优先级 1.调整相关设置 (1)…...
如何查看极狐GitLab Helm Chart?
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…...
代码随想录算法训练营第十六天| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
写代码的第十六天,自从到了二叉树错误版代码就少了,因为我自己根本没思路,都是看完思路在做,那基本上就是小语法问题,很少有其他问题了,证实了我好菜。。。。。。 还是得写思路啊啊啊啊,写思路好…...
NODEJS复习(ctfshow334-344)
NODEJS复习 web334 下载源码代码审计 发现账号密码 代码逻辑 var findUser function(name, password){ return users.find(function(item){ return name!CTFSHOW && item.username name.toUpperCase() && item.password password; }); }; 名字不等于ctf…...
【Go系列】RPC和grpc
承上启下 介绍完了Go怎么实现RESTFul api,不可避免的,今天必须得整一下rpc这个概念。rpc是什么呢,很多人都想把rpc和http一起对比,但是他们不是一个概念。RPC是一种思想,可以基于tcp,可以基于udp也可以基于…...
【VUE】v-if和v-for的优先级
v-if和v-for v-if 用来显示和隐藏元素 flag为true时,dom元素会被删除达到隐藏效果 <div class"boxIf" v-if"flag"></div>v-for用来进行遍历,可以遍历数字对象数组,会将整个元素遍历指定次数 <!-- 遍…...
【单目3D检测】smoke(1):模型方案详解
纵目发表的这篇单目3D目标检测论文不同于以往用2D预选框建立3D信息,而是采取直接回归3D信息,这种思路简单又高效,并不需要复杂的前后处理,而且是一种one stage方法,对于实际业务部署也很友好。 题目:SMOKE&…...
数据库系统概论:数据库系统的锁机制
引言 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,数据作为一种共享资源,其并发访问的一致性和有效性是数据库必须解决的问题。锁机制通过对数据库中的数据对象(如表、行等)进行加锁,以确保在同…...
Django+vue自动化测试平台(28)-- ADB获取设备信息
概述 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序,说白了就是调试工具。 adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下…...
RESTful API设计指南:构建高效、可扩展和易用的API
文章目录 引言一、RESTful API概述1.1 什么是RESTful API1.2 RESTful API的重要性 二、RESTful API的基本原则2.1 资源导向设计2.2 HTTP方法的正确使用 三、URL设计3.1 使用名词而非动词3.2 使用复数形式表示资源集合 四、请求和响应设计4.1 HTTP状态码4.2 响应格式4.2.1 响应实…...
npm下载的依赖包版本号怎么看
npm下载的依赖包版本号怎么看 版本号一般分三个部分,主版本号、次版本号、补丁版本号。 主版本号:一般依赖包发生重大更新时,主版本号才回发生变化,如Vue2.x到Vue3.x。次版本号:当依赖包中发生了一些小变化ÿ…...
css前端面试题
1.什么是css盒子模型? 盒子模型包含了元素内容(content)、内边距(padding)、边框(border)、外边距(margin)几个要素。 标准盒子模型和IE盒子模型的区别在于其对元素的w…...
Vue从零到实战
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
【Chatgpt大语言模型医学领域中如何应用】
随着人工智能技术 AI 的不断发展和应用,ChatGPT 作为一种强大的自然语言处理技术,无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成,还是语音识别、计算机视觉等方面,ChatGPT 都有着广泛的应用前景。特别在临床医学领…...
ES6 正则的扩展(十九)
1. 正则表达式字面量改进 特性:在 ES6 中,正则表达式字面量允许在字符串中使用斜杠(/)作为分隔符。 用法:简化正则表达式的书写。 const regex1 /foo/; const regex2 /foo/g; // 全局搜索2. u 修饰符(U…...
<数据集>钢铁缺陷检测数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:1800张 标注数量(xml文件个数):1800 标注数量(txt文件个数):1800 标注类别数:6 标注类别名称:[crazing, patches, inclusion, pitted_surface, rolled-in_scale, scr…...
Kafka系列之:Kafka存储数据相关重要参数理解
Kafka系列之:Kafka存储数据相关重要参数理解 一、log.segment.bytes二、log.retention.bytes三、日志段四、log.retention.check.interval.ms五、数据底层文件六、index、log、snapshot、timeindex、leader-epoch-checkpoint、partition.metadata一、log.segment.bytes 参数lo…...
Template execution failed: ReferenceError: name is not defined
问题 我们使用了html-webpack-plugin(webpack)进行编译html,导致的错误。 排查结果 连接地址 html-webpack-plugin版本低(2.30.1),html模板里面不能有符号,注释都不行 // var reg new RegExp((^|&)${name}([^&…...
CVE-2024-24549 Apache Tomcat - Denial of Service
https://lists.apache.org/thread/4c50rmomhbbsdgfjsgwlb51xdwfjdcvg Apache Tomcat输入验证错误漏洞,HTTP/2请求的输入验证不正确,会导致拒绝服务,可以借助该漏洞攻击服务器。 https://mvnrepository.com/artifact/org.apache.tomcat.embed/…...
Linux下如何安装配置Graylog日志管理工具
Graylog是一个开源的日志管理工具,可以帮助我们收集、存储和分析大量的日志数据。它提供了强大的搜索、过滤和可视化功能,可以帮助我们轻松地监控系统和应用程序的运行情况。 在Linux系统下安装和配置Graylog主要包括以下几个步骤: 准备安装…...
「MQTT over QUIC」与「MQTT over TCP」与 「TCP 」通信测试报告
一、结论 在实车5G测试中「MQTT Over QUIC」整体表现优于「TCP」,可在系统架构升级时采用MQTT Over QUIC替换原有的TCP通讯;从实现原理上基于QUIC比基于TCP在弱网、网络抖动导致频繁重连场景延迟更低。 二、测试方案 网络类型:实车5G、实车…...
获取磁盘剩余容量-----c++
获取磁盘剩余容量 #include <filesystem>struct DiskSpaceInfo {double total;double free;double available; };DiskSpaceInfo getDiskSpace(const std::string& path) {std::filesystem::space_info si std::filesystem::space(path);DiskSpaceInfo info;info.…...
AI算法24-决策树C4.5算法
目录 决策树C4.5算法概述 决策树C4.5算法简介 决策树C4.5算法发展历史 决策树C4.5算法原理 信息熵(Information Entropy) 信息增益(Information Gain) 信息增益比(Gain Ratio) 决策树C4.5算法改进 …...
【云原生】Prometheus整合Alertmanager告警规则使用详解
目录 一、前言 二、Altermanager概述 2.1 什么是Altermanager 2.2 Altermanager使用场景 三、Altermanager架构与原理 3.1 Altermanager使用步骤 3.2 Altermanager工作机制 3.3 Altermanager在Prometheus中的位置 四、Altermanager部署与接入Prometheus 4.1 Altermana…...
C++ :友元类
友元类的概念和使用 (1)将类A声明为B中的friend class后,则A中所有成员函数都成为类B的友元函数了 (2)代码实战:友元类的定义和使用友元类是单向的 (3)友元类是单向的,代码实战验证 互为友元类 (1)2个类可以互为友元类,代码实战…...
【整理了一些关于使用swoole使用的解决方案】
目录 如何监控和分析 Swoole 服务器的性能瓶颈? 在进行 Swoole 服务器性能优化时,有哪些常见的错误和陷阱需要避免? 除了 Swoole,还有哪些 PHP 框架或技术可以用于构建高并发的 Web 应用? Swoole 同步请求在高并发…...
python selenium4 EdgeDriver动态页面爬取
截止至2024.7.16 chrome浏览器最新版本为126.0.6478.127 但对应的chromeDriver版本都低于此版本,因此,转用Edge浏览器 说明:仅记录自己使用过程中用到的一些代码和感受,看具体情况不定期更新。 selenium官方文档 1、安装selen…...
【一次记一句:SQL】从 information_schema.TABLES中查询数据库表中记录数据量
有时候,一张千万数据量的表,使用 count(*) 统计记录数,查不动。可以使用下述SQL来试试: SELECT CONCAT(table_schema, ., table_name) AS "Table Name", table_rows AS "Number of Rows", CONCAT(ROUND(data…...
NXP i.MX8系列平台开发讲解 - 3.19 Linux TTY子系统(二)
专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 目录 1. Linux 串口驱动 1.1 Uart 驱动注册流程 1.2 uart 操作函数 1.3 line discipline 2. Linux tty应用层使用…...
房产如何做网站/企业宣传推广方案
天朗气清的日子里,总想寻着一处花香缭绕之地,三两亲友,谈笑风生;阴雨绵绵的时候,亦想觅一方静谧清新之所,来一壶茶捧一本书,听雨打叶梢……没有大户型,没有庭院,即使是一…...
新校区建设网站/推广资源seo
干货 编辑:杜伟、蛋酱,来源:机器之心2021 年之后,机器学习将会对哪些领域产生前所未有的影响?在过去的数年,见证了机器学习(ML)和计算机科学领域的许多变化。按照这种长弧形的进步模…...
wordpress laravel 共存/中山网站建设
栈空间 栈空间是从高地址向低地址扩充,堆地址是从低地址向高地址扩充。 堆栈是一种具有一定规则的数据结构,我们可以按照一定的规则进行添加和删除数据。它使用的是后进先出的原则。在x86等汇编集合中堆栈与弹栈的操作指令分别为: PUSH&…...
用什么做网站开发/win7优化软件
今天主要是寻找板卡问题然后维修,这次生产了600PCS板卡,第一次小批量生产。记得第一次打样是4PCS,很多问题都无法暴露出来,这次600PCS就暴露不少问题了。首先功耗问题就有两个,然后其他的小问题有几个,所以…...
有哪些做司考真题的网站/今日国内新闻10则
基本介绍 开发者可以使用云开发快速开发小程序、小游戏、公众号网页等,并且原生打通微信开放能力。 发布小程序需要使用云开发。 开发者无需搭建服务器,可免鉴权直接使用平台提供的 API 进行业务开发。 配有云端数据库,与传统数据库相比操…...
芜湖市建设工程质量监督站官方网站/公关公司排名
Redis分布式锁锁的特点为了保证数据的最终一致性,使用Redis分布式锁 当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。 锁的特点 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件&…...