Java核心技术(卷1)笔记--01基础篇

一、Java基本常识

  • Java的11个特性

    • 简单性:可看作"纯净"版C++,剔除了C++中应用较少、难以理解、易于混淆的特性;没有头文件、指针、结构、联合、操作符重载、虚基类
    • 面向对象性:与C++主要不同点在于多继承
    • 解释型特性:同Python
    • 多线程:底层操作系统或线程库完成
    • 网络特性:依赖网络库,可轻松处理HTTP和FTP之类的TCP/IP协议
    • 健壮性:Java编译器可以检测出其他语言(如C/C++)中运行时才能够检测出的问题,以消除内存分配的错误以及防止内存泄漏
    • 可移植性:数据类型具有固定大小(不同于C/C++,不同平台数据类型大小不一);二进制数据以固定格式进行存储和传输;字符串使用Unicode格式存储
    • 安全性:防病毒、防篡改(防运行时堆栈溢出、防破坏内存、防未授权读写文件)
    • 体系结构中立性:编译器所生成的字节码文件可通过JVM在多种系统上运行;虚拟机的即时编译功能可将使用最为频繁的字节码翻译成机器码,以加快程序运行效率
    • 高性能特性:字节码在运行时刻快速地翻译成运行应用程序的特定CPU的机器码
    • 动态性:库中可以自由添加新方法和实例变量,而对客户端无任何影响;在Java中找出运行时类型信息十分简单
  • Java applet

    在网页上运行的Java程序

  • JavaScript

    原名LiveScript,其语法类似Java,但除此之外,两者无任何关系

  • Java版本

    JSE:Standard Edition JME:Micro Edition JEE:Enterprise Edition

总结:Java是一门面向对象的解释型、高性能语言,可移植性强、安全性高,具有强大的网络功能并支持多线程编程,较于C/C++其更加简单、健壮、动态性能强。

二、Java程序设计环境

二、Java基本程序设计结构

同C/C++,Java程序的基本结构也需要从注释、数据类型、变量、运算符、字符串、输入输出、控制流、数组几个方面进行说明

  • 注释:同C/C++

  • 8 种数据类型

    • Java中byte(8)、char(16)、short(16)、int(32)、long(64)、float(32)、double(64)
    • 区别于C++,Java中使用byte类型表示8位,使用boolean表示布尔类型,并且不能对布尔类型使用强制转换
    • Java中的原始数据类型里没有无符号的类型
    • char类型采用UTF-16编码(Unicode)
    • Java有一个称为"大数值"的可表示任意精度的算术包,但它并不是数据类型而是一个Java对象
  • 变量

    • Java中的变量只存在类中(静态变量、非静态变量以及局部变量),而C++的这些变量可以存在类外(全局变量)

    • Java中不区分变量的声明与定义

    • Java使用final限定常量(C++使用const),如果类中的多个方法需要使用同一常量可声明为类常量;如果一个常量被声明为public,那么其他类的方法也可使用该常量

      public static final double PI = 3.14;
      
    • 大数值BigIntegerBigDecimal(Java中没有设计重载运算符,因而不能使用+ *,而使用add和muiltiply方法替代)

  • 运算符

    • Java的算数运算符、关系运算符、位运算符、逻辑运算符、赋值运算符与C/C++基本一致,Java多了一种类型判断运算符instanceof,在运行时指出对象是否是特定类的一个实例
    • Java中>>>使用0填充高位,>>使用符号位填充高位,没有>>>运算;而C/C++中>>无法确定是算术移位(扩展符号位),还是逻辑移位(高位填0)
    • 不同于C/C++,Java没有,运算符,但在for中可使用,分隔表达式列表
    • 枚举类型:Java在枚举类中可以定义变量、构造函数和方法,而C++的枚举类不可以!
  • 字符串

    • String类:子串、拼接、不可变字符串(字符串不可被修改,而C/C++是可以修改的)、equals方法(不可使用==,C++可以使用==是因为重载了该运算符,而Java中==的操作更像是指针的处理方式)、空串(长度0内容空)与null(没有任何对象与该变量关联)、代码点与代码单元、API

    • 构建字符串

      StringBuilder builder = new StringBuilder();
      builder.append(ch);
      builder.append(str);
      String completedString = builder.toString();
      
  • 输入输出

    • 输入Scanner类(.nextLine .next .nextInt .nextDouble .hasNext .hasNextInt)
    import java.util.*;
    public class InputTest{
      public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String name = in.nextLine();
        System.out.println(name);
      }
    }
    //密码等读取使用Console类
    import java.io.*;
    Console cons = System.console();
    String usrname = cons.readLine("Use Name:");
    char[] passwd = cons.readPassword("Passwd:");
    
    • 格式化输出:System.out.printf同C/C++中printf用法;String.format同C/C++中sprintf格式化字符串
    • 文件输入输出(注意若文件名中有反斜杠,需要在反斜杠之前再加一个额外反斜杠)
    import java.nio.file.Paths;
    import java.io.PrintWriter;
    Scanner in = new Scanner(Paths.get("f.txt"));//相对JVM启动路径或绝对路径
    PrintWriter out = new PrintWriter("f.txt");
    String dir = System.getProperty("user.dir");//获取JVM启动路径
    
  • 控制流

    • 与C/C++控制流比较,没有goto,但break continue可以带标签跳出语句块( 不能跳入语句块);for each
    • C++中在嵌套的块中可以重定义一个变量,内层变量会覆盖外层变量,而Java不允许重定义!
  • 数组

    • 定义:int[] a = new int[100];(创建一个数字数组时,所有元素都初始化为0,布尔数组会初始化false,对象数组初始化为null);Arrays.toString(a)打印数组中所有值;Java允许数组长度为0;数组可以直接作为函数入参和出参
    //for each
    for(int ele :a)
      System.out.println(ele);
    
    • 初始化
    int[] s = new int[]{2,3,5};
    int[] s = {2,3,5};//不需要new
    new int[] {2,3,5};//匿名数组
    
    • 数组拷贝
    int[] l = s;//l s两个变量将引用同一个数组
    int[] copy = Arrays.copyOf(s,s.length);//数组所有值拷贝
    

    Java数组与C++数组在堆栈上区别很大,但基本上与分配在堆上的数组指针一样,即 int[] a = new int[10];//Java

    不同于int a[10];//C++

    而等同于int* a = new int[10];//C++

    Java中[]运算符被预定义为检查数组边界,而且无指针运算

    • 数组排序

    Arrays.sort使用了优化的快排算法

    • 多维数组

    for each不能自动处理二维数组的每一个元素,它是按照行即一维数组进行处理的;Java的二维数组与C/C++类似 int[][] arr = new int[3][];

    double[][] a;
    for(double[] row:a)
      for(double value:row)
        do something with value
    
    • 不规则数组

    Java实际上没有多维数组,只有一维数组;不规则数组即每一行长度不同;

    int[][] odds = new int[NMAX+1][];
    for(int n=0;n<=NMAX;n++)
      odds[n] = new int[n+1];
    for(int n=0;n<odds.length;n++)
      for(int k=0;k<odds[n].length;k++)
      {
        odds[n][k] = lotteryOdds;
      }
    
    • 数组实例
    class INTtoHex {
        public static void main(String[] args) {
            toHex1(65535);
        }
    
        //整数转16进制(查表法)
        private static void toHex1(int num) {
            if (num == 0) {
                System.out.println("0");
                return;
            }
            char[] chs = {
                    '0', '1', '2', '3',
                    '4', '5', '6', '7',
                    '8', '9', 'A', 'B',
                    'C', 'D', 'E', 'F'};
    
            char[] arr = new char[8];
            int pos = arr.length;
    
            while (num != 0) {
                int temp = num & 0x0f;
                arr[--pos] = chs[temp];
                num = num >>> 4;//>>>表示无符号右移
            }
    
            System.out.println("pos=" + pos);
            for (int x = pos; x < arr.length; x++) {
                System.out.print(arr[x]);
            }
        }
    	//非查表
        private static void toHex2(int num) {
            char[] arr = new char[8];
            int pos = arr.length;
    
            for (int x = 0; x < 8; x++) {
                int temp = num & 15;
                if (temp > 9) {
                    arr[--pos] = (char) (temp - 10 + 'A');
                } else {
                    arr[--pos] = (char) (temp + '0');
                }
                num = num >>> 4;
            }
            for (char x : arr) {
                System.out.print(x);
            }
            System.out.println();
        }
    }
    

