Java语言的一些基础知识(下)

目录

字符串

输入与输出

控制流程

大数

数组

字符串

从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String

//字符串"Java\u2122"由5个Unicode字符 J,a,v,a和 ™ 组成
String e ="";//an empty string
String greeting = "hello";

子串

String类的substring方法可以从一个较大的字符串中提取出一个子串。

Java字符串中的代码单元和代码点从0开始计数

String greeting = "hello";
String s = greeting.substring(0,3);//长度为后者减去前者,即3-0=3
//substring从0开始计数,直到3为止,但不包括3,这里输出的值是"hel"

拼接

Java语言允许使用 + 号连接(拼接)两个字符串。

当一个字符与一个非字符的数据进行拼接时,后者会转换为字符串(任何一个Java对象都可以转换为字符串),这种特性通常用在输出语句中。

如果需要把多个字符串拼接在一起,用一个界定符分隔,可以使用静态join方法

String a = "Just";
	String b = "Beefcake";
    String c = a + b;
    System.out.println(c);//输出结果为JustBeefcake

	int age = 20;
    String K = "ThatYear" + age;
    System.out.println(K);//输出结果为ThatYear20

	String all = String.join("/","handsome","brilliant","smart");
    System.out.println(all);//输出结果为handsome/brilliant/smart

不可变字符串

String类中没有提供修改字符串中某个字符的方法,所以Java文档中间String类对象称为是不可变的。如此便体现出一个优点:编译器可以让字符串共享。

如需要将上述代码中 b 的值改变为"Beef!",不能直接将它的后面四个字符修改为’!’,这里可以使用上面讲过的字符串的拼接。

检测字符串是否相等

可以使用equal方法检测两个字符串是否相等,如果两个字符串相等,则返回true,否则,返回false。

String m = "hello";
        String n = "hello";
        boolean b =  m.equals(n);
		boolean c =  "hello".equals(n);//字符串可以是变量,也可以是常量
        System.out.println(b);//输出结果为true
 		System.out.println(c);//输出结果为true

注意:一定不要使用"=="运算符去检测两个字符是否相等! 这个运算符只能够确定两个字符串是否存在同一个位置上。

空串与Null串

空串""是长度为0的字符串,它是一个Java对象,有自己的串长度(0)和内容(空)。

String变量还可以存放一个特殊的值,名为null,表示目前没有任何对象与该变量关联。

if(str.length()==0)或if(str.equals(""));//检验字符串是否为空
if(str == null)或if(str.length() != 0 && str != null)//检验字符串既不为空也不为Null

输入与输出

读取输入

将输出打印到"标准输入流"(即控制窗口)是一件很容易的事情,只要调用System.out.println即可。

读取"标准输入流"就不是一件很简单的事情了。要从控制台输入,首先要构造一个与"标准输入流"System.in关联的Scanner对象。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("what is you name?");
        String name = in.nextLine();//输入行中可能包含空格,所以要用nextLine()方法
        System.out.println(name);
        String firstName = in.next();
        System.out.println(firstName);
        String lastName = in.next();
        System.out.println(lastName);
    }
//输出结果为:
XiHai Shenge//输入
XiHai Shenge//输出
XiHai Shenge//输入
XiHai//输出
Shenge//输出
    //上面第二次采用next()输入时,中间包含了空格,第二次输入就此中断,空格之后就是第三次输入

格式化输出

Java 5 沿用了C语言函数库中的printf方法,每一个以%字符开始的格式说明符都用相应的参数代替,格式说明符尾部的转换符指示要格式化的数据的类型:

转换符

类型

示例

f

浮点数

5.33

c

字符

A

s

字符串

xiHai

d

十进制整数

500

o

八进制整数

237

x

十六进制整数

8f

e

指数浮点数

1.59e+01

n

与平台有关的换行符。

另外,我们经常会看到在语句中会出现这样的字段"%8.2f",这表示的是所要输出的数据的宽度为8个字符,另外精度为小数点后2个字符。

public static void main(String[] args) {
        System.out.printf("%.3f\n", 10.0 / 3.0);//3.333
        System.out.printf("%tF\n", new Date());//2021-03-23
    }
//tF这里用到了日期和时间的转换符,大家可自行翻阅相关书籍

文件输入与输出

请自行搜索数据流和File类的相关知识和用法

控制流程

Java 的控制流程结构与C/C++的流程控制一样,只有很少例外情况。Java中没有goto语句,但break语句可以带标签,可以利用它从内层循环跳出。

块作用域

块(即复合语句)是指由若干条Java语句组成的语句,并用一对大括号括起来。块确定了变量的作用域,并且块可以嵌套使用。但是不能再嵌套的块中声明同名的变量。

条件语句

在Java中条件语句的格式为if(aondition) {statement1;....;}else{statement5;......},这里的条件必须用小括号括起来,可单独用if语句,y也可if else语句,还可以进行嵌套使用。

循环

for 循环:

