1、习题讲解
如果我给你任意一个类(JDK已经提供的类),你能够通过API来完成学习和使用吗?
如何调用呢?
注意哪些问题呢?
1. 打开文档,查询这个类
2. 找到这类以后,先看包结构和继承体系、实现的接口
3. 看类的简介,获取该类的一些java属性和功能属性
4. 查看构造方法,如果没有可能存在下面两种情况
a)该类下所有方法都是静态的,可以通过类名调用
b)该类有一个静态方法,此方法的返回值就是该类的一个对象
5. 查看方法
a)查看方法名和参数,理解一下名称的定义参数的含义
b)查看方法的返回值类型
c)通过方法详解查看在使用过程中需要注意的事项
6. 根据之前的了解使用代码验证,最后修正总结
2、数组排序(理解原理)
冒泡排序:
A: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
B: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
C: 针对所有的元素重复以上的步骤,除了最后一个。
D: 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public static void bubbleSort(int[] arr) {
// 外循环控制比较的次数
for (int i = 0; i < arr.length - 1; i++) {
// 内循环控制每次比较中,元素两两比较的过程。每次需要比较的数据是逐渐减少的。
for (int j = 0; j < arr.length - 1 - i; j++) {
// 比较相邻元素,如果前面的大,进行交换
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
选择排序:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
每次比较仅做一次交换。
public static void selectionSort(int[] arr) {
// 外循环控制比较的次数
for (int i = 0; i < arr.length - 1; i++) {
// 定义变量,用于记录每次比较中最小值的索引
int mark = i;
// 内循环控制每次比较中,元素比较的过程。每次需要比较的数据是逐渐减少的。
for (int j = i + 1; j < arr.length; j++) {
if (arr[mark] > arr[j]) {
mark = j;
}
}
// 判断,如果最小值不是每次比较时的第一个,将这个最小值交换到每次比较的起始索引处。
if (mark != i) {
int temp = arr[i];
arr[i] = arr[mark];
arr[mark] = temp;
}
}
}
练习:对字符串中字符进行自然排序。
思路:
A:把字符串转换成字符数组。
B:对字符数组进行排序。
C:把排序后的字符数组转换成字符串。
// main method
main {
String s = "basckd";
// A:
char[] chs = s.toCharArray();
// B:
bubbleSort(chs);
// C:
String result = new String(chs); // String.copyValueOf(); // String.valueOf();
}
// 排序方法(采用冒泡排序)
public static void bubbleSort(char[] chs) {
for (int i = 0; i < chs.length - 1; i++) {
for (int j = 0; j < chs.length - 1 - i; j++) {
if (chs[j] > chs[j + 1]) {
char temp = chs[j];
chs[j] = chs[j + 1];
chs[j + 1] = temp;
}
}
}
}
3、数组查找。
问题提出: 已知int[] arr = {37, 92, 54, 18, 76};
求元素92索引是多少?
普通查找:遍历数组,把数组中的元素与给定的值依次进行比较,一旦查找到,返回该元素索引,如果没有,返回-1.
public static void commonSearch(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
思考:效率问题。如果数组较大,想查找的元素位于数组索引较大处,要将数组全部遍历才能找到。
折半查找(二分查找):
前提:数组必须有序。
public static int getIndex(int[] arr, int value) {
int maxIndex = arr.length - 1;
int minIndex = 0;
int midIndex = (maxIndex + minIndex) / 2;
while (arr[midIndex] != value) {
if (arr[midIndex] > value) {
maxIndex = midIndex - 1;
} else if (arr[midIndex] < value) {
minIndex = midIndex + 1;
}
if (minIndex > maxIndex) {
return -1;
}
midIndex = (maxIndex + minIndex) / 2;
}
return midIndex;
}
4、Arrays工具类,对数组进行操作的工具类。
常用功能就是排序和查找。
public static String toString(数组):把数组变成字符串。
public static void sort(数组):对数组进行排序。
public static int binarySearch(int[] arr,int value):二分查找
5、System的方法
(1)系统类,提供了静态的变量和方法供我们使用。
(2)成员方法:
public static void exit(int value):退出jvm,非0表示异常退出。
public static long currentTimeMillis():返回当前系统时间的毫秒值。和1970 年 1 月 1 日午夜之间的时间差
-- 常用来测试某些代码执行的时间长度。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
-- 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
从数组src中复制一个数组(从索引为srcPos处开始,长度为length),把这个数组复制到目标数组dest中,替换目标数组dest中从索引destPos开始,长度为length的数组元素。
注意角标越界异常。
6、StringBuffer 字符串缓冲类。字符个数可以发生改变的字符串类。
与String区别:
String一旦被赋值,值不能发生改变。而StringBuffer,值还可以改变。
为什么呢?
StringBuffer采用的是缓冲区机制。
一开始,首先开辟一些空间,然后,随着数据的增多,还可以继续开辟空间。这些操作针对的是同一个对象。
构造方法:
A: StringBuffer()
B: StringBuffer(int capacity)
C: StringBuffer(String str)
成员方法:
public int length():字符个数。实际长度。
public int capacity():字符容量。理论长度。
A:添加功能
public StringBuffer append(int i); -- 在结尾处添加
public StringBuffer insert(int index, int i); -- 在指定索引处添加
B:删除功能
StringBuffer deleteCharAt(int index); -- 删除指定位置处的字符
StringBuffer delete(int start, int end); -- 删除指定开始位置和结束位置之间的字符
C: 替换功能
StringBuffer replace(int start, int end, String str); -- 将指定范围内(索引从start到end,左闭右开)的字符串替换为指定字符串str
D: 截取功能
public String substring(int start); -- 从索引为start处截取到结尾
public String substring(int start, int end); -- 从索引为start,截取到end。左闭右开。
E: 反转功能
public StringBuffer reverse(); -- 将此字符序列用其反转形式取代
|
|