Java基础42 枚举与注解

news2024/11/25 21:30:28

枚举与注解

  • 一、枚举(enumeration)
    • 1.1 自定义类实现枚举
    • 1.2 enum关键字实现枚举
      • 1.2.1 enum的注意事项
      • 1.2.2 enum的使用练习
      • 1.2.3 enum的常用方法
      • 1.2.4 enum的使用细节及注意事项
      • 1.2.5 enum练习
  • 二、注解(Annotation)
    • 2.1 @Override(☆)
    • 2.2 @Deprecated(☆)
    • 2.3 @SuppressWarnings
    • 2.4 元 Annotation
      • 2.4.1 @Retention
      • 2.4.2 @Target
      • 2.4.3 @Documented
      • 2.4.4@Inherited
    • 注解小结


一、枚举(enumeration)

枚举(enum):一组常量的集合,属于一种特殊的类,里面只包含一组有限的特定的对象。

● 枚举的两种实现方式:

  1. 自定义类实现枚举
  2. 使用enum关键字实现枚举

1.1 自定义类实现枚举

  1. 不需要提供setXxx方法,因为枚举对象值通常为只读。
  2. 对枚举对象 / 属性使用 final + static 共同修饰,实现底层优化。
  3. 枚举对象通常使用全部大写,常量的命名规范。
  4. 枚举对象根据需要,也可以有多个属性

● 自定义枚举应用案例:

要求创建季节(Seanson)对象,给出属性、构造器等结构,再添加枚举去实现调用并输出结果。

public class Enumeration01{
	public static void main(String[] args){
		System.out.println(Season.AUTUMN);
		System.out.println(Season.SPRING);
	}
}

class Season{ //类
	private String name;
	private String desc; //描述

	public static final Seanson SPRING = new Season("春天","温暖");
	public static final Seanson WINTER = new Season("冬天","寒冷");
	public static final Seanson AUTUMN = new Seanson("秋天","凉爽");
	public static final Seanson SUMMER = new Seanson("夏天","炎热");

	//1.将构造器私有化,目的是防止直接创建对象
	//2.去掉setXxx方法,防止属性被修改
	//3.在Season内部,直接创建固定的对象
	//4.优化:加入final修饰符
	private Season(String name,String desc){
		this.name = name;
		this.desc = desc;
	}
	public String getName(){
		return name;
	}
	public String getDesc(){
		return desc;
	}
	
	public String toString(){
		return "Seanson{"+
			   "name=" + name + '\'' +
			   ",desc=" + desc + '\'' + 
			   '}';
	}
}

运行效果

在这里插入图片描述

● 自定义类实现枚举小结

  1. 构造器私有化
  2. 本类内部创建一组对象【比如上面代码的春夏秋冬】
  3. 对外暴露对象(通过对象添加public final static 修饰符)
  4. 可以提供get方法,但是不要提供set方法

1.2 enum关键字实现枚举

使用enum来实现前面的枚举案例

如果使用了enum来实现枚举类

  1. 使用关键字 enum 替代 class
  2. public static final Season SPRING = new Season(“春天”,“温暖”)可以替换为:
    SPRING(“春天”,“温暖”) ==> 常量名(参数列表)
  3. 如果有多个常量(对象),使用 " , " 号间隔即可
  4. 如果使用 enum 来实现枚举,要求将定义常量对象,写在最前面。
public class Enumeration01{
	public static void main(String[] args){
		System.out.println(Season.AUTUMN);
		System.out.println(Season.SPRING);
	}
}

enum Season{ //类
	//public static final Season SPRING = new Season("春天","温暖")可以替换为:
	//SPRING("春天","温暖") ==> 常量名(参数列表)
	SPRING("春天","温暖"),WINTER("冬天","寒冷"),AUTUMN("秋天","凉爽"),SUMMER("夏天","炎热");
	private String name;
	private String desc; //描述

	private Season(String name,String desc){
		this.name = name;
		this.desc = desc;
	}
	public String getName(){
		return name;
	}
	public String getDesc(){
		return desc;
	}
	
	public String toString(){
		return "Seanson{"+
			   "name=" + name + '\'' +
			   ",desc=" + desc + '\'' + 
			   '}';
	}
}

运行效果
在这里插入图片描述


