java的基本程序设计结构

第一个程序

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println("hello,world");
    }
}

java的源代码的文件名必须和公共类的名字相同,切以.java结尾。

  • 编译:javac Main.java 得到二进制文件Main.class
  • 执行:java Main打印hello world

或者直接java Main.java执行。

数据类型

基本和C++相同,不同的之处: java中的布尔类型boolean是不支持数值转换的,即x为数值,if(x)这样的代码是不能通过编译的。

变量和常量

变量

java中并不区分变量的声明和定义,且变量声明后必须显式赋值,使用未赋值的语句是错误的,如:

 double x;
 System.out.println(x);

java 10开始,可根据变量初始化值推断它的类型,只需借助关键字var: var x = 1.2;

常量

final关键字指示常量,表示变量只能被赋值一次,之后不能被更改,常量习惯上大写。

 public static final double PI = 3.14;

枚举类型

enum Color{RED,BLUE,GREEN};
Color cr = Color.BLUE;

运算符

数学函数

Math类包含很多数学函数,使用方法Math.funcion(),其中常用的函数有:

  • sqrt(): 开方
  • pow():幂运算
  • 三角函数:sin, cos, tan, atan...
  • 指数函数:exp, log,log10

非常接近\(\pi\)\(e\)的常量,分别为Math.PIMath.E

位运算

算术移位:用符号位填充高位,<<,>>

逻辑移位:用0填充高位,<<<, >>>

字符串

基础

  • 子串: str.substring(i,j), str索引[i, j)的字符组成的子串
  • 拼接:+适用于短小且频率不高的字符串拼接,因为效率低, String.join(str1,str2,str3)效率很高,或者转为StringBuilder,用对应的append方法
String s1 = "abcedfg";
String substr = s1.substring(1,3);   //bc
String s2 = "a".repeat(3);     // aaa java11 支持repeat
String s3 = "a" + "b" + "c";     // aaa
String s4 = String.join("aa","bc","cd");     // aaa

java中字符串的一个重要特点:不可变性,即不能修改字符串中的某个字符,如果非要修改呢?只能让其指向一个新的字符串。不可变性使得字符串间可以共享。JAVA(1)【基础类型】String类型的字符串池 - 小拙 - 博客园 (cnblogs.com)

  • 判断是否相等: s1.equals(s2), java中字符串如果用==判断,实际比较的是地址

  • 空串与null串: 长度为0的串为空串,null串表示没有任何对象和自己关联,判断一个字符串既不是空串也不是null串:

     if(s != null && s.length() != 0)
    

常用api

除了上面的,其他常用的api:

  • char charAt(int index): 返回给定位置的代码单元
  • empty():是否为空
  • startsWith(String prefix):是否以prefix作为前缀
  • endsWith(String suffix):是否以suffix作为后缀
  • length():长度
  • toLowerCase()/toUpperCase:转小/大写

StringBuilder类

拼接字符串append的效率高,对应的一些api:

  • length():长度
  • append():可添加单个字符或者字符串
  • setCharAt(int i, char c):将第i个代码单元设置为字符c
  • insert(int offset, String str/ char c):在索引offset后插入字符串str或者单个字符c
  • delete(index1, index2):删除索引[index1,index2)之间的字符串,并返回残余的字符串
  • toString():返回String类型的对象

输入输出

读取输入

 Scanner in = new Scanner(System.in);
 String s1 = in.nextLine();
 String s2 = in.next();  //以空格为分界
 int num = in.nextInt();  //in.nextDouble

检查是否还有输入:boolean hasNext() / hasNextInt()/hasNextDouble()

格式化输出

double a = 1 / 3.0;
System.out.printf("%8.2f",a); //总字符长度为8,精确至小数点后2位,即前面留了5个空格

文件输入

String path = "D:/Files/桌面文件/1.txt";
Scanner in = new Scanner(Path.of(path), StandardCharsets.UTF_8);
String s = in.nextLine();
System.out.println(s);

循环

和C++的break功能更强的是,java中break语句可以带标签,如多重循环中,break加上标签可直接跳转到最外层。标签放在循环最外层的前面,并加上冒号。

 public static void main(String[] args) {
            label:
            for(int i=0;i<5;i++) {
                for(int j=0;j<5;j++) {
                    if(j==3) {
                        break label;
                    }
                    System.out.print("i= "+i +" j= " +j + "\n");
                }
            }
            System.out.println("This is end");
    }
//输出
i= 0 j= 0
i= 0 j= 1
i= 0 j= 2
This is end

大数

BigDecimal a = BigDecimal.valueOf(100);
BigInteger b = new BigInteger("12466456663875366527162366515632664357");
BigInteger c = new BigInteger("12466456663875366527162366515632664357");
System.out.println(b.add(c));
System.out.println(b.subtract(c));  //减法
System.out.println(b.multiply(c));
System.out.println(b.divide(c));
System.out.println(b.mod(c));

BigDecimal 中除法除不尽会报错,所以除不尽的情况要指定舍去方式:

public class Main {
    public static void main(String[] args) {
        BigDecimal a = BigDecimal.valueOf(1);
        BigDecimal b = BigDecimal.valueOf(3);
        System.out.println(a.divide(b, 2, RoundingMode.HALF_UP));   //保留两位小数,并四舍五入,0.33
        System.out.println(a.divide(b, 2, RoundingMode.CEILING));  //天花板除法 0.34
        System.out.println(a.divide(b, 2, RoundingMode.FLOOR));   //地板除   0.33
    }
}

数组

声明数组

public class Main {
    public static void main(String[] args) {
        int[] a = new int[10];
        int [] b = new int[]{1,2,3};
        int [] c = {1,4,6};
    }
}

数组拷贝

java的数组声明:int[] a = new int[100]等价于C++里面的int* a = new int[100],因此=赋值实际上只是引用同一个数组,如果想拷贝一份,则应该用Arrays.copyOf()

public class Main {
    public static void main(String[] args) {
        int [] c = {1,4,6};
        int [] d = c;
        c[1] = 9;
        System.out.println(c);
        System.out.println(d);
        for(int x:d){
            System.out.print(x +"\t");
        }
    }
}
//
[I@5fd0d5ae
[I@5fd0d5ae
1	9	6
public class Main {
    public static void main(String[] args) {
        int [] a = {1,4,6};
        int [] b = Arrays.copyOf(a,5);  //从数组a的起始复制,第二个参数为新数组的总长度,不够补0
        a[1] = 9;
        System.out.println(a);
        System.out.println(b);
        for(int x:b){
            System.out.print(x +"\t");
        }
    }
}
//
[I@5fd0d5ae
[I@2d98a335
1	4	6	0	0

用于数组的api

用法:Arrays.加上下面的api:

  • sort(arr);采用的是快速排序

  • static String toString(arr):[1, 7, 5, 3, 6, 2, 0]

  • copyOfRange(arr, from, to): 复制arr的区间[from, to)的数据

  • binarySearch(arr, value):在有序数组中寻找value,并返回对应的下标r,如果找不到,则-r-1为应该插入的位置

  • fill(arr,value):将数组全部用value填充

  • equals(arr1,arr2):判断两个数组是否相等(长度,对应的元素都是相等的才返回true)

多维数组

java多维数组可以是不规则的,

public class Main {
    public static void main(String[] args) {
        int[][] a = {{1,2,3},{2,3}};
        int[][] b = new int[2][3];
        System.out.println(a[1][1]);
        System.out.println(Arrays.deepToString(a));  //toString无法处理多维数组
    }
}
posted @ 2022-08-13 21:14  wenchu1995  Views(73)  Comments(0Edit  收藏  举报