JavaSE基础

Java中的数据类型

  • 数据类型

    • 引用数据类型

      • 类(class)
      • 接口(interface)
      • 数组
      • 枚举(enum)
      • 注解(Annotation)
    • 基本数据类型

      • 字符型(char)
      • 布尔型(boolean)
      • 数值型
        • 整数类型(byte,short,int,long)
        • 浮点类型(float,double)

整数类型变量

类型名 占用空间 取值范围
byte 8位(1个字节) -2^7 ~ 2^7-1
short 16位(2个字节) -2^15 ~ 2^15-1
int 32位(4个字节) -2^31 ~ 2^31-1
long 64位(8个字节) -2^63 ~ 2^63-1

注意:在为一个long类型的变量赋值时,所赋值的后面要加上一个字母“L”(或小写“l”)

整数类型的数据,有二进制、八进制、十进制和十六进制4种。

  • 二进制:二进制数值前面要以0b或0B开头,如:0b01101100、0B10110101。
  • 八进制:以0开头,并且其后由0 ~7范围(包括0和7)内的整数组成的数字序列,如:0342。
  • 十进制:由数字0~9范围(包括0和9)内的整数组成的数字序列。如:198。
  • 十六进制:以0x或者0X开头,并且其后由09、AF(包括0和9、A和F)组成的字符序列,如:0x25AF。

浮点数类型变量

类型名 占用空间
float 32位(4个字节)
double 64位(8个字节)

注意:一个小数会被默认为double类型的值,在为一个float类型的变量赋值时一定要加上字母“F”(或者小写“f”),而为double类型的变量赋值时,可以在所赋值的后面加上字符“D”(或小写“d”),也可以不加

字符类型变量

char类型的字符变量占用2个字节

char c = 'a';           // 为一个char类型的变量赋值字符'a'
char ch = 97;           // 为一个char类型的变量赋值整数97,相当于赋值字符'a'

变量的类型转换

自动类型转换

byte>short&char>int>long>float>double 从低到高自动转换

byte b = 3;
int x = b;           // 程序把byte类型的变量b转换成了int类型,无需特殊声明
double y = x;    	 // 将int类型的变量x转换成double类型,无需特殊声明

强制类型转换

当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。

目标类型  变量名 = (目标类型)值;

注意:有精度丢失的问题

原因分析:出现丢失精度的原因是,变量b为int类型,在内存中占用4个字节,而byte类型的数据在内存中占用1个字节,当将变量b的类型强转为byte类型后,前面3个高位字节的数据已经丢失,这样数值就发生了改变。

表达式类型自动提升

变量在表达式中进行运算时,也有可能发生自动类型转换,如byte、short和char类型的变量在运算期间类型会自动提升为int,然后再进行运算。

例如:

public static void main(String[] args) {
   
	byte a = 10;
	short b = 20;
	char c = 'A';  // 字符 'A' 的 ASCII 值是 65

	// byte、short、char 会自动转换为 int 类型进行运算
	int result = a + b + c;
	System.out.println("结果是: " + result);  // 输出结果为 95
}

final常量

final 常量类型 常量名 [= 初始值];

常量有三种类型:静态常量、成员常量和局部常量。实例代码如下。

public class HelloWorld {
   
    // 静态常量(属于类的常量,而不是某个对象的常量。它通常被声明为 static final)
    public static final double PI = 3.14;
    // 成员常量(属于对象实例的常量,通常用 final 关键字声明)
    final int y = 10;
    public static void main(String[] args) {
   
        // 局部常量(方法内部定义的常量,通常用 final 关键字声明)
        final double x = 3.3;
    }
}
//常量方法:该方法不能被子类重写
public static final void a(){
   }
//常量类:表示这个类不能被继承,如:String、Math、Integer等。
public final class Demo02 {
   }

final的问题

final int A = 5; //锁定
A = 6; //错
final Point A = new Point(3,5); //锁定
A.x = 30; //对
A = new Point(5,6); //错
A = null; //错

常见转义字符

  • \r :将光标定位到当前行的开头,不会跳到下一行。
  • \n :表示换行,换到下一行的开头。
  • \t :表示制表符,将光标移到下一个制表符的位置,就像在文档中用Tab键一样。
  • \b :表示退格符号,就像键盘上的Backspace。
  • \‘ :表示单引号字符,
  • \“ :表示双引号字符。比如"he says,“thank you”."。
  • \ \ :表示反斜杠转义字符,由于在Java代码中的斜杠(\)是转义符,因此需要表示字面意义上的\,就需要使用双斜杠\ \。

Java中的运算符

算术运算符

注意:

  • 自增(++)和自减(–)的运算,如果运算符(++或–)放在操作数的前面则是先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面则是先进行其他运算再进行自增或自减运算。
  • 除法运算,当除数和被除数都为整数时,得到的结果也是一个整数;如果除法运算有小数参与,得到的结果会是一个小数。
  • 在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。

赋值运算符

比较运算符

逻辑运算符

运算符 运算 范例 结果
& a & b a和b都为true,结果为true,否则为false
| a|b a和b中只要有一个为true,则结果为true,否则为false
^ 异或 A^B a与b不同,结果为true,否则为false
! !A 若a为false,结果为true,否则相反
&& 短路与 a&&b a和b都为true,结果为true,否则为false
|| 短路或 a||b a和b中只要有一个为true,则结果为true,否则为false