1.2.1 enum的注意事项

  1. 当我们使用 enum 关键字开发一个枚举时,默认会继承Enum类,而且是一个final类。
  2. 传统的 public static final Season SPRING = new Season(“春天”,“温暖”);简化成SPRING(“春天”,“温暖”),这里必须知道,它调用的是哪个构造器。(这里指的是:有两个字符串的构造器)
  3. 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略。【如果我们使用的是无参构造器,创建常量对象,则可以省略( )】
SUMMER("夏天","炎热"),Season;
  1. 当有多个枚举对象时,使用,间隔,最后一个分号结尾。
enum Season{
	spring,summer;
}
  1. 枚举对象必须放在枚举类的行首。
enum Season{
	spring,summer;
	构造器...
}

1.2.2 enum的使用练习

  1. 下面代码是否正确,并说明表示的含义。
enum Gender{
	BOY,GIRL;
}

答案:

上面的语法是正确的;有一个枚举类:Gender,没有属性;有两个枚举对象 BOY,GIRL,使用的是无参构造器创建。

如果修改一下上面的代码,添加一个有参构造器的话,结果又会怎么样?

enum Gender{
	BOY,GIRL;
	private Gender(String name){}
}

答案:

因为添加了构造器,程序检测时就会把原本默认的构造器给覆盖(把原本默认的无参构造器给覆盖了),变为有参构造器,所以添加了构造器的Gender类需要加上无参构造器。

enum Gender{
	BOY,GIRL;
	private Gender(String name){}
	private Gender(){}
}

1.2.3 enum的常用方法

在使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum类相关的方法。

常用的enum方法有:

方法名详细描述
valueOf传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量
toString得到当前枚举常量的名称。一般可以通过重写这个方使得到的结果更易读。
equals在枚举类型中可以直接使用 " == " 来比较两个枚举常量是否相等。
hashCodeEnum实现了hashCode()来和equals()保持一致。它也是不可变的。
getDeclaringClass得到枚举常量所属枚举类型的Class对象。可以用它来判断两个枚举常量是否属于同一个枚举类型。
name得到当前枚举常量的名称。建议先试用toString()。
ordinal得到当前枚举常量的次序
compareTo枚举类型实现了Comparable接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列)
clone枚举类型不能被Clone,为了防止子类实现克隆方法,Enum实现了一个仅抛出CloneNotSupporttedException异常的不变Clone()。

1. name:得到当前枚举常量的名称。建议先试用toString()。

//使用Season2 枚举类,来演示各种方法
Season2 autumn = Season2.AUTUMN;
//输出枚举对象的名字
System.out.println(autumn.name());

运行效果

在这里插入图片描述


2. ordinal:输出的是该枚举对象的次序/编号,从0开始编号

//ordinal() 输出的是该枚举对象的次序/编号,从0开始编号
//AUTUMN 枚举对象是第三个 , 因此输出2
System.out.println(autumn.ordinal());

运行效果

在这里插入图片描述


这里补充一个增强for

	//这里补充一个增强for
	int[] nums = {1,2,9};
	//普通的for循环
	System.out.println("=====普通的for=====");
	for(int i = 0; i < nums.length; i++){
	}
	System.out.println("=====增强的for=====");
//执行流程是:依次从nums数组中取出数据,赋给i,如果取出完毕,则退出for
	for(int i : nums){
		System.out.println("i=" + i);
	}
}

运行效果

在这里插入图片描述


3. values :从反编译可以看出values方法,返回Season2[]含有定义的所有枚举对象

注意:Java编译器会自动在enum类型中插入values方法,Enum类里面没有

//从反编译可以看出values方法,返回Season2[]含有定义的所有枚举对象
Season2[] values = Season2.values();
System.out.println("===遍历输出枚举对象(增强for)====");
for(Season2 season: values){//增强for循环
	System.out.println(season);
}

运行效果
在这里插入图片描述


4. values:返回当前枚举类中所有的常量

	//从反编译可以看出,values方法,返回Season2[]
	//含有定义的所有枚举对象
	Season2[] values = Season2.values();
	System.out.println("===遍历取出枚举对象(增强for)====");
	for(Season2 season : values){
		System.out.println(season);
	}

运行效果

在这里插入图片描述


5. valuesOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常!

valuesOf的执行流程:

  1. 根据你输入的值,到枚举对象去查找。
  2. 如果找到了,就返回,如果没有找到,则报错。
