一、基础知识汇总
1.1 Java的基本数据类型
Java是指一种强类型的语言。在Java中一共有8种基本数据类型,分别为四种整型:byte,short,int,long;两种浮点型:float,double;一种表示真值的类型:boolean;一种字符型:char。
1.1.1 整型
整型用来表示没有小数部分的数值。整型常量默认为 int 型,声明long型常量须后加‘l’或‘L’ 。
类型 | 存储需求 | 取值范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | -215 ~ 215-1 |
int | 4字节 | -231 ~ 231-1 |
long | 8字节 | -263 ~ 263-1 |
1.1.2 浮点型
浮点型用于表示有小数部分的值。浮点型常量默认为double型, 声明float型常量,须后加‘f’或‘F’。
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 3.402823e+38 ~ 1.401298e-45 |
double | 8字节 | 1.797693e+308~ 4.9000000e-324 |
float被称为单精度数值,double被称为双精度数值(数值精度为float的两倍),绝大部分程序都使用double类型。
用于表示溢出和出错情况的三个特殊的浮点数:
- 正无穷大:正整数/0
- 负无穷大
- NAN(不是一个数字):计算0/0或负数的平方根
1.1.3 char类型
char类型用来表示单个字符,其字面量需要用单引号括起来。Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。 例如’A’就是一个char类型的数据,其ASCII码值为65。
转义序列 | 名称 |
---|---|
\b | 退格 |
\t | 制表 |
\n | 换行 |
\r | 回车 |
" | 双引号 |
’ | 单引号 |
\ | 反斜杠 |
1.1.4 boolean类型
boolean类型有两个值:true与false,用来判定逻辑条件。整型值与布尔值之间不能相互进行转换。
1.1.5 大数值
如果基本的整数和浮点数的精度不能满足要求,那么可以使用java.math包中的两个类BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal类实现了任意精度的浮点数运算。
使用静态的ValueOf方法可以将普通的数值转换为大数值:
Biglnteger a = Biglnteger.valueOf(100);
**注意:**不能使用算数运算符对大数值进行处理,而需要使用大数值类中的add、subtract、mutiply、divide和mod方法进行加减乘除和取余操作。
Biglnteger c = a.add(b); // c = a + b
Biglnteger d = c.multipiy(b.add(Biglnteger.valueOf(2)));
// d = c * (b + 2)
1.2 运算符
1.2.1 Math类
首先在Math类中包含了两个属性。
static double E
double值比其他任何一个都更接近 e ,自然对数的基数。
static double PI
double值比任何其他的更接近 pi ,圆周长与其直径的比率。
在Math类中,包含了各种各样的数学函数。
- abs():返回一个数的绝对值
- sqrt(double a):返回一个数值的平方值
- pow(double a, double b):返回数值a的b次幂
- round():返回一个数值四舍五入之后的整数值
- sin():返回正弦值
- cos():返回余弦值
- tan():返回正切值
- random():返沪一个大于0.0,小于1.0之间的小数
- max():返回两个数之间的最大值
- min():返回两个数之间的最小值
- exp(double a):返回指数值
1.2.2 类型转换
**自动类型转换:**在进行元素之间的运算时,自动将精度低的类型转换为精度高的类型,在进行转换操作。
- 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型
- 否则,如果其中一个操作数是float类型,另一个操作数就会转换为float类型
- 否则,如果其中一个操作数是long类型,另一个操作数就会转换为long类型
- 否则,两个操作数都将被转换为int类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3gqjL6tV-1685587849914)(image-20230504124842290.png)]
注意:
- byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
- boolean类型不能与其它数据类型运算。
- 当把任何基本数据类型的值和字符串(String)进行连接运算时(+), 基本数据类型的值将自动转化为字符串(String)类型。
**强制类型转换:**在进行元素之间的运算时,有时需要将高精度的数值类型转换为低精度的数值类型,在其中可能会有精度的损失,因此,需要用强制类型转换来完成这个操作。
例如:
double doubleValue = 9.22;
//强制类型转换,将double类型转换为int类型
int intValue = (int)doubleValue; //intValue = 9
1.2.3 运算符优先级
运算符 | 结合性 |
---|---|
[] . () (方法调用) | 从左向右 |
! ~ ++ – + - ()(强制类型转换) new | 从右向左 |
* / % | 从左向右 |
+ - | 从左向右 |
<< >> >>> | 从左向右 |
< <= > >= instanceof | 从左向右 |
== != | 从左向右 |
& | 从左向右 |
^ | 从左向右 |
| | 从左向右 |
&& | 从左向右 |
|| | 从左向右 |
?: | 从右向左 |
= += -= *= /= %= &= |= <<= >>= >>>= | 从右向左 |
1.2.4 基本数据类型缓存池
基本数据类型的包装类除了Float和Double类型之外,其他六个包装类(Byte、Short、Integer、Long、Character、Boolean)都有常量缓存池。
各个类型缓存池的大小:
- Byte:-128~127
- Short:-128~127
- Long:-128~127
- Character:\u0000 - \u007F
- Boolean:true 和 false
在包装类中,设置了缓存池大小范围内的缓存数据,当所使用的数据范围在该缓存池大小范围之内时,则直接从缓存池中返回对象的引用,而不是创建对象,超过这个范围时才创建对象。
//使用new创建的对象在堆区,对象的地址值一定不同
Integer num1 = new Integer(18);
Integer num2 = new Integer(18);
System.out.println(num1 == num2); //false
//valueOf()方法就使用到了常量缓存池,-128<18<127,因此直接从常量缓存池中取出对象的引用,因此对象地址值相同
Integer num3 = Integer.valueOf(18);
Integer num4 = Integer.valueOf(18);
System.out.println(num3 == num4); //true
//由于127<300,因此需要重新new对象,所以对象地址值不同
Integer num5 = Integer.valueOf(300);
Integer num6 = Integer.valueOf(300);
System.out.println(num5 == num5); //false
1.3 字符串
1.3.1 概念
概念:Java字符串就是Unicode字符序列。Java没有内置 的字符串类型,而是在标准Java类库中提供了一个预定义的类,很自然的叫做String类。每一个用双引号括起来的字符串都是String类的一个实例。
//String类的声明
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {...}
- 由于String类被final修饰,因此String类不可被子类继承
- 由于String 类实现了 Serializable 接口,因此它是可序列化的
- 由于String类实现了Comparable接口,因此String类支持使用
compareTo()
方法去比较
1.3.2 String类的常用API:
-
String substring(int beginlndex, int endlndex )
返回一个新字符串。这个字符串包含原始字符串中从 beginlndex 到串尾或 (endlndex-l)的所有代码单元。 -
int compareTo(String other)
按照字典顺序, 如果字符串位于 other 之前, 返回一个负数;如果字符串位于 other 之后,返回一个正数; 如果两个字符串相等,返回 0。 -
boolean equals(0bject other)
如果字符串与 other 相等, 返回 true。 -
boolean equalsIgnoreCase( String other )
如果字符串与 other 相等 (忽略大小写,) 返回 true。 -
boolean startsWith( String prefix )
如果字符串以 prefix 结尾, 则返回 true。
-
boolean endsWith( String suffix )
如果字符串以 suffix 结尾, 则返回 true。
-
int indexOf( String str, int fromlndex )
返回与字符串 str 匹配的第一个子串的开始位置。这个位置从索引 0 或fromlndex 开始计算。 如果在原始串中不存在 str, 返回 -1。 -
Int 1astIndexOf ( String str, int fromlndex )
返回与字符串 str 匹配的最后一个子串的开始位置。 这个位置从原始串尾端或 fromlndex 开始计算。
-
String toLowerCase( )
-
String toUpperCase( )
返回一个新字符串。 这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成了大写字母。
-
String trim( )
返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格 -
byte[] getBytes(StandardCharsets.UTF_8)
返回字符串的字节数组,可以指定编码方式
1.3.3 字符串的不变性
java中String类型的对象是不可变的,即一旦一个String对象在内存中被创建出来就无法被修改。
产生不变性的原因:
- String类被final关键字修饰,所以该类不能被继承,其所有的方法也都不会被重写。
- String类的数据存储在char[]数组(jdk9之后存储在byte[])之中,而这个数组也是由final修饰的,因此String对象的内容一旦赋值之后就是不可变的。
不变性带来的优点:
-
保证了String对象的安全性,避免被修改。
-
保证哈希值不会经常改变。如果String对象改变的话,其哈希值就会跟着改变,这样会造成哈希表性能变得很差。
-
可以实现字符串常量池,java会将相同内容的字符串存储在字符串常量池之中,具有相同内容的String对象只有第一次创建时,才会在字符串常量池之中分配地址空间,他们都指向字符串常量池之中相同的地址空间,节省了内存的空间。
因此像substring(),concat(),replace()方法都会重新创建一个新的String对象,而不是对原String对象进行修改。
1.3.4 java字符串常量池
字符串常量池的概念:由于字符串的使用频率实在是太高了,所以 Java 虚拟机为了提高性能和减少内存开销,在创建字符串对象的时候进行了一些优化,特意为字符串开辟了一块空间——也就是字符串常量池。
字符串的存储方式:
-
通过new String() 的方式创建字符串
String str = new String("helloworld");
- 若字符串常量池之中没有该字符串,首先在字符串常量池之中创建了该字符串对象,然后再去堆区中new一个字符串对象,最后将该地址空间返回个给字符串变量。
- 若字符串常量池之中有该字符串,则直接在堆区中new一个字符串对象,然后将该地址空间返回个给字符串变量。
-
通过双引号(“”)的方式创建字符串
String str = "helloworld";
- 若字符串常量池之中没有该字符串,则直接在字符串常量池中创建该字符串对象,地址返回给栈中的变量。
- 若字符串常量池之中有该字符串,则直接将该字符串对象地址返回
总结:
new 的方式始终会创建一个对象,不管字符串的内容是否已经存在,而双引号的方式会重复利用字符串常量池中已经存在的对象。因此,建议使用双引号方式创建字符串对象,这样效率更高。
1.4 数组
1.4.1 数组的概念
概念:数组是一种数据结构,用来存储同一种数据类型的数据的集合。通过一个整型的下标可以访问数组中的每一个值。
//声明:在声明数组变量时,需要指明数组类型和数组变量的名字。
int[] a;
//声明时没有将a初始化为一个数组,应该使用new运算符创建数组
a = new int[100];
在创建一个数组之后,数组中的元素全都被初始化为一个默认值。数字数组所有元素初始化为0;boolean数组元素初始化为false;对象数组元素则初始化为null。需要对数组中的元素显示的再进行赋值操作。
1.4.2 foreach循环
如果需要依次对一个集合中的所有元素都进行处理操作,推荐使用foreach循环来进行处理,而不必为指定下标值而分心。能够使用foreach循环的集合表达式必须是数组或者是一个实现了Iterable接口的类对象。
//定义一个临时变量暂存集合中的每一个元素,并执行相应的语句
for(int element: a){
System.sot.println(element);
}
1.4.3 Arrays类的常用API:
该类包含用于操作数组的各种方法(如排序和搜索)。如果指定的数组引用为空,则该类中的方法都抛出一个NullPointerException
,除非另有说明。
-
static<T> List <T> asList(T... a)
返回由指定数组支持的固定大小的列表。
-
binarySearch(Object[] a, Object key)
使用二叉搜索算法搜索指定对象的指定数组。
-
copyOf(T[] original, int newLength)
复制指定的数组,用空值截断或填充(如有必要),以便复制具有指定的长度。 -
copyOfRange(T[] original, int from, int to)
将指定数组的指定范围复制到新数组中。 -
equals(Object[] a, Object[] a2)
如果两个指定的对象数组彼此 相等 ,则返回true
。 -
fill(Object[] a, int fromIndex, int toIndex, Object val)
将指定的对象引用分配给指定的对象数组的指定范围的每个元素。 -
fill(Object[] a, Object val)
将指定的对象引用分配给指定的对象数组的每个元素。 -
hashCode(Object[] a)
根据指定数组的内容返回哈希码。 -
sort(Object[] a)
对指定对象升序排列的阵列,根据natural ordering的元素。 -
toString(Object[] a)
返回指定数组的内容的字符串表示形式。
1.5 正则表达式初识
-
概念:正则表达式是用来匹配字符串的,可以被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。
-
基本匹配
正则表达式
hello
就会匹配字符串"hello",通过将正则表达式中的每个字符与需要匹配字符串的每个字符逐一匹配(模式匹配),来完成正则匹配。"hello" => Printing hello world
-
元字符
元字符是正则表达式基本组成元素,在正则表达式中有其独特的含义。