三、几种排序的Java实现

public class Sort {
    public static void main(String[] args) {
        int[] arr = {1, 4, 2, 8, 0};

        bubbleSort(arr);
        myPrint(arr);

        selectSort(arr);
        myPrint(arr);

        insertSort(arr);
        myPrint(arr);

        quickSort(arr, 0, arr.length - 1);
        myPrint(arr);
    }

    private static void bubbleSort(int[] a) {
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a.length - 1 - i; j++) {
                if (a[j] > a[j + 1]) {
                    swap(a, j, j + 1);
                }
            }
        }
    }

    private static void selectSort(int[] a) {
        for (int i = 0; i <= a.length; i++) {
            int key = minElem(a, i);
            if (key != i) {
                swap(a, i, key);
            }
        }
    }

    private static void insertSort(int[] a) {
        for (int i = 1; i < a.length; i++) {
            int x = a[i];
            int j;
            for (j = i - 1; j >= 0 && a[j] > x; j--)
                a[j + 1] = a[j];
            a[j + 1] = x;
        }
    }

    private static void quickSort(int[] a, int low, int high) {
        if (low < high) {
            int m = partition(a, low, high);
            quickSort(a, low, m - 1);
            quickSort(a, m + 1, high);
        }
    }

    private static int minElem(int[] a, int i) {
        int k = i;
        for (int j = i + 1; j < a.length; j++) {
            if (a[k] > a[j])
                k = j;
        }
        return k;
    }

    private static int partition(int[] a, int i, int j) {
        int p = a[i];
        int m = i;
        for (int k = i + 1; k <= j; k++) {
            if (a[k] < p) {
                m++;
                swap(a, m, k);
            }
        }
        swap(a, m, i);
        return m;
    }
	//Java对普通类型的变量是不支持引用传递,因此C/C++的swap写法并不能适用于Java
    private static void swap(int[] a, int m, int n) {
        int tmp = a[m];
        a[m] = a[n];
        a[n] = tmp;
    }

    private static void myPrint(int[] a) {
        for (int x : a) {
            System.out.print(x + " ");
        }
        System.out.println();
    }
}

猜你喜欢

转载自blog.csdn.net/robothj/article/details/88914306