Season2 autumn1 = Season2.valuesOf("AUTUMN");
system.out.println("autumn1=" + autumn1);
system.out.println(autumn == autumn1);

运行结果

在这里插入图片描述


6. compareTo:比较两个枚举常量,比较的就是位置号(编号)!

compareTo运行流程:

就是把一个枚举对象与另一个枚举对象的编号进行比较

//这里的compareTo就是把Season2.AUTUMN枚举对象的编号和Season2.SUMMER枚举对象的编号进行比较
//而此时的Season2.AUTUMN的编号为:[2] - Seaso.SUMMER的编号:[3],所以得到结果为:-1
System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));

运行效果

在这里插入图片描述


1.2.4 enum的使用细节及注意事项

  1. 使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承机制。
  2. 枚举类和普通类一样,可以实现接口,形式如下:
enum 类名 implements 接口1,接口2{}

enum实现的枚举类,仍然是一个类,所以还是可以实现接口的。

interface IPlaying{
	public void playing();
}
enum Music implements IPlaying{
	CLASSICMUISC;
	public void playing(){
		System.out.println("播放音乐...");
	}
}

1.2.5 enum练习

题目如下:

  1. 声明Week枚举类,其中包含星期一至星期日的定义;
    MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY、SUNDAY;
  2. 使用values返回所有的枚举数组,并遍历,输出下图的效果。

在这里插入图片描述

代码实现:

public static void main(String[] args){
	//获取到所有的枚举对象,即数组
	Week[] weeks = Week.values();
	//遍历,使用增强for
	System.out.println("===所有星期的信息如下===");
	for(Week week : weeks){
		System.out.println(vweek + '/n');
	}	
}

Week class{
		//定义Week的枚举对象
		MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日");

	private String name;
	
	//构造器
	private Week(String name){
		this.name = name;
	}

	//重写toString
	public String toString(){
		return name;
	}
}

运行效果

在这里插入图片描述


二、注解(Annotation)

● 注解的理解

  1. 注解(Annotation)也被称为元数据(Metadata),用于修饰解释:包类、方法、属性、构造器、局部变量等数据信息。
  2. 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
  3. 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

● Annotation的使用

使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素

● 三个基本的Annotation:

  1. @Override:限定某个方法,是重写父类方法,该注解只能用于方法。
  2. @Deprecated:用于表示某个程序元素(类、方法等)已过时
  3. @SuppressWarnings:抑制编译器警告

2.1 @Override(☆)

@Override:限定某个方法,是重写父类方法,该注解只能用于方法

  1. Overrdie注解,表示指定重写父类的方法(从编译层面验证),如果父类没有此方法,则会报错。
  2. 但是如果没有写Override,它依旧还是会重写父类。
  3. 如果你写了@Override注解,编译器就会去检查该方法是否真的重写了。如果的确重写了,则编译通过,如果没有构成重写,则编译错误。
  4. @Override 只能修饰方法,不能修饰其他类,包,属性等等。
  5. @Target是修饰注解的注解,称为元注解

Override使用演示

class Father{ //父类
	public void fly(){
		System.out.println("Father fly...");
	}
}

class Son extends Father{ //子类
	//1.Overrdie注解,放在fly方法上,表示子类的fly方法时重写了父类的fly
	//2.这里如果没有写@Override,还是重写了父类fly
	//3.如果你写了@Override注解,编译器就会去检查该方法是否真的重写了
	//父类的方法,如果的确重写了,则编译通过,如果没有构成重写,则编译错误
	//4.@Override的定义
	//如果发小@interface,则表示一个注解类
	/*
		@Target(ElementType.METHOD)
		@Retention(RetentionPolicy.SOURCE)
		public @interface Override{
		}
	*/
	@Override //说明
	public void fly(){
		System.out.println("Son fly....");
	}
}

2.2 @Deprecated(☆)

@Deprecated:用于表示某个程序元素(类、方法等)已过时

@Deprecated的说明:

  1. 用于表示某个程序元素(类,方法等)已过时
  2. 可以修饰方法、类、字段、包、参数等等
  3. 查看@Deprecated的注解:@Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER、TYPE})
  4. @Deprecated的作用可以做到新旧版本的兼容和过渡
public class Deprecated01{
	public static void main(String[] args){
		A a = new A();
		a.hi();
		System.out.println();
	}
}

@Deprecated
class A {
	public int n1 = 10;
	public void hi(){
		
	}
}

