为工信部第六届全国计算机信息大赛准备 ,主要复习以下内容。
Java基础及环境:JDK发展历史,不同版本的进阶内容。Java程序的编写、编译、调试。
Java程序设计基础:常量和变量的概念,声明方式和作用域。基本数据类型的定义和概念。Java基本数据类型的转换。
Java字符串处理:String、StringBuffer和StringBuilder的基本概念和使用。正则表达式的讲解和使用。
Java数字和日期处理:数学相关类、随机数生成相关类、数字格式化以及各种类型数字的运算和转换。Java日期和时间的处理。
Java数组和基本排序算法:一维数组、二维数组和多维数组的基本概念及应用。
Java类和对象。Java类的封装、继承和多态。Java异常处理。Java集合、泛型和枚举。Java反射机制。Java输入输出流和文件操作。Java多线程编程。Java网络编程。Java图形用户界面。
Java数据库编程:JDBC的基本API。
1. JDK发展历史
1995年5月23 java(原名Oak)诞生,并且在SunWorld大会上正式发表了java1.0版本。
1996年1月23 JDK1.0发布Java语言有了第一个正式版本的运行环境。JDK1.0提供了一个纯解释执行的Java虚拟机的实现(Sun class VM)。JDK1.0的代表技术:JVM,Applet,AWT.
1997年2月19日,JDK1.1,新特性:JAR文件格式、JDBC、JavaBean、RMI、内部类(Inner class)、反射(Reflection)
1998年12月4日,JDK1.2,新特性:基础体系拆分:J2SE(面向桌面应用程序开发)、J2EE(面向企业级应用开发程序开发)、J2ME(面向手机等移动终端开发),技术:EJB、Java Plug-in、JavaIDL 、Swing、JIT(Just In Time)编译器.
2000年5月8日JDK1.3:使用CORBA IIOP实现RMI的通信协议,改进Java2D,添加JavaSound类库。
2002年2月13日JDK1.4 ,新特性:正则表达式,异常链,NIO,日志类,XML解析器,XLST转换器。
2004年9月30日,JDK1.5,新特性:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环。
2006年12月11日,JDK1.6,新特性:提供动态语言支持、提供编译API和卫星HTTP服务器API,改进JVM的锁,同步垃圾回收,类加载。
2009年2月19日JDK1.7,新特性:提供GI收集器、加强对非Java语言的调用支持(JSR-292,升级类加载架构。
2014 年 3 月 18 日 JDK1.8新特性:Lambda 表达式、方法引用、默认方法、新工具、Stream API、Date Time API 、Optional 类、Nashorn, JavaScript 引擎。
2017年9月21日jdk9.0,新特性:模块系统、HTTP 2 客户端、多版本兼容 JAR 包、私有接口方法、改进的 Stream API、响应式流(Reactive Streams) API:
2018年3月21日jdk10,新特性:var 局部变量类型推断、统一的垃圾回收接口
2018年9月25日jdk11,新特性:HTTP客户端(标准)、无操作垃圾收集器。首个LTS版本
2019年3月19日jdk12:新增一个名为 Shenandoah 的垃圾回收器、扩展switch语句的功能、改进 G1 垃圾回收器
2. Java程序设计基础
2.1 变量和常量的概念
通常来说,在程序运行中,可以被赋值改变的一般被称为变量,在被final修饰后,会变成一个常量,在运行过程中不能发生任何的值改变。
2.2 Java变量的声明
在 Java 程序设计中,每个声明的变量都必须分配一个类型。声明一个变量时,应该先声明变量的类型,随后再声明变量的名字。声明变量的同时可以为变量赋值,也可以声明以后再赋值。在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量。为了操作方便,给这个空间取了个名字,称为变量名,内存空间内的值就是变量值。所以,申请了内存空间,变量不一定有值,要想变量有值,就必须要放入值。也就是一个初始化行为。包装对象都有默认的初始化值。
2.3 Java变量的作用域
一般的来说 ,就我自身理解分为两大块,一块是成员变量,一块是局部变量。成员变量比较好理解,是类的一部分,也就是定义在类中,方法外。可供全类使用。局部变量一般定义在方法体内,举例说明。
public class Illustrate {
// 成员变量,整个类中都可以使用
private String username;
// 成员变量,整个类中都可以使用
private Integer age;
// 成员变量,整个类中都可以使用
private Date birthday;
public void add() {
// 定义一个局部变量,在方法体内
int num = 10;
num += 1;
if (true) {
// 定义局部变量
int a = 5;
}
// 变量a是无法在if方法体外访问到的,超出了他的作用于范围。只作用于当前方法体内
// 但是可以访问到num和成员变量
username = "张三";
age = 20;
}
}
2.4 数据类型的定义和概念
在Java中,分为两大类,一种为引用数据类型,一种为基础数据类型。
- byte
byte 数据类型是8位、有符号的,以二进制补码表示的整数,最小值是 -128(-2^7)、最大值是 127(2^7-1),默认值是 0;byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
例子:byte a = 100,byte b = -50;
2. short
short 数据类型是 16 位、有符号的以二进制补码表示的整数最小值是 -32768(-2^15)、最大值是 32767(2^15 - 1);Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;默认值是 0;
例子:short s = 1000,short r = -20000;
3. int
int 数据类型是32位、有符号的以二进制补码表示的整数,最小值是 -2,147,483,648(-2^31)、最大值是 2,147,483,647(2^31 - 1),一般地整型变量默认为 int 类型;默认值是 0 ;
例子:int a = 100000, int b = -200000;
4. long
long 数据类型是 64 位、有符号的以二进制补码表示的整数,最小值是 -9,223,372,036,854,775,808(-2^63)、最大值是 9,223,372,036,854,775,807(2^63 -1);这种类型主要使用在需要比较大整数的系统上;默认值是 0L;
例子: long a = 100000L,Long b = -200000L;
【L】理论上不分大小写,但是若写成【l】容易与数字【1】混淆,不容易分辩。所以最好大写;
5. float
float 数据类型是单精度、32位、符合IEEE 754标准的浮点数,float 在储存大型浮点数组的时候可节省内存空间,默认值是 0.0f;浮点数不能用来表示精确的值,如货币;
例子:float f1 = 234.5f;
6. double
double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数,浮点数的默认类型为double类型;double类型同样不能表示精确的值,如货币,默认值是 0.0d;
例子:double d1 = 123.4;
7. boolean
boolean数据类型表示一位的信息,只有两个取值:true 和 false,这种类型只作为一种标志来记录 true/false 情况;默认值是 false;
例子:boolean one = true;
8. char
char类型是一个单一的 16 位 Unicode 字符,最小值是 \u0000(即为0)、最大值是 \uffff(即为65,535),char 数据类型可以储存任何字符;
例子:char letter = ‘A’;
2.5 Java基本数据类型的转换
Java要求=等号左边和=等号右边的类型要一致,如果不一致,就需要进行数据类型转换。Java中不同的类型之间,在满足数据兼容的条件下可以实现转换。Java的数据类型转换,大致有如下几种转换方案:
-
自动类型转换:容量小的类型自动转换为容量大的数据类型;
-
强制类型转换:容量大的数据类型转换为容量小的数据类型;
-
隐含强制类型转换(初始化):在变量初始化时,int类型会隐含强制转换成低级别的byte和short类型;
-
其他类型转换:包装类、字符串、基本类型直接的转换。
对基本类型来说,常见的数据转换方式包括自动类型和强制类型转换;对引用类型而言,只存在强制类型转换一种形式。
我们在进行类型转换时,无论自动和强制类型转换,都要遵循如下基本原则:
-
不能对boolean类型进行类型转换;
-
不能把对象类型转换成不相关的类对象;
-
把容量大的类型转换为容量小的类型时,必须使用强制类型转换;
-
类型转换过程中,可能会导致溢出或损失精度;
-
浮点数到整数的转换,是通过舍弃小数得到的,而不是四舍五入。
3. Java字符串
3.1 String类
String是一种引用数据类型,我们会用它来存储字符串,什么是字符串呢,和他的名字一样,就是一个个字符拼在一起,串成一串。如下代码
String str = "Hello World";
String的底层,其实就是一个个字符拼在一起,那么也就是说,底层是一个char数组。我们上面看到的Hello World实际上存储的时候是以这样的方式存储的。那一个个的char是怎么存储的,也就是通过字符集,ASCII码表,来进行存储的。
char[] str = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
如何验证他是正确的结论,在String类中,看源码。我们会看到这样的一行代码,说明了确实是由一个char数组来进行存储数据的。且说明不可变。(final)
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
}
且类上被final修饰过,说明类是没有办法被继承的。
3.1.1 String构造器
在String中,存在了不少的构造器,分别列出以下构造器,且做说明描述。
- public String(): 空构造器。
- public String(String original):把字符串常量值转换为字符串对象。
- public String(char value[]):把字符数组转为字符串对象。
- public String(char value[], int offset, int count): 把字符数组的一部分转为字符串对象。
- public String(byte ascii[], int hibyte, int offset, int count):把字节数组的一部分转换为字符串对象。
- public String(byte ascii[]): 把字节数组转换为字符串对象。
以代码的形式实现分别如下:
package oop;
public class ObjectContext {
public static void main(String[] args) {
// public String(String original):把字符串常量值转换为字符串对象。
String str1 = new String("Hello World");
// public String(char value[]):把字符数组转为字符串对象。
String str2 = new String(new char[] {'A', 'B', 'C'});
// public String(char value[], int offset, int count): 把字符数组的一部分转为字符串对象。
String str3 = new String(new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G'}, 0, 3);
// public String(byte ascii[], int hibyte, int offset, int count):把字节数组的一部分转换为字符串对象。
String str4 = new String(new byte[] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 3);
// public String(byte ascii[]): 把字节数组转换为字符串对象。
String str5 = new String(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
System.out.println("把字符串常量值转换为字符串对象: " + str1);
System.out.println("把字符数组转为字符串对象: " + str2);
System.out.println("把字符数组的一部分转为字符串对象: " + str3);
System.out.println("把字节数组的一部分转换为字符串对象:" + str4);
System.out.println("把字节数组转换为字符串对象: " + str5);
/*
把字符串常量值转换为字符串对象: Hello World
把字符数组转为字符串对象: ABC
把字符数组的一部分转为字符串对象: ABC
把字节数组的一部分转换为字符串对象:
把字节数组转换为字符串对象:
*/
}
}
3.1.2 String常用的判断方法
- boolean equals(Object obj):比较字符串的内容是否相同,区分大小写。
- boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写。
- boolean contains(String str):在一个字符串中是否包含另外一个字符串。
- boolean startsWith(String str):判断字符串是否以某个指定的字符串开头。
- boolean endsWith(String str):判断字符串是否以某个指定的字符结尾。
- boolean isEmpty():判断字符串是否为空。
以下是这些API代码实现的实际使用方式: