当前位置: 首页 > news >正文

Java基础42 枚举与注解


枚举与注解

  • 一、枚举(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

	//这里补充一个增强forint[] nums = {1,2,9};//普通的for循环System.out.println("=====普通的for=====");for(int i = 0; i < nums.length; i++){}System.out.println("=====增强的for=====");
//执行流程是:依次从nums数组中取出数据,赋给i,如果取出完毕,则退出forfor(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();//遍历,使用增强forSystem.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;}//重写toStringpublic 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 {@Deprecatedpublic int n1 = 10;@Deprecatedpublic 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:抑制编译器警告

相关文章:

Java基础42 枚举与注解

枚举与注解一、枚举&#xff08;enumeration&#xff09;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练习二、注解&#xff08;Annotation&#xff09;2.1 Override&am…...

shell的变量和引用

文章目录二、变量和引用2.1 什么是变量2.2变量的命名2.3 变量的类型2.3.1 根据数据类型分类2.3.2 根据作用域分类2.4 变量的定义2.5 shell中的引用2.6 变量的运算练习&#xff1a;二、变量和引用 在程序设计语言中&#xff0c;变量是一个非常重要的概念。也是初学者在进行Shel…...

基于PHP的招聘网站

摘要在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括在线招聘的网络应用&#xff0c;在外国在线招聘已经是很普遍的方式&#xff0c;不过国内的在线招聘可能还处于起步阶段。招聘网站具有招聘信息功能的双向选择&#xff0c;…...

轻松使用 Python 检测和识别车牌(附代码)

车牌检测与识别技术用途广泛&#xff0c;可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理&#xff0c;检测和识别车牌&#xff0c;最后显示车牌字符&#xff0c;作为…...

DVWA—CSRF-Medium跨站请求伪造中级

注意&#xff1a; 1、这里对XSS(Stored)关卡不熟悉的可以从这里去看http://t.csdn.cn/ggQDK 2、把难度设置成 Medium 一、这一关同样我们需要埋下伏笔&#xff0c;诱使用户点击来提交&#xff0c;首先从XSS&#xff08;Stored&#xff09;入手。 注意&#xff1a;在前面介绍…...

【电商】后台订单生成

结合商品流转的电商系列介绍了一些了&#xff0c;商品已经采购入库、价格税率设置好了、活动及相关模板也已经准备完毕&#xff0c;下面就应该上架销售了&#xff0c;现在接着聊下订单的生成。 订单从产生到最终的关闭需要经历很多的环节&#xff0c;订单也是电商系统的核心数据…...

作为公司,这个5款在线软件工具赶紧安利起来!

2023年了 &#xff0c;您的企业还没使用在线软件工具吗&#xff1f;自从用了在线工具之后&#xff0c;感觉打开了新办公世界的大门&#xff0c;效率蹭蹭蹭地往上涨啊。对于喜欢追求效率和便捷的我来说&#xff0c;在线实在是太棒了&#xff01;今天安利几个非常不错的在线软件工…...

面试(七)为什么一般希望将析构函数定义为虚函数

class B { public:~B() // 基类析构函数不为虚函数{cout << "B::~B()" << endl;} };class D : public B { public:~D(){cout << "D::~D()" << endl;} };void Test(B* t) {delete t;t nullptr; }int main() {B *pb new B;Test…...

MySQL必会四大函数-时间函数

一、时间日期获取函数 获取当前日期&#xff08;date&#xff09;函数&#xff1a;curdate() mysql> select curdate(); 2023-02-09 获取当前时间&#xff08;time&#xff09;函数&#xff1a;curtime() select curtime(); 08:49:27 获取当前时间戳&#xff08;date &…...

震惊!邻桌的程序猿做可视化报告竟然比我还快,带着好奇心我打开了他的电脑,发现惊天秘密,原因竟是...

其实&#xff0c;本文就是想分享一个做可视化的捷径&#xff01; 制作可视化的方式有千千万。 Excel 控若能轻车熟路驾驭 VBA&#xff0c;能玩出各种花来&#xff0c;再不济借助图表插件外援也能秒杀一众小白选 手。 会编程的&#xff0c;Echarts 几十行代码&#xff0c;分分…...

mathtype7与word冲突,无法安装,不显示工具栏的问题解决

首先无法安装&#xff0c;或安装出错时&#xff0c;要清理注册表防止以后再次出现该问题&#xff0c;以此记录留作备份。打开注册表的方法是键盘winr键同时按&#xff08;win就是Alt旁边像窗户图标的键&#xff09;&#xff0c;正常的话会跳出一个叫“运行”的家伙&#xff0c;…...

IBM AIX 升级Openssh 实现篇(编译安装)

升级成功佐证 !!!本文所有内容仅作参考,请在测试环境中具体测试完毕后才能应用于生产环境!!! [1]备份和恢复方案 开启telnet 服务,防止ssh 掉线后无法重连维护。在修复漏洞后关闭telnet。 备份该服务相关的所有文件,以便恢复。 root@TEST:/etc# vi inetd.conf #ftp…...

linux的睡眠框架及实现

睡眠 4 种模式&#xff1a;S2I (Suspend-to-Idle)&#xff1a; 挂起系统&#xff0c;IO进入低功耗模式。需配置CONFIG_SUSPEND。Standby&#xff1a;执行S2I后&#xff0c;把AP (nonboot CPU) 离线。除了CONFIG_SUSPEND的支持外&#xff0c;还需要向suspend子系统注册&#xff…...

Java面试知识点

工作也有好些年了&#xff0c;从刚毕业到前几年看过无数的面试题&#xff0c;总想着自己写一个面试总结&#xff0c;随着自我认识的变化&#xff0c;一些知识点的理解也越来越不一样了。写下来温故而知新。很多问题可能别人也总结过&#xff0c;但是答案不尽相同&#xff0c;如…...

PTA Advanced 1159 Structure of a Binary Tree C++

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, a binary tree can be un…...

CDN绕过技术总汇

注 本文首发于合天网安实验室 首发链接&#xff1a;https://mp.weixin.qq.com/s/9oeUpFUZ_0FUu6YAhQGuAg 近日HVV培训以及面试&#xff0c;有人问了CDN该如何绕过找到目标真实IP&#xff0c;这向来是个老生常谈的问题&#xff0c;而且网上大多都有&#xff0c;但是有些不够全面…...

算法训练营DAY51|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

本期是求子序列的新的一期&#xff0c;题目前两道有一些相似之处&#xff0c;思路差不多&#xff0c;第三道有一点难度&#xff0c;但并不意味着第一道没有难度&#xff0c;没有做过该类型题的选手&#xff0c;并不容易解出题解。 300. 最长递增子序列 - 力扣&#xff08;Leet…...

mac:彻底解决-安装应用后提示:无法打开“XXX”,因为无法验证开发者的问题;无法验证此App不包含恶意软件

mac从浏览器或其他电脑接收了应用&#xff0c;但是打开报错 目录报错解决办法一次性方法永久解决方法验证恢复应用验证报错 截图如下&#xff1a; 错误信息 无法打开“XXX”&#xff0c;因为无法验证开发者的问题&#xff1b;无法验证此App不包含恶意软件 解决办法 一次性方…...

CPU 指标 user/idle/system 说明

从图中看出&#xff0c;一共有五个关于CPU的指标。分别如下&#xff1a; User User表示&#xff1a;CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有&#xff1a;Shells、数据库、web服务器…… Nice N…...

Thinkphp大型进销存ERP源码/ 进销存APP源码/小程序ERP系统/含VUE源码支持二次开发

框架&#xff1a;ThinkPHP5.0.24 uniapp 包含:服务端php全套开源源码&#xff0c;uniapp前端全套开源源码&#xff08;可发布H5/android/iod/微信小程序/抖音小程序/支付宝/百度小程序&#xff09; 注&#xff1a;这个是全开源&#xff0c;随便你怎么开&#xff0c;怎么来&a…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...