Java高效率复习-数据类型和运算符[Java]

news/2025/2/14 5:23:29/

第一篇关于JavaSE内容的文章

文章的风格比较涣散,但是都是干货,关于Java系列的,还有就是,我认为只有MySQL基础和JavaSE基础是可以做到可操作性和可执行性较强的。
如果像JavaWeb或者SSM框架这些,光看文章你是根本执行不了的,这些不止是代码的不同,也有着配置文件和开发环境配置的不同,所以到了后面的文章时,一定要多自己学,本文章只适合偶尔看看较好,看看自己的理解和他人的理解有何不同等等。

文章前言

关于本文章的内容,是Java基础语法的学习,像一些最基本的Java声明代码或者一些很简单的API使用等等,可以说本章就是最常用的内容,可能到工作,都包含着这些知识内容,所以一定要打好基础,基础不牢、地动山摇。
Java自后的文章对应标点符号的书写比较规范,但是注释就不写很多符号了,而且注释大部分为英文符号,中文标点符号大多用在文章内容

最基本的一个Java文档结构

//本文章使用的JDK版本是Java11
//复习文章,就不去注释以下内容了
public class Demo{public static void main(String[]args){System.out.println("Hello Java.11");}
}

注释

注解理解

给自己标记和别人理解用的,注释最少占源码的三分之一,并且注释不会被编译,在注释里可以随意写内容,不过注释不能包含注释,JavaDoc是Java特别提供的,文章不会介绍文档注释的创建和使用。
JavaDoc和API文档也是有关系的,API文档就是官方对每个类的说明,前期先知道就行,后期根据所需前往阅读即可。

注释使用

//System.out.println("这行代码被注释了,不会编译、执行!");
//单行注释
/*
多行注释
多行注释
*/
/**
* 文档注释
* 文档注释的常用标记
* @author:指定作者
* @version:指定版本
* @deprecated:不推荐使用的方法
* @param:方法参数说明信息
* @return:方法的返回值说明信息
* @see:“参见”,用于指定交叉参考的内容
* @exception:抛出异常的类型
* @throws:抛出的异常,和@exception同意
*/

标识符和关键字

分隔符

;:分号,用于结束一段代码。
{}:花括号,用于定义代码块等,是成对出现的。
[]:方括号,一般是定义数组用的。
():圆括号,方法形参,方法调用,创建对象等等...比较常用
空格:基本上除了定义变量名和调用属性等操作都可以用到
但是要注意书写的规范,不要过于空格代码间距和代码行距
要保证代码的可读性和简洁性以及美观。
.:圆点:通常用作类/对象和它的成员之间的分隔符。

标识符规则

标识符就是用于给程序中变量、类、方法命令的符号。Java语言的标识符必须以字母、下画线(_)、美元符号($)开头,后面可以跟任意数目的字母、数字、下画线(_)和美元符号($)。此处的字母并不局限于26个英文字母,而且可以包含中文字符、日文字符等。
由于Java11支持Unicode10.0字符集,因此Java的标识符可以使用Unicode10.0所能表示的多种重语言的字符。Java语言是区分大小写的,因此abc和ABC是两个不同的标识符。
从Java9开始,不允许使用单独的下画线(_)作为标识符,也就是说,下画线必须与其他字符组合在一起才能作为标识符。
使用标识符时,需要注意如下规则:

  • 标识符可以由字母、数字、下画线(_)和美元符($)组成,其中数字不能打头。
  • 标识符不能是Java关键字或保留字,但可以包含。
  • 标识符不能包含空格。
  • 标识符只能包含美元符($),不能包含@、#等其他特殊字符。

Java的关键字

关于关键字的话,我就不去都一一列出来了,这样做的意义很小,关键字是Java官方将单词特意标记出来,用于完成一些特殊的操作等。
我们是不能使用关键字来为标识符命名的,但是可以包含关键字:String helloboolean = “字符串”;
保留字见名知意,关于是否能转换为关键字,让我们敬请期待吧!

//关键字的标识符需知
String helloboolean = "字符串";//可以包含。
int boolean;//不可以使用关键字作为标识符。
//这里小提一下关于String
//String是一个引用类型,
//而且是官方的一个类并不是关键字!

数据类型分类

变量

关于变量,Java是一个强类型的语言,也就是变量必须先定义后使用,在编译时期就确定下来变量的类型和变量名。

type name [ = 初始值];

