一、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程序设计环境
-
JDK、JRE、JVM关系
JDK(Java Development Kit) > JRE(Java Runtime Environment) > JVM(Java Virtual Machine)
-
JDK目录
bin、demo、docs、include、jre、lib、src,Mac中通过
/usr/libexec/java_home -V
查看Java版本以及安装目录 -
程序基本结构
public class ClassName { public static void main(String[] args) { program statements } }
源程序类名要与文件名保持一致,main函数必须声明为public static
-
命令行编译与运行
编译命令:javac xx.java ,生成xx.class字节码文件;
运行命令: java xx(不需要带class);
-
IntelliJ IDEA
Win破解版安装见intellij idea 2018.1.6中文破解版 附注册码汉化包。软件装上后还不能直接就用,还需要下载JDK并配置。
二、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;
-
大数值
BigInteger
和BigDecimal
(Java中没有设计重载运算符,因而不能使用+ *
,而使用add和muiltiply方法替代)
-
-
运算符
- Java的算数运算符、关系运算符、位运算符、逻辑运算符、赋值运算符与C/C++基本一致,Java多了一种类型判断运算符
instanceof
,在运行时指出对象是否是特定类的一个实例 - Java中
>>>
使用0填充高位,>>
使用符号位填充高位,没有>>>
运算;而C/C++中>>
无法确定是算术移位(扩展符号位),还是逻辑移位(高位填0) - 不同于C/C++,Java没有
,
运算符,但在for中可使用,
分隔表达式列表 - 枚举类型:Java在枚举类中可以定义变量、构造函数和方法,而C++的枚举类不可以!
- Java的算数运算符、关系运算符、位运算符、逻辑运算符、赋值运算符与C/C++基本一致,Java多了一种类型判断运算符
-
字符串
-
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不允许重定义!
- 与C/C++控制流比较,没有goto,但
-
数组
- 定义:
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();
}
}