如果在n1和hi的上面添加上Deprecated,则在你使用n1和hi的时候,会有中划线。

修改后:

@Deprecated
class A {
	@Deprecated
	public int n1 = 10;
	@Deprecated
	public void hi(){
		
	}
}

主方法调用时的中划线:

在这里插入图片描述


2.3 @SuppressWarnings

@SuppressWarnings:抑制编译器警告

当我们不希望看到系统给的黄色警告时,我们可以使用@SuppressWarnings注解来抑制警告信息

● SuppressWarnings作用范围

关于SuppressWarnings作用范围是和你放置的位置相关,比如:

@SuppressWarnings放置在main方法,那么抑制警告的范围就是main

通常我们可以放置具体的语句,比如:方法、类。

@SuppressWarnings使用演示

在使用Idea工具时,往往会出现很多黄色的警告,比如下面的代码,在写完时Idea右上角就会出现黄色的三角警告:

public class SuppressWarnings01{
	public static void main(String[] args){
		List list = new ArrayList();
		list.add("");
		list.add("");
		list.add("");
		int i;
		System.out.println(list.get(1));
	}
}

三角警告

在这里插入图片描述

如果我们不希望看到这些警告的时候,就可以使用@SuppressWarnings注解来抑制这些警告:

//在{""}中,可以写入你希望抑制的(不显示)警告信息
public class SuppressWarnings01{
	@SuppressWarnings({"rawtypes"})
	public static void main(String[] args){
		List list = new ArrayList();
		list.add("");
		list.add("");
		list.add("");
		int i;
		System.out.println(list.get(1));
	}
}

这时候就可以看见右上角的警告变少了

在这里插入图片描述

再加上其他的类型,就可以屏蔽掉所有的警告了。


	@SuppressWarnings({"rawtypes","unchecked","unused"})

● SuppressWarnings能指定的警告类型有:

all抑制所有警告
boxing抑制与封装/拆装作业相关的警告
cast抑制与强制转换型作业相关的警告
dep-ann抑制与淘汰注释相关的警告
deprecation抑制与淘汰的相关警告
fallthrough抑制与switch陈述式中遗漏break相关的警告
finally抑制与未传回finally区块相关的警告
hiding抑制与隐藏变数的取余变数相关的警告
incomplete-switch抑制与switch陈述式(enum case)中遗漏项目相关的警告
javadoc抑制与javadoc相关的警告
nls抑制与非nls子串文字相关的警告
null抑制与空值分析相关的警告
rawtypes抑制与eaw类型相关的警告
resource抑制与使用Closeable类型相关的资源相关的警告
restnicthon抑制与使用不建议或进制参照相关的警告
serial抑制与可序列化的类别遗漏serialVresionUID栏位相关的警告
static-access抑制与静态存取不正确相关的警告
static-method抑制与可能警告为static的方法相关的警告
super抑制与置换方法相关但不含super呼叫的警告
synthetic-access抑制与内部类别的存取未最佳化相关的警告
sync-override抑制因为置换同步方法面遗漏同步化的警告
unchecked抑制与未检查的作业相关的警告
unqualified-field-access抑制与栏位存取不合格相关的警告
unused抑制与未用的程式码及停用的程式码相关的警告

● @SuppressWarnings注解的各种值

  1. unchecked : 忽略没有检查的警告
  2. rawtypes : 忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
  3. unused : 忽略没有使用某个变量的警告错误
  4. @SuppressWarnings : 可以修饰的程序元素为:

查看@Target

@Target({TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
	@Retention(RetentionPolicy.SOURCE)
	public @interface SuppressWarnings{
		String[] value();
}

(1) 可修饰的值就为大括号内的值:TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE

(2)该注解类有数组 String[] values() 设置一个数组,比如{“rawtypes”,“unchecked”,“unused”}

  1. 生成@SuppressWarnings时,不用背,直接点击左侧的黄色提示,就可以选择(注意可以指定生成的位置)

2.4 元 Annotation

● 元注解的基本介绍

JDK 的元 Annotaion 用于修饰其他 Annotation

元注解:本身作用不大,主要是看源码时知道是个什么东西。

● 元注解的种类(使用不多,了解,不用深入)

1)Retention //指定注解的作用范围,三种SOURCE,CLASS,RUNTIME
2)Target //指定注解可以在哪些地方使用
3)Documented //指定该注解是否会在javadoc体现
4)Inherited //子类会继承父类注解