编程的本质就是去访问内存中的数据,而程序员访问数据则需要一种机制,变量就是访问的机制。
变量是有名字的,并且标识了一片内存数据,获取数据就是从该变量所代表的内存区取值的过程,也就是说变量相当于一个有名称的容器,该容器用于装各种不同类型的数据。
变量有不同作用域的区分,因为作用域的不同,所以变量也可以不赋初始值和必须赋初始值。
定义变量至少需要变量类型和变量名。定义变量时可以是Java支持的所有类型
Java语言支持的类型分为两类:基本类型和引用类型
基本类型包含boolean类型和数值类型。数值类型有整数类型和浮点类型。整数类型包含byte、short、int、log、char,浮点类型包括float和dboule,而char代表字符串,实际上字符串也是一种整数类型,相当于无符号整数类型
引用类型包括类、接口和数组类型,还有一种特殊的null类型。
因为null类型没有名称,所以不可能声明一个null类型的变量或者转换到null类型。
空引用是null类型变量唯一的值。空引用可以转换为任何类型,null只是一个特殊的直接量。
null只能被转换为引用类型,包装类是基本类型的引用代表。

基本数据类型

Java的基本数据类型分为两大类:boolean类型和数值类型。而数值类型又可以分为整数类型和浮点类型,整数类型里的字符串类型也可被单独对待。因此常把Java里的基本类型分为4类:整数类型、字符类型、浮点类型、布尔类型
关于基本数据类型,此处不完全介绍。
整数型:byte、short、int、long;它们的范围大小依次从左往右提升
int是最常用的整数类型,一般情况下整数类型默认类型为int。除此之外,有如下两种情形必须指出:

  • 如果将一个较小的整数值(在byte或short范围内)赋给一个byte或short变量,系统会自动把这个整数类型当成byte或short类型来处理。
  • 如果使用一个巨大的整数值(超过了int的范围内)时,Java不会自动把这个整数值当成long类型来处理。如果希望系统把一个整数值当成long类型来处理,应在这个整数值后增加l或者L作为后缀。通常推荐使用L。
    下面代码验证上述结论:
byte a = 56;//自动把56当成byte来处理
//下面代码是错的,系统不会当成long来处理
//long bigValue = 9999999999999;
long bigValue = 9999999999999L;//指定了long的后缀L(l也可以,建议使用L,因为容易和数字1混淆)

可以把一个较小的整数值(int范围内)直接赋给一个long类型的变量,这并不是因为Java会把这个较小的整数值当成long类型来处理,Java依然会把这个整数值当成int类型来处理,只是因为int类型的值会自动类型转换到long类型。
此处就不讲进制了。

字符型