**“&”和“&&”的区别:**在使用“&”进行运算时,不论左边为true或者false,右边的表达式都会进行运算。如果使用“&&”进行运算,当左边为false时,右边的表达式不会进行运算。

条件运算符

也称为三元运算符(或三目运算符)

(boolean_expr) ? true_statement : false_statement;

运算符的优先级

优先级 运算符
1 . [] ()
2 ++ – ~ !
3 * / %
4 + -
5 << >> >>>
6 < > <= >=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 = *= /= %= += -= <<= >>= >>>= &= ^=

选择结构语句

if条件语句

if (判断条件1) {
   
    执行语句1
} else if (判断条件2) {
   
    执行语句2
}
...
else if (判断条件n) {
   
    执行语句n
} else {
   
    执行语句n+1
}

switch条件语句

说明:与if条件语句不同的是,switch 控制表达式结果类型只能是byte、short、char、int、enum枚举以及String类型,而不能是boolean类型。

switch (控制表达式){
   
      case 目标值1:
            执行语句1
            break;
      case 目标值2:
	  	执行语句2
	  	break;
     	...
      case 目标值n:
	  	执行语句n
	  	break;
      default:
	  	执行语句n+1
	  	break;
}

规则: switch语句将控制表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,会执行对应case后的执行语句,并通过break关键字跳出该switch语句;如果搜索完所有case中的目标值仍没找到任何匹配的值,就会执行default后的语句。

循环结构语句

while

while(循环条件){
   }

do…while

do {
   } while(循环条件);

区别:while是先判断条件后执行循环体,而do…while会无条件执行一次循环体后再判断条件。

for循环语句

for(初始化表达式; 循环条件; 操作表达式){
   }

break语句

当它出现在循环结构语句中时,作用是跳出当前循环结构语句,执行后面的代码。

continue语句

它的作用是终止本次循环,执行下一次循环。

数组

一维数组

定义:

int[] ids = new int[100];   
String[] names = new String[]{
   "张三","tom",...};  
Object[] object = {
   "张三","tom",...}; 

多维数组

1.指定二维数组的长度和每个数组的元素个数。

int[][] arr = new int[3][4];

说明:上面的代码相当于定义了一个3*4的二维数组,这个二维数组的长度为3,可以将它看成3个int[]类型的一维数组,每个一维数组中的元素又是一个长度为4的一维数组。

2.只指定二维数组的长度,不确定每个数组的元素个数。

 int[][] arr = new int[3][];

说明:第二种方式和第一种类似,只是数组中每个元素的长度不确定。

3.直接使用嵌套大括号“{}”,对二维数组初始化赋值。

int[][] arr = {
   {
   1,2},{
   3,4,5,6},{
   7,8,9}};

Arrays工具类

Arrays 类里均为 static 修饰的方法, Arrays.xxx(xxx) 的形式调用方法。

1)int binarySearch(type[] a, type key)

使用二分法查询 key 元素值在 a 数组中出现的索引,如果 a 数组不包含 key 元素值,则返回负数。调用该方法时要求数组中元素己经按升序排列,这样才能得到正确结果。

2)int binarySearch(type[] a, int fromIndex, int toIndex, type key)

这个方法与前一个方法类似,但它只搜索 a 数组中 fromIndex 到 toIndex 索引的元素。调用该方法时要求数组中元素己经按升序排列,这样才能得到正确结果。

3)type[] copyOf(type[] original, int length)

这个方法将会把 original 数组复制成一个新数组,其中 length 是新数组的长度。如果 length 小于 original 数组的长度,则新数组就是原数组的前面 length 个元素,如果 length 大于 original 数组的长度,则新数组的前面元索就是原数组的所有元素,后面补充 0(数值类型)、false(布尔类型)或者 null(引用类型)。

4)type[] copyOfRange(type[] original, int from, int to)

这个方法与前面方法相似,但这个方法只复制 original 数组的 from 索引到 to 索引的元素。

5)boolean equals(type[] a, type[] a2)

如果 a 数组和 a2 数组的长度相等,而且 a 数组和 a2 数组的数组元素也一一相同,该方法将返回 true。

6)void fill(type[] a, type val)

该方法将会把 a 数组的所有元素都赋值为 val。

7)void fill(type[] a, int fromIndex, int toIndex, type val)

该方法与前一个方法的作用相同,区别只是该方法仅仅将 a 数组的 fromIndex 到 toIndex 索引的数组元素赋值为 val。

8)void sort(type[] a)

该方法对 a 数组的数组元素进行排序。

9)void sort(type[] a, int fromIndex, int toIndex)

该方法与前一个方法相似,区别是该方法仅仅对 fromIndex 到 toIndex 索引的元素进行排序。

10)String toString(type[] a)

该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号,和空格隔开。

public class ArraysTest {
   
    public static void main(String[] args) {
   
        // 定义一个a数组
        int[] a = new int[] {
    3, 4, 5, 6 };
        // 定义一个a2数组
        int[] a2 = new 

你可能感兴趣的:(javaSE,java)