- 数据类型
- 变量与常量
- 运算符:
- 字符串
- 输入与输出
- 控制流程:
- 大数:
- 数组:
java共有8种基本数据类型:四种整型,两种浮点型,字符型和布尔型,如下:
长整型数值有一个后缀L/l,十六进制有一个前缀0x/0X,八进制前缀0,二进制前缀0B/0b(java7开始)
PS:Java没有无符号形式的整型类型,但有一些特殊的方法可以处理相关操作:eg 一个byte正常表示是-128~127,若想用一个byte表示0-255,基于二进制算术运算的性质,只要不溢出,加减乘除都可以正常计算,对于其他运算,需要调用Byte.toUnsignedInt(b)来得到一个0-255的int值,然后处理这个int 值,再转换为byte,Integer和Long都提供了处理无符号除法和求余数的方法。
float类型数值后有一个后缀F/f,否则默认为double
特殊浮点数值:(用于表示溢出和出错情况)
正无穷大(正整数/0)
负无穷大
NaN(0/0 负数的平方根)
可以用内置常量Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NaN表示(Float也有)
检测“非数值结果”:if(Double.isNaN(x))
不能用:if(x==Double.NaN) //所有“非数值”的值被认为互不相同
PS:浮点数值不适用于无法接受舍入误差的金融计算,Java 基础库中的 BigDecimal 类,可表示超大精度的数据,适用于金融行业。
char 字符型:字面量值用单引号括起,双引号是引用数据类型String
转义字符:指用一些普通的字符组合代表一些特殊的字符,由于组合用的字符改变了原意,称为转义字符。 Java 中的转义字符以 开始, 常见的转义字符有: t、 n、 u、 、 ', ",其中t 代表制表符, n 是换行符, 表示一个普通的字符,‘表示一个普通的’, “表示一个普通的”。
Unicode转义序列会在解析代码前处理:(u0022:双引号)
“u0022+u0022”-——>u0022在解析之前转换为 ”,得到“”+“”,空串
PPS:u出现在注释里:读入程序时即被等效符号替换,且u后面若是没有跟着4个十六进制数也会发生语法错误
布尔类型:true,false两个值,不可以和整型值之间互相转换(C++可以)
类型转换:
一个数据在赋值给一个变量的时候存在三种不同的情况
- 第一种情况是类型一致, 不存在类型转换;
- 第二种情况是小容量可以自动赋值给大容量, 称为自动类型转换;
- 第三种情况是大容量不能直接赋值给小容量, 大容量如果一定要赋值给小容量的话, 必须添加强制类型转换符进行强制类型转换操作。
byte->short->int->long->float->double
char–> int…
byte,short,char 类型混合运算时,先各自转换成 int 类型再做运算;
多种数据类型混合运算,各自先转换成容量最大的那一种再做运算。
short s1 = 1; s1 = s1 + 1;有什么错? s1 是 short 类型, 1 是 int 类型, short 和 int 混合运算的时候 short 会自动转换为 int 类型, 所以 s1 + 1 编译器检测出是 int 类型, int 类型无法赋值给 short 类型的变量 s1。这样修改: s1 = (short)(s1 + 1);变量与常量
变量命名规则(可读性)
声明变量,且初始化变量后才能够使用变量。
对于局部变量,如果可以从变量的初始值推断出其类型,只需要使用关键字var而无须指定其类型(Java10开始)
var d=12; var s=“hello”;//类似于C++ 中的auto
Java中不区分变量的声明和定义
常量:
关键字 final 指示: final int k=1;
表示这个变量只能被赋值一次,一旦被赋值之后,就不能再更改了。
类常量(static final):可以在一个类的多个方法中使用,定义于main方法的外部,若用public修饰,其他类的方法也可以使用
public static final double PI=3.14
枚举类型:
自定义枚举类型:包括有限个命名的值
enum Size { SMALL,MEDIUM,LAGER}
声明这种类型的变量:Size s=Size.MEDIUM
存储这个类型声明中给定的某个枚举值,或null(无值)
????????????????????
运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、字符串连接运算符和其他运算符
算术运算符包括:
+(两个数字求和)、 -(两个数字相减)、 *(两个数字乘积)、 /(两个数字相除)、 %(两个数字取模或者求余(整数))、
++(单目运算符,对数字自加 1)、 --(单目运算符,对数字自减 1)。
关系运算符结果为布尔类型
逻辑运算符主要包括逻辑与(&),逻辑或(|),逻辑异或(^),短路与(&&),短路或(||)。所有逻辑运算符的特点是操作数都是布尔类型,并且最终的运算结果也是布尔类型。
主要区分:与或,短路与或
赋值运算符=、 +=、 -=、 *=、 /=、 %=,其它。
赋值类的运算符包括基本赋值运算符(=)和扩展的赋值运算
符(+=、 -=、 *=、 /=、 %=)
扩展的赋值运算不会改变原变量的类型,具体理解可以参考以下代码
byte b = 10;
//以下程序编译报错,编译器提示错误信息为:
//Type mismatch: cannot convert from int to byte
//b = b + 1;
b += 1; //编译通过并可以正常运行
System.out.println("b = " + b); //11
//通过以上的测试得出: b = b + 1 和 b += 1 是不一样的
//那么 b += 1 等同于什么呢?
b = (byte)(b + 1)
b += 1000; //编译通过,并且可以正常运行
System.out.println("b = " + b); //-12
位运算符:
&,|,^,~,>>(算术移位:符号位填充高位),<<,>>>(逻辑移位:用0填充高位)
移位运算符的右操作数在int类型下需要模32运算,long类型模64
eg: 1<<35 == 1<<3/8
条件运算符属于三目运算符:布尔表达式?表达式 1:表达式 2
先判断布尔表达式的结果是 true 还是 false,如果是 true,则选择表达式 1 的结果作为整个表达式的结果,反之则选择表达式 2 的结果作为整个表达式的结果。
字符串连接运算符
实际上“+”运算符在 java 语言中有两个作用:
- 作用一是对数字进行求和运算
- 作用二就是字符串连接运算
那么它在什么时候是进行求和,什么时候又进行字符串连接呢?
当“+”运算的时候,两边的操作数都是数字的话,一定会进行求和运算,只要其中有一个操作数是字符串类型,那么一定会进行字符串拼接运算,字符串拼接之后的结果还是字符串类型。需要注意的是,当一个表达式当中有多个“+”,并且在没有小括号的前提
下,遵循自左向右的顺序依次执行。
数学函数与常量:
Math库中包含很多基础数学运算函数:
Math.sqrt(x);Math.pow( x(l) , a(l) );
sin,cos,tan,atan,atan2,exp,log,log10…
floorMod(X,y)=(X%y+y)%y; //(负除数会得到负数结果)
还有两个用于近似表示Π,e的常量:Math.PI;Math.E
浮点数舍入运算:得到最接近的整数Math.round()(返回long类型)
Java标准类库中提供的预定义类String
提取字串:s.substring(l,r) : [ l , r ) 子串长度为:r-l
拼接:“ + ”字符串拼接运算符
多个串拼接在一起且用界定符分割:
String all=String.join(" / ",“S”,“M”,“L”); // “S / M / L”
重复: String s=“Java”.repeat(3) //“JavaJavaJava”
获得字符串长度:s.length()
返回单个字符:
s.charAt(n) : 返回位置n的代码单元,0~s.length()-1
String是不可变字符串:不能修改字符串的单个字符
可以通过截取,拼接改变字符串,但它不等同于C中字符数组和c++中string,不能单个修改
字符串比较:
判断是否相等:s.equals(t)==true/fasle
不区分大小写的比较:s.equalsIgnoreCase(t)
由于Java的存储特性,不能直接使用 == 判断
字符串,是从String类中创建的String类型对象,new 一个对象s时,Java在堆中分配一块内存用于存放数据,而方法(main或者其他方法)的栈区中存放着s,即指向字符串实际存储位置的一个地址,==只能判断两个指向地址是否相同,而无法判断字符串字面值是否相同
码点与代码单元:
?????太底层了,不用char ,暂时不必考虑
Java.lang.String: 具体查阅API文档
输入与输出输入:
Scanner读入类,有各种方法读取输入
创建一个Scanner对象:Scanner in=new Scanner(System.in)
读取字符串:
以空白符作为分隔符:in.next();
以换行为分隔符:in.nextLine();
读取整数:in.nextInt();
in.nextDouble();
in.hasNext();//检测输入中是否还有其他单词
in.hasNextInt();//检测是否还有下一个整数
in.hasNextDouble();
格式化输出:
System.out.printf( ) //c语言的printf
还可以使用静态的String.format方法创建一个格式化的字符串
String s=String.format(“hello,%s,%d”,name,time);
文件输入输出:
控制流程:顺序,条件,循环,选择
switch(case):
{
case 1:
…
default:
…
break;
}
ps:case标签可以是:
- char,byte,short,int的常量表达式
- 枚举常量
- 字符串字面量
终端控制流程语句:
带标签的break(用于跳出多重嵌套的循环语句,将标签放在希望跳出的最外层循环之上),continue语句(将控制转移到最内层循环的首部/跳到与标签匹配的循环的首部)
BigInteger和BigDecimal
可以处理包含任意长度数字序列的数值
使用静态的valueof方法可以将普通的数值转化为大数
构造方法:
BigInteger a=BigInteger.valueof(100);
or BigInteger b=new BigInteger(“111111111111111111111111111”);
计算方法:
a.add(b);a.subtract(b);
multiply , divide , mod ,sqrt ,compareTo …
具体可查阅API文档
一种用来存储同一类型值的集合的数据结构。
 System.out.println(i);
