黑马程序员视频—学习笔记
作者:吉友良
院校:天津科技大学 计算机科学与信息工程学院
专业:软件工程
时间:2013 年 5 月
第 1 天 配置开发环境
JDK 安装完成后,要配置环境变量,配置过程如下。
1.1 配置 JAVA_HOME 环境变量
JAVA_HOME 配置位 jdk 安装路径,假如 jdk 安装路径为 C: \Java\jdk1.7.0_05,那么
JAVA_HOME 配置如下:
1.2 配置 PATH 环境变量
配置 path 就是将将 JDK 的 bin 目录添加到 PATH 变量中。在系统变量中找到“PATH”
变量,双击 PATH,在原 PATH 变量后添加 ;%JAVA_HOME%\bin
注意:前面的分号不能少(为了和其他 PATH 变量值分开)。
这样,Java 开发环境就算搭建完成了,classpath 不需要配置。
说明
请看 26.4 节
请看 26.7 节
第 2 天 JDK 新特性
2.1 JDK1.5 新特性
JDK1.5 新特性:
新特性
静态导入
可变参数
增强 for 循环
基本数据类型的自动拆箱与自动装箱
枚举
注解
泛型
第 4 天 数组
延伸:编译时,只检查语法错误。
4.1
4.1.1 数组定义的几种方式
//1.指定数组长度
int[] arr1 = new int[4];
//2.静态初始化, 不建议指定长度, 系统会自动计算长度
int[] arr2 = new int[] {1, 2, 3, 4, 5};
//上一行定义方式也可以如下
int[] arr3 = {1, 2, 3, 4, 5};
4.1.2 操作数组常见的几种异常
1. 下标越界:
ArrayIndexOutOfBoundsException
int[] arr = new int[3];
System.out.println(arr[3]);//数组越界
2. 空指针异常:
NullPointerException
int[] arr = new int[3];
arr = null;// arr这个引用已不在指向任何数组实体
System.out.println(arr[1]);
4.1.3 打印数组例子
public class ArrayTest {
public static void main(String[] args) {
int[] arr = new int[] {1,2,3,4,5};
printArr(arr);
}
//打印数组元素, 元素间用逗号隔开, 且最后一个元素末尾不能有逗号
public static void printArr(int[] arr) {
for(int i = 0; i < arr.length; i++) {
if(i != arr.length-1)
System.out.print(arr[i]+",");
else
System.out.println(arr[i]);
}
}
}
4.1.4 数组地址说明
int[] arr = new int[] {1,2,3,4,5};
System.out.println(arr);
//此次定义输出:[I@507d811a
//该值表示:int 类型数组,该数组地址为(16 进制):507d811a
4.4 选择排序
//选择排序
public static void selectSort(int[] arr)
{
int temp;
for(int i = 0; i < arr.length-1; i++) {
for(int j = i+1; j < arr.length; j++) {
if (arr[j] < arr[i]) {
//第i个元素和其他后面的的元素比
较,第一次比较完毕后,
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
//第一个位置取得最小值
}
}
}
}
其实 Java 提供了数字排序的功能,在实际开发中使用该功能,如下:
Arrays.sort(arr);//系统通过的排序
4.5 冒泡排序
/*
* 冒泡排序:
* 第一次比较完毕后,最值出现在数组末尾
*/
public class Day4_5 {
public static void bubbleSort(int[] arr) {
for(int i = 0; i < arr.length-1; i++) {
//arr.length-i:每一趟比较次数, -1:防止数组越界
for(int j = 0; j < arr.length-i-1; j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//打印数组
public static void printArray(int[] arr)
{
for(int i = 0; i < arr.length; i++) {
if(i != (arr.length-1))
System.out.print(arr[i]+",");
else
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
int[] arr = {10,2,1,9,8,6,7,5,4,3};
printArray(arr);
bubbleSort(arr);
printArray(arr);
}
}
优化代码:
public static void bubbleSort(int[] arr) {
for(int i = 0; i < arr.length-1; i++) {
//arr.length-i:每一趟比较次数, -1:防止数组越界
for(int j = 0; j < arr.length-i-1; j++) {
if(arr[j] > arr[j+1]) {
/*int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;*/
swap(arr, j, j+1);
}
}
}
}
//位置置换方法:无论哪个排序,都有位置置换的代码,可以将这部分相同的代
码抽取出来封装成一个方法,如下:
public static void swap(int[] arr,int a,int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
4.7 折半查找
4.7.1 获取某个值在数组的位置(即下标)
折半查找的前提:该数组是有序的
//返回key第一次出现在数组中的位置,如果返回-1,则说明数组中不存在key值
public static int getIndex(int[] arr,int key) {
for (int i = 0; i < arr.length; i++) {
if (key == arr[i])
return i;
}
return -1;
}
public static void main(String[] args) {
int[] arr = {10,2,1,9,8,6,7,5,4,3};
int key = 11;
int index = getIndex(arr, key);
System.out.println(index);
}
4.7.2 折半查找算法
方法 1:
public static void main(String[] args) {
int[] arr = {1,4,8,10,12,35};
int key = 14;
int index = binarySearch(arr, key);
System.out.println(index);
}
//折半查找
public static int binarySearch(int[] arr, int key) {
int min, mid, max;
min = 0;
max = arr.length-1;
mid = (min+max)/2;
//第一个角标
//尾角标
//中间角标
while (arr[mid] != key) { //当key不等于中间元素时
if (key > arr[mid])
min = mid+1;
else if (key < arr[mid])
max = mid -1;
if (min > max)//查找的元素不存在
return -1;
mid = (min+max)/2;
}
return mid;
}
方法 2:
public static void main(String[] args) {
int[] arr = {1,4,8,10,12,35};
int key = 10;
int index = binarySearch_2(arr, key);
System.out.println(index);
}
//折半查找方法2:
public static int binarySearch_2(int[] arr, int key) {
int min = 0, max = arr.length-1, mid;
while (min <= max) {
mid = (min + max)/2;
if(key > arr[mid])//如果查找元素大于中间元素
min = mid+1;
//则查找后半部分
else if(key < arr[mid])//如果查找元素小于中间元素
max = mid-1;
//则查找前半部分
else
return mid;
}
return -1;
}
4.7.3 扩展
向一个有序数组插入新元素,使得该数组还是有序的,求插入的位置,算法如下:
public static void main(String[] args) {
int[] arr = {1,4,8,10,12,35};
int key = 2;
System.out.println(getIndex(arr, key));
}
//返回向有序数组插入新元素的数组位置,即新的元素插入在哪个位置使得数组还是
有序的
public static int getIndex(int[] arr, int key) {
int min = 0, max = arr.length-1, mid;
while (min <= max) {
mid = (min + max)/2;
if(key > arr[mid])//如果查找元素大于中间元素
min = mid+1;
//则查找后半部分
else if(key < arr[mid])//如果查找元素小于中间元素
max = mid-1;
//则查找前半部分
else
return mid;
}
return min;//当max < min时,说明查找的元素位于 min
}