初始表达式可以省略,但必须保留分号(😉,条件表达式一般不可省略,极有可能造成无限循环。

循环表达式也可以省略,但循环体中要有能够使循环变量中能够正常结束的条件。

for循环确定了循环次数,而while/do while没有

初始表达式,循环表达式可以使用逗号表示,如初始化多个变量等。

if(初始表达式;条件表达式;循环变量表达式){
    循环语句;
}

while循环:

在最前面检验循环条件,因此循环体中的代码有可能一次都不执行。

while(条件表达式){
    循环语句;
    循环变量表达式;
}

do while循环:

这种循环语句先执行语句,再检测条件,循环中语句必执行一次。

do{
    循环语句;
}while(条件表达式);

多重选择语句:switch语句

在处理多个选项是,使用if/else语句显得有些笨拙,Java中提供了与C/C++中一样的switch语句。

switch语句从与选项值(常量表达式)相匹配的case标签开始执行直到遇到break语句或执行到switch语句的结束为止为止。如果没有相匹配的case标签,而又default子句,就执行这个子句。

在case语句末尾没有break;将会接着执行下一个case语句。

switch(表达式){
    case 常量表达式:
        语句序列;
        break;
    case 常量表达式:
        语句序列;
        break;
    ......
}

中断控制流程的语句

break 语句

public static void main(String[] args) {
        int month = 3;
        while(month <12) {
            int value = 12 - month;
            System.out.println("New Year's Day is still " + value + "months away!");
            if (month == 6) {
                System.out.println("Let's take a summer vacation");
                break;//不带标签的break语句,跳出循环
            }
            month++;
        }
    }
public static void main(String[] args) {
        int m = 0;
        int n = 0;
        label://用冒号
        while(true){
            System.out.println("循环1");
            while(true){
                System.out.println("循环2");
                while(true){
                    System.out.println("循环3");
                    if ( m*n == 36){
                        break label;//带标签的break语句,跳转到标记处
                    }
                    n++;
                    m++;
                }
            }
        }
    }

continue 语句

将控制转移到最内层循环的首部。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        for (int count = 1;count <= 10;count++){
            System.out.println("请输入一个正数");
            int n = in.nextInt();
            if (n < 0)continue;//continue跳转到count++
            int sum = 0;
            sum += n;
            System.out.println(count);
        }
    }
/*控制台的输出结果为
请输入一个正数
-2
请输入一个正数
-1
请输入一个正数
0
3*/

大数

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中两个很有用的类:BigInteger和BigDecimal,这两个类可以处理包含任何长度数字序列的数值。BigInteger实现任何精度的整数运算,BigDecimal实现任何精度的整数运算。

BigInteger a= BigInteger.valueOf(100);//静态valueOf方法将普通数值转换为大数
BigInteger reallyBig = new BigInteger("1232423421345465768983766876598978609");
//对于更大的数,可以使用一个带字符串参数的构造器
BigInteger b= BigInteger.valueOf(260);
BigInteger c = a.add(b);//c = a + b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));//d = c*(b+2)

不能使用算术运算符处理大数,而是要使用大数类中的add和multiply方法

数组

数组存储相同类型的数列。

声明数组

数组是一种数据结构,用来存储同一类型值的集合,通过数组下标可以访问数组中的每一个值。

在声明数组时,需要指出数组类型和数组变量名字。如int[] a 或 int a[],但是这只是声明了变量a,而没有将a初始化为一个真正的数组,应该使用new操作符创建数组。

int[] a = new int[];//声明并初始化一个可以存储100个整数的数组
int[] smallPrimes = {2,3,4,5,6,7,8,9};//简写形式
new int[] {23,45,37,89}//匿名数组
smallPrimes = new int[] {23,45,37,89}//重新初始化一个数组而无需创建新变量

还有一种创建数组对象并同时提供初始值的简写形式,如上smallPrimes。这里不需要使用new,也不需要指定长度。

还可以声明一个匿名数组。

在数组中允许有长度为0的数组,它与null并不一样。访问数组元素。

访问数组元素

创建数组元素时,所有元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则会初始化为一个特殊的值null,表示这些元素还未存放任何对象。

public static void main(String[] args) {
        int[] a = new int[10];
        for (int i = 0; i < 10; i++) {
            a[i] = i;//数组的遍历和赋值
            System.out.println(a);//输出数组元素的首地址
            System.out.println(a[i]);//输出数组元素的值
        }
    	int count = a.length;//获取数组中元素个数,即数组长度
        System.out.println(count);
    
    }

for each 循环

增强for循环,可以用来依次处理数组中的每一个元素,而不必考虑指定下标志

格式:for(variable: collection) statement

其中collection这一集合表达式必须是一个数组或一个实现了Iterable接口的类对象。

public static void main(String[] args) {
        int[] a = new int[10];
        for (int element :
                a) {
            System.out.println(element);//输出10个数都是独占一行且值为0
        }
    }

for each循环更加简洁、更不易出错,不必为下标的起始值和终止值而操心。

多维数组

多维数组使用多个下标访问数组元素,适用于表示表格或更加复杂的排列形式。

二维数组的定义格式为:<类型标识符> 数组名[行元素个数][列元素个数],可以利用循环嵌套的方式对其进行遍历和赋值。

for each 循环语句不能自动处理二维数组的每一个元素,它会循环处理行,要想处理整个数组,同样需要嵌套。

三维数组也是这样的处理方式。