循环变量遍历数组中每个元素,而非下标值
数组拷贝:
Java中允许将一个数组变量拷贝到另一个数组变量,两变量引用同一数组
如下图,拷贝是在栈空间内数组变量意义上的拷贝,是地址的拷贝,因此会出现两数组变量指向同一片堆空间。
如果希望将一个数组中的所有值拷贝到一个新的数组中去,要使用Arrays类中的copyof方法:
int[] b=Arrays.copyof(a,K*a.length()); //参数2是新数组长度,可以通过这种方法增加数组大小 //新数组多于原数组的额外部分:数值型数组赋值0,布尔型赋值false //新数组大小小于原数组,只拷贝前面的值
数组排序:
Arrays类中的sort方法:优化的快速排序算法
int[] a=new int[100]; ..... Arrays.sort(a);
关于Arrays 类的一些方法:
static String toString(var[ ] a):返回包含a中元素的一个字符串,括号包围,逗号分隔;
static xxx[ ] copyof(xxx[ ] a,int end)
static xxx[ ] copyofRange(xxx[ ] a,int start,int end)
static void sort(xxx[ ] a)
static void BinarySearch(xxx[ ] a,xxx v)
static void BinarySearch(xxx[ ] a,int start,int end,xxx v)
//找到返回下标,否则返回一个负数r,(-r-1)是v应当插入的位置
static void fill(xxx [ ],xxx v);
static boolean equals(xxx[ ] a,xxx[ ] b);
多维数组(数组的数组):
int[][] a=new int[MAXN][]; for(int i=0;i