2.4.1 @Retention

@Retention:用于指定该Annotation可以保留多长时间,只能用于修饰一个Annotation定义。

@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention时必须为该value成员变量指定值

● @Retention的三种值

  1. RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注释
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{
}
  1. RetentionPolicy.CLASS:编译器将把注解记录在class文件中,当运行Java程序时,JVM不会保留注解。【这是默认值】
  2. RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中,当运行Java程序时,JVM会保留注解,程序可以通过反射获取该注解。

2.4.2 @Target

Target:用于修饰Annotation定义。

用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰程序的元素为:

@Target({TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,PACKAGE,PARAMETER})

@Target也包含一个名为value的成员变量。


2.4.3 @Documented

@Documented:用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解。

注意:

定义为Documented的注解必须设置Retention值为RUNTIME。


2.4.4@Inherited

Inherited:被它修饰的Annotation将具有继承性,如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解

注意:

实际应用中,使用较少,了解即可。


注解小结

  1. @Override:限定某个方法,是重写父类方法,该注解只能用于方法
  2. @Deprecated:用于表示某个程序元素(类、方法等)已过时
  3. @SuppressWarnings:抑制编译器警告

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023 软件测试行业内卷动荡,红利期过去后,何去何从?

前段时间席卷全互联网行业的内卷现象&#xff0c;想必有不少人都深陷其中。其实刚开始测试行业人才往往供不应求&#xff0c;而在发展了十几年后&#xff0c;很多人涌入这个行业开始面对存量竞争。红利期过去了&#xff0c;只剩内部争夺。 即便如此&#xff0c;测试行业仍有许…

shell条件测试

文章目录三、shell条件测试3.1条件测试的基本语法3.2 文件测试表达式3.3字符串测试表达式3.4 整数测试表达式3.5 逻辑操作符三、shell条件测试 为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。通过这些运算符&#xff0c;Sh…

java rpc框架 中的自定义异常类型的全局处理

– 这里的dubbo 可泛指 所有rpc框架 –比如自定义异常类型是MyEx, 以及myEx可以转化为MyResult – 需求: 凡是请求链路中抛出的MyEx需要自动及时或最终转化为 自定义的MyResult返回 – 1. spring 提供 controller端的全局异常捕获. 这一步简单 – 2. dubbo 需要 将MyEx 传输回来…

【子网划分】求子网网络前缀、子网地址、每个子网可以分配给主机使用的最小地址和最大地址

1、某单位分配到一个地址块152.7.77.0/24&#xff0c;现在需要进一步划分为4个一样大的子网。&#xff08;10分&#xff09; 问题&#xff1a; (1) 每个子网的网络前缀有多长&#xff1f; (2) 每一个子网中有多少个地址&#xff1f; (3) 每一个子网的网络地址是什么&#xff1f…

Python实现贝叶斯优化器(Bayes_opt)优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是基…

Linux基本功系列之sort命令实战

文章目录前言一. sort命令介绍二. 语法格式及常用选项三. 参考案例3.1 按照文本默认排序3.2 忽略相同的行3.3 按数字大小进行排序3.4 检查文件是否已经按照顺序排序3.5 将第3列按照数字大小进行排序3.6 将排序结果输出到文件四. 探讨 -k的高级用法总结前言 大家好&#xff0c;…

python设计模式-享元设计模式,抽象工厂设计模式,面向对象设计模式

享元设计模式 享元(flyweight)设计模式属于结构设计模式类别。 它提供了一种减少对象数的方法。 它包含各种有助于改进应用程序结构的功能。享元对象最重要的特性是不可变的。 这意味着一旦构建就不能修改它们。 该模式使用HashMap来存储引用对象 如何实现享元(flyweight)设计…

【个人作品】非侵入式智能开关

一、产品简介 一款可以通过网络实现语音、APP、小程序控制&#xff0c;实现模拟手动操作各种开关的非侵入式智能开关作品。 非侵入式&#xff0c;指的是不需要对现有的电路和开关做任何改动&#xff0c;只需要将此设备使用魔术无痕胶带固定在旁边即可。 以下为 ABS 材质的渲…

你知道 BI 是什么吗?关于 BI 系统的概述