字符型通常用于标识单个的字符,字符型值必须使用单引号(')括起来。Java语言使用16位的Unicode字符集作为编码方式,而该字符集支持世界上所有书面语言的字符,包括中文字符,因此Java程序设计支持各种语言的字符。
字符型值有如下三种表示形式。

  • 直接通过单个字符来指定字符型值,例如’A’、'9’和’0’等。
  • 通过转义字符表示特殊字符型值,例如’\n’、'\t’等。
  • 直接使用Unicode值来表示字符型值,格式是’\uXXX’,其中XXXX代表一个十六进制的整数。
    Java常用的转义字符:
转义字符		说明		Unicdoe表示方式
\b -> 		退格符 -> 	\u0008
\n			换行符		\u000a
\r			回车符		\u000d
\t			制表符		\u0009
\"			双引号		\u0022
\'			单引号		\u0027
\\			反斜线		\u005c

char类型的变量,值完全可以参加四则运算,也可以比较大小,实际上都是用该字符对应的编码参与运算。
如果把0~65535范围内的int整数赋值给char类型变量,系统会自动把这个int整数当成char类型来处理。
下面简单示范了字符型变量的用法。

char zhong = '风';
System.out.println(zhong);
char ch = '\u9999';
System.out.println(ch);//输出香

Java没有提供表示字符串的基本数据类型,而是通过String类来表示字符串,由于字符串由多个字符组成,因此字符串要使用双引号括起来。如下代码:

String str = "Hello";

字符串是引用类型,可以有很多API方法以及类的特性,定义为类是远优于基本类型的。
在Java程序中标识一个绝对路径:
c:\codes,但这种写法是得不到期望的结果的,因为Java会把反斜线当成转义字符,所以应该写成:
c:\codes的形式才是实际的c:\codes

浮点型

浮点型有两种:float和double。
因为Java浮点型使用二进制数据的科学计数法来表示浮点数。因此可能不能精确表示一个浮点数,而double则是比float更为精准的浮点类型,但是如果小数位足够多的话,double也可能表示不精准。
如果想要精准保存一个浮点数,则可以考虑使用BigDecimal类(数据库有一个Decimal类型),该类保存浮点型的本质是字符串保存数值,用的时候再转换为数值类型。
double类型代表双精度浮点数,float类型代表单精度浮点数。一个double类型的数值占8个字节、64位,一个float类型的数值占4个字节、32位。
Java语言的浮点数有两种表示形式。

  • 十进制数形式:这种形式就是简单的浮点数。浮点数必须包含一个小数点,否则会被当成int类型处理。
  • 科学计数法形式:例如5.12e2(即5.12×10^2),5.12E2。

Java的浮点数默认类型是double,如果想要使用float类型则可以通过添加后缀f或者F,如果想要强制表示double类型,也可以后缀添加d或者D。
Java还提供了三个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错。例如,使用一个正数除以0将得到正无穷大,使用一个负数除以0将得到负无穷大,0.0除以0.0或对一个负数开方将得到一个非数。正无穷大通过Double或者Float类的POSITIVE_INFINITY标表示;负无穷大通过Double或Float类的NEGATIVE_INFINITY表示,非数通过Double或Float类的NaN表示。
NaN和任何数都不相等,包括本身。
只有浮点数除以0才可以得到正无穷大或负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。如果一个整数值除以0,则会抛出一个异常:ArithmeticException/by zero(除以0异常)。

数值中使用下画线_布尔型_var变量

当程序中用到的数值位数特别多时,可以在其中自由的使用下画线分隔,可以更直观分辨数值中包含多少为。如下程序所示。

int number = 1_2_3_4_5_6_7;//结尾就不要再添加下画线了
double pi = 3.14_15_92_65_36;//双精度浮点类型
System.out.println("pi = " + pi);
//IDEA可以通过soutv来快速输出变量
System.out.println("number = " + number);

布尔值类型,用于表示逻辑上的“真”或“假”,在Java中布尔值类型只能用true或false来赋值。

boolean b1 = true;
boolean b2 = false;

字符串"true"不会自动转换为布尔类型,但如果使用字符串和布尔型使用“+”号相加运算(此处表示的是连接符),则结果是一个字符串。
布尔类型也只能和字符串类型相加,注意相加结果永远是字符串值,几乎很多表达式和字符串相加的结果都是字符串(不能与null值计算,编译会直接报错)。
关于布尔类型的用处场景大多是流程控制或者一些数值判断,用的比较多的是循环和一些流程语句,比如IF、WHILE、FOR等等(后续文章内容),也可以在三目运算符中使用。
使用var定义变量是Java10后来引进的内容,var定义变量是很多弱类型语言都支持的定义形式,Java也是败给了潮流所驱,引入了var变量,但是要知道Java仍然保持着强类型的原则。
var只能用于定义局部变量,或许可以说是用于简化局部变量的类型。
当为var定义的变量赋值时,那么该类型就已经确定下来了,如果是int则无法再次赋值为double类型或者字符串类型。
编译器是会根据对变量的赋值进行推断类型,一旦推断了一次,就不再允许下次赋值是不同类型或者超越了类型范围的值。

var a = 20;
//因为默认会推断是int类型,所以需要类型转换
var byteA = (byte)13;
var b = '字';//只能定义一个字
var c = "字符串";
//a = 2.2; 不兼容
//var d;无法判断类型,必须赋值
var demo = new Demo();//这才是var变量的最大意义
//MyBatis的sqlSession定义
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryBuilder.build(path);
var sqlSessionFactory = SqlSessionFactoryBuilder.build(path);
//可以看到有些类型是显然知道是什么类型的,就没有必要打全

var变量是一把双刃剑,虽然确实简化了很多,但是也会导致可读性变差,在没有较好的基础时,全是var类型定义的类会导致自己完全蒙圈,所以建议在像for循环的初始化值或者一些固定类写法中去使用var变量,这也是最有价值的地方了。

基本类型的类型转换

在Java程序中,不同的基本类型的值经常需要进行相互转换。Java语言所提供的7种数值类型之间可以互相转换,有两种类型转换方式:自动类型转换和强制类型转换

自动类型转换

Java所有的数值型变量可以相互转换。如果系统支持把某种基本的值直接赋给另一种基本类型的变量,则这种方式被称为自动类型转换;否则就需要强制转换。
就像小瓶水导入大瓶水里,是没有问题的。
自动类型转换顺序,从大到小如下:

doublefloatlongintshortbytechar//和short同级的都是向int自动转换	

下面程序示范了自动类型转换。

int a = 6;
//int类型可以自动转换为float类型
float f = a;
//下面将输出6.0
System.out.println(f);
//定义一个byte类型的整数变量
byte b = 9;
//下面代码将出错,byte的上级只能是short不能是char
//char c = b;
//byte变量可以自动类型转换位double类型
double d = b;
//下面将输出9
System.out.println(d);

所有的数值类型都可以和字符串值进行连接运算,基本类型的值将自动类型转换为字符串类型,虽然字符串类型不是基本类型,而是引用类型。因此,如果希望把基本类型的值转换为对应的字符串时,可以把基本类型的值和一个空字符串进行连接。
+不仅可作为加法运算符使用,还可作为字符串连接运算符使用

String a = "at" + "it";
String b = "Hello,"+"Java";//必须有连接符号才可以实现值跨行,标识符是不可以这么书写的
System.out.println("Hello"+3+4);
System.out.println(3+4+"Hello");
System.out.println("Hello"+(3+4));//通过圆括号来增加运算优先级达到非纯拼接值 

强制类型转换

如果希望将上面的自动类型转换箭头向下走,则必须进行强制类型转换,强制类型转换的语法格式是(targetType)value,强制类型转换的运算符是圆括号()。当进行强制类型转换时,类似于将大瓶子里的水倒入小瓶子里,如果大瓶子的水可以装下还好,如果不能装下将会引起溢出,从而造成数据丢失。这种转换也被称为“缩小转换”。
下面程序示范了强制类型转换。

var iValue = 233;
//强制把一个int类型的值转换为byte类型的值
byte bValue = (byte)iValue;
System.out.println(bValue);//将输出-23
//强制把一个double类型的值转换为int
var dValue = 3.98;
int tol = (int) dValue;
System.out.println(tol);//输出3

下面程序示范了如何生成一个6位的随机字符串,这个程序用到了循环控制。
在这里插入图片描述
在这里插入图片描述

public class Demo {public static void main(String[] args) {//定义一个空字符串var result = "";//进行6次循环for(var i = 0;i<6;i++){//执行6次,因为0的时候也会执行一次//生成一个97~122之间的int类型整数var intVal = (int)(Math.random()*26+97);//+97起始值 *26是向后做26个数//将intValue强制转换为char类型后连接到result后面result = result + (char) intVal;}System.out.println(result);}
}

过多详细此处不再赘述了。
float和String类型的转换有些微妙,float是不能直接赋值,String是不能直接强制类型转换。

//直接把数赋给float类型会报错,因为默认是double类型
//想将1.2赋值给float a 则必须强制类型转换为float
//float a = 1.2;
float a = (float)1.2;
//字符串不可以直接强制类型转换为数值类型,可以通过其对应包装类的方法进行类型转换
int strPareIntA = Integer.parseInt("15");//也可以是变量存储的15,此处是个直接量
System.out.println(strPareIntA);

表达式类型的自动提升

当一个算术表达式中包含多个基本乐西的值时,整个算术表达式的数据类型将发生自动提升。Java定义了如下的自动提升规则。

  • 所有的byte类型、short类型和char类型将被提升到int类型。
  • 整个算术表达式的数据类型自动提升到与表达式中最高登记操作数同样的类型。操作数的等级仍然是参考自动类型转换顺序

下面程序将会演示典型的错误。

//定义一个short类型变量
short sValue = 5;
//表达式中的sValue将自动提升到int类型,则右边的表达式类型为int
//将一个int类型赋值给short类型变量将发生错误
//sValue = sValue -2;
// sValue = (short) ((short) sValue -2);能解决但是麻烦

下面程序演示正确的表达式类型自动提升。

byte b = 40;
var c = 'a';
var i = 23;
var d = .314;
//右边表达式最高等级操作数为d(double类型)
//则右边表达式的类型为double类型,故赋给一个double类型变量
double reuslt = b+c+i*d;
System.out.println("reuslt = " + reuslt);

直接量

直接量是值在程序中通过源代码直接给出的值,int a = 5,那么5就是一个直接量。

直接量的类型

并不是所有的数据类型都可以指定直接量,能指定直接量的通常只有三种类型:基本类型、字符串类型和null类型。基本类型和null类型是可以指定不同进制的形式的,float在后面加上F就是float的直接量,long在后面加上L就是long的直接量(因为没有默认赋值为double和int)。
boolean直接量只有true和false,String就是一对双引号引起来的内容,null类型的直接量就是null。

下面程序示范了直接量。

var a =5;
var c = 'a';
var b = true;
var f = 5.12f;
var d= 4.12;
var author = "李刚";
var book = "疯狂Java讲义";

Java允许数值之间的自动类型转换,因此允许把一个数值直接量赋给另一种类型的变量,这种赋值必须是系统所支持的自动类型转换。
String的直接量不能直接赋值给其他类型的变量,null类型的直接量可以直接赋给任何引用类型的变量,包括String类型。boolean类型的直接量只能赋给boolean类型的变量。
关于字符串的直接量,如果程序第一次使用某个字符串的直接量时,Java会使用常量池来缓存该字符串直接量,如果程序后面部分需要用到该字符串直接量时,Java会直接使用常量池中的字符串直接量。

var s0 = "hello";
var s1 = "hello";
var s2 = "he" + "llo";
System.out.println(s0 == s1);
System.out.println(s0 == s2);

上面的结果都是真(true),也证实了常量池这一点。

运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。Java语言使用运算符将一个或多个操作数连缀成执行性语句,用以实现特定功能。

Java语言中的运算符可分为如下几种。

  • 算术运算符
  • 赋值运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符(本文章略)
  • 类型相关运算符

位运算符前期不学。

算术运算符

就是普通的四则运算、取模(%)、自加(++)和自减(–)。
这里有前++和后++的区别,一般都是用于循环迭代语句的退出等操作。

int a = 5
a++;//执行完后再自增1
++a;//执行前就会自增1
//--同上规则

自加和自减只能用于操作变量,不能用于操作数值直接量、常量或表达式。例如,5++、6–等写法都是错误的。
如果想要完成其他复杂的数学运算,则可以通过java.lang.Math类的工具方法来完成复杂的数学运算。
+号除了作为数学的加法运算符之外,还可以作为字符串的连接运算符;-号除了作为数学的减法运算符之外,还可以作为求负的运算符。

double x = -5.0;
x = -x;//变成了5.0

赋值运算符

赋值运算符用于为变量指定变量值,用=作为赋值运算符

var str = "Java";
var pi = 3.14;
var visited = true;

按前面关于变量的介绍,可以把变量当成一个可盛装数据的容器。而赋值运算符就是将被赋的值“装入”变量的过程,。赋值运算符是从右向左执行计算的,程序先计算得到=右边的值,然后再将该值“装入”=左边的变量,因此赋值运算符(=)左边只能是变量。
赋值表达式是有值的,赋值表达式的值就是右边被赋的值。赋值运算符支持连续赋值。
赋值运算符是有扩展的,例如,+=、-=、*=等等,其实就是变量本身的数去+了一个数或者减了一个数等等,此处不再把扩展赋值运算符单独列出来了。

int a;
int b;
int c;
a = b = c = 8;
System.out.println(a+","+b+","+c);

比较运算符

比较运算符用于判断两个变量或常量的大小,比较运算符的结果是一个布尔值(true或false)。Java支持的比较运算符如下。

>:大于,如果左边的变量值大于右边变量值则返回true>=:大于等于,如果左边的变量值大于右边或者等于右边的值
则返回true<:小于,如果左边的变量值小于右边变量值则返回true<=:小于等于,如果左边的变量值小于右边或者等于右边的值
则返回true==:等于,如果都是数值类型,即使它们的类型不同,但是只要数值相同就返回true
如果两个操作数都是引用类型,那么只有当两个引用变量的类型
具有父子关系时才可以比较
而且这两个引用必须指向同一个对象才会返回trueJava也支持两个boolean类型进行比较,例如,true==false将返回false

逻辑运算符

逻辑运算符作用域操作两个布尔型的变量或常量。逻辑运算符主要有如下6个。

  • &&:与,前后两个操作数必须都是true才返回true,否则返回false。
  • &:不短路与,作用与&&相同,但不会短路。
  • ||:或,只要两个操作数中有一个是true,就可以返回true,否则返回false。
  • |:不短路或,作用与||相同,但不会短路。
  • !:非,只需要一个操作数,如果操作数为true,则返回false;如果为false则返回true,其实就是取反。
  • ^:异或:当两个操作数不同时才返回true,如果两个操作数相同则返回false。

这不短路的两个符号其实存在意义就是,如果你的判断条件里,第一个表达式的后面是有类似自增或自减的操作,如果短路,则根本不会判断到不符合条件的后面的条件,也就无法完成本次逻辑符表达式中的赋值操作。
一般其实用不到,然后异或用的也挺少的。一般都是用&&和||,最多的是!,也就是取反,比如 a != b,意思就是a变量的值不等于b,如果不等于就返回true,等于就是false,这种一般都是用于流程控制的逻辑运算符。

三目运算符

这个运算符就是一个表达式形式的if语句
语法格式如下:

(expression) ? if-true-statment : if-false-statement;

三目运算符的规则是:先对逻辑表达式expression求职,如果逻辑表达式返回true,则返回第二个操作数的值,如果逻辑表达式返回false,则返回第三个操作数的值。
如下程序示范了三目运算符。

//(表达式) ? (true)第二个操作数的值 : (false)第三个操作数的值
String str = 5 > 3 ? "5大于3" : "5不大于3";
System.out.println("str = " + str);

运算符的优先级

在这里插入图片描述
上面的优先等级从上到下,越往上的优先等级越高。


http://www.ppmy.cn/news/2281.html

相关文章

gnn神经网络是什么,gnn神经网络代码

1、gnn什么意思? 指图形神经网络。 生物神经网络主要是指人脑的神经网络&#xff0c;它是人工神经网络的技术原型。人脑是人类思维的物质基础&#xff0c;思维的功能定位在大脑皮层&#xff0c;后者含有大约10^11个神经元。 每个神经元又通过神经突触与大约103个其它神经元…

vue - vue使用echarts实现中国地图和点击省份进行查看

文章目录1&#xff0c;实现的效果和功能2&#xff0c;安装ECharts3&#xff0c;main.js里面引入echarts4&#xff0c;实现如下5&#xff0c;遇到的问题6&#xff0c;用到的模拟数据1&#xff0c;实现的效果和功能 vue使用echarts实现中国地图和点击省份进行查看&#xff1b; 下…

【C++】C++11新特性

目录 一.列表初始化initializer_list 1.什么是列表初始化 2.列表初始化的原理 二.auto/decltype/nullptr 1.auto - 自动类型推导 2.decltype - 指定类型 3.nullptr - C空指针 三.范围for 四.右值引用/移动构造/移动赋值/万能引用/完美转发 1.什么是右值 2.左值与右值…

适用于嵌入式单片机的差分升级通用库+详细教程

1. 什么是差分/增量升级&#xff1f; 借用网上的介绍&#xff1a;适合嵌入式的差分升级又叫增量升级&#xff0c;顾名思义就是通过差分算法将源版本与目标版本之间差异的部分提取出来制作成差分包&#xff0c;然后在设备通过还原算法将差异部分在源版本上进行还原从而升级成目…

Python判断是否为字符串的程序是什么?

Python中如何判断是否为字符串?在python中&#xff0c;想要判断是否为字符串可以通过isinstance()函数来判断&#xff0c;接下来小编将通过示例为大家详细的介绍一下。 Python判断是否为字符串 >>> s abc >>> isinstance(s,basestring) #判断是否是字符串型…

试给出二叉树从下至上,从右至左的遍历算法

算法思想&#xff1a;根据层次遍历的顺序可得到与该问题相反的次序&#xff0c;则可利用栈先进后出的性质&#xff0c;按层次遍历输出各结点并压入栈中&#xff0c;出栈时访问结点即可得到从下至上从右边到左边的遍历算法 代码&#xff1a; void LeverOrder(BiTree T){ BiTr…

数据比较器,对比数据前后变化细节

前言 在开发的过程中&#xff0c;有时候需要对数据进行比对&#xff0c;来判断是否发生变化。如果一个字段一个字段比较&#xff0c;就太麻烦了。所以通过整合注解与反射的方式&#xff0c;实现一个通用的实体数据比较框架。 设计 使用注解&#xff0c;确定需要比较的属性。…

单片机硬件和软件延时是啥意思?

软件延时和硬件延时是啥意思&#xff1f;做项目时他俩有什么区别&#xff1f; 今天就来讲讲关于硬件延时和软件延时的内容&#xff0c;以及它们的区别。 硬件和软件延时 延时的种类很多&#xff0c;先给大家普及一下延时相关概念和分类。 1.硬件延时 指利用具有计数功能的…