BI 作为信息化建设中的关键一环&#xff0c;在企业中通常起到承上启下的作用&#xff0c;下能连接打通企业业务系统数据库&#xff0c;将各部门数据分类分级统一储存到数据仓库&#xff0c;简化存储取数流程&#xff0c;减少人力、时间成本&#xff1b;上能提供数据可视化报表…

Elasticsearch安装IK分词器、配置自定义分词词库

一、分词简介 在Elasticsearch中&#xff0c;假设搜索条件是“华为手机平板电脑”&#xff0c;要求是只要满足了其中任意一个词语组合的数据都要查询出来。借助 Elasticseach 的文本分析功能可以轻松将搜索条件进行分词处理&#xff0c;再结合倒排索引实现快速检索。Elasticse…

你是什么时候从轻视到高看软件测试的?

刚开始学软件测试很轻视&#xff0c;因为我那时很无知&#xff0c;这也是那时绝大多数人员的心态&#xff0c;那时中国最讲究“编程才是硬道理”。 如今却非常热爱软件测试&#xff0c;包括软件测试工具&#xff0c;方法&#xff0c;理论&#xff0c;技术。因为我在3年的测试工…

NLP学习——信息抽取

信息抽取 自动从半结构或无结构的文本中抽取出结构化信息的任务。常见的信息抽取任务有三类&#xff1a;实体抽取、关系抽取、事件抽取。 1、实体抽取 从一段文本中抽取出文本内容并识别为预定义的类别。 实体抽取任务中的复杂问题&#xff1a; 重复嵌套&#xff0c;原文中…

虚拟机磁盘重新分区增加Docker磁盘空间

目录一、简介二、重新分区 挂载目录2.1 增加虚拟机硬盘空间2.2 重新分区2.3 格式化新分区2.4 挂载docker目录三、重新拉取一、简介 今天在使用docker pull 拉取镜像时&#xff0c;报了no such file or directory的信息&#xff0c;原来是Docker的磁盘空间满了 #查看Docker Roo…

跳跃游戏 II 解析

题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - 1] 的…

推荐一个前后端分离.NetCore+Angular快速开发框架

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一个开源项目&#xff0c;基于.NetCore开发的、前后端分离、前端有Vue、Angular、MVC多个版本的快速开发框架。 项目简介 这是一个基于.NetCore开发的快速开发框架&#xff0c;项目采用模块化架…

go语言实现的一个基于go-zero框架的微服务影院票务系统cinema-ticket

一个基于go-zero框架的微服务影院票务系统cinema-ticket 前言 项目基本介绍 项目开源地址&#xff1a;butane123/cinema-ticket: 一个基于go-zero框架的微服务影院票务系统cinema-ticket (github.com) 这是一个微服务影院票务系统&#xff0c;基于go-zero框架实现&#xff0c…

Monkey

文章目录一、简介二、原理2.1 特殊处理三、命令3.1 启动3.2 关闭四、事件4.1 触摸事件4.2 手势事件4.3 二指缩放事件4.4 轨迹事件4.5 屏幕旋转事件4.6 基本导航事件4.7 主要导航事件4.8 系统按键事件4.9 启动activity事件4.10 键盘事件4.11 其他类型事件五、参数5.1 常规类参数…

ThreadLocal原理、内存泄漏的验证

文章目录前言正文1、ThreadLocal 的常见使用场景2、从ThreadLocal的源码开始2.1 ThreadLocalMap2.2 ThreadLocalMap的 set 方法2.3 ThreadLocalMap的 remove 方法2.4 ThreadLocal 的 set 方法2.5 ThreadLocal 的 remove 方法3、内存泄漏3.1 内存泄漏的概念3.2 为什么说entry的k…

《唐诗三百首》数据源网络下载

2023年的 元宵之夜&#xff0c;这场以“长安”为主题的音乐会火了&#xff01;在抖音&#xff0c;超过2300万人次观看了直播&#xff0c;在线同赏唐诗与交响乐的融合。许多网友惊呼&#xff0c;上学时那些害怕背诵的诗句&#xff0c;原来还可以有这么美的表达这场近80分钟的音乐…

【dapr】服务调用(Service Invokation) - app id的解析

逻辑图解 上图来自Dapr官网教程&#xff0c;其中Checkout是一个服务&#xff0c;负责生成订单号&#xff0c; Order Processor是另一个服务&#xff0c;负责处理订单。Checkout服务需要调用Order Processor的API&#xff0c; 让Order Processor获取到其生成的订单号并进行处理。…