重新回顾java语言, 总结收获到有所遗忘的知识点,并做出对应的练习。
十进制转化2进制的方法:
用10进制的数去%2, 一直到最后一位, 将余数逆序排列。
如: 13%2 = 6 余 1
6%2 = 3 余 0
3%2 = 1 余 1
1%2 = 0 余 1
则逆序为 1101 1*8+1*4+0*2+1*1 = 13
10进制转8进制, 是将10进制转成2进制, 然后将2进制的数3位分成一组, 不够的补充0
如:43 = 101011 -》 101 011 - 》 53
10进制转16进制, 则是10到2, 再将2进制4位分。
负数的2进制, 就是正数的2进制全部去反, 末位+1.
==================================================================================
不同数据类型对应的大小;
1字节 = 8 位
byte 1字节 -128 到 127
short 2字节 -32768 到 32768
int 4字节 -2147483648 到 2147483648
long 8字节 -9233372036854477808 到 9233372036854477808
float 4字节
double 8字节
char 2字节
===================================================================================
数据类型分为基本数据类型和引用数据类型, 基本数据类型有 byte , short , int ,long , float , double ,引用数据类型有 class. interface, 数组。
其中, 整数默认类型是int , 小树默认的类型是double, double的小数经度比float更高。基本能满足日常生活中99.9%所用到的数。
===================================================================================
++a , a++。 ++在前,则先加再算别的,或者是赋值、 反之, 算完之后在进行++。
===================================================================================
整数与整数相除永远是整数, 小数将被忽略。
===================================================================================
负数对正数取模的结果是负数。
正数对负数的取模结果是正数。
===================================================================================
在使用+=的时候, 编辑器会对所得的数自动进行强制转型。 short + int 所得数也是 int, 如果再将结果赋值给short , 编译则会报错。
===================================================================================
比较运算符 “instanceof” 检查是否是类的对象。 返回值为boolean、 “hello” instanceof String = true
逻辑运算符 ^ 异或 , 同为false,异为true。
===================================================================================
<< 相当于乘以2的n次方。 >> 相当于除以2的n次方
===================================================================================
2个数交换, 不实用第三个中间量 (在不超过范围的情况下。)
如: a = 3; b = 4 ;
a = a+b;
b = a - b ; //就是a
a = a - b ; //相当于 a+b-a = b
达到交换的目的。
or
一个数异或2次同一个数, 等于这个数本身。
a = a^b;
b = a^b;//a^b^b = a
a = a^b;//a^b^a = b
===================================================================================
表达式, 就是有一定语法规则的语句。
===================================================================================
switch 的语句类型只有 byte, short , int char 4种、
default 没有找到, 另外是最后执行的, 写在哪无所谓。
对固定值的判断推荐使用switch, 因为switch会将答案加载进内存, 效率高,
===================================================================================
内存的划分:
1.寄存器
2.本地方法区
3.方法区
4.栈内存:存储局部变量, 作用域结束的时候会被释放。
5.堆内存:数组和通过new建立的对象放在 堆内存中。
===================================================================================
【选择排序和冒泡排序、折半查找】
选择排序思路:将第一个数一次和后面的数做比较, 如果发现这个数大于后面的数则做交换, 这样一轮之后第一个元素就是最小的了。
然后再第二个.... 直到倒数第二个。
冒泡排序思路:从第一个元素, 到倒数第二个元素, 依次和右边的元素做比较, 如果这个元素大于右边的元素则交换。这样一轮之后,最1右边的元素就是最大的元素了。
然后是从第一个元素,到倒数第三个元素,以此类推, 一直到第一个元素到第二个元素。
折半查找思路(有序, 从小到大):用三个变量做操作, 本别是begin边界的起始, end边界的结束, mid 边界之中的中间量。 初始状态小, begin = 0 , end = 数组的最后一位, mid = (begin+end)/2.
如果mid不等于目标元素, 继续运算。 如果mid小于目标元素, begin = mid+1 , 通过让begin增大的方式让mid向较大的一端移动。
如果 mid大于目标元素, 则, end = mid-1,通过缩小end让mid向较小的一段移动。重算mid,
mid = (begin+end)/2. , 循环比对。
===================================================================================
===================================================================================
综合练习代码及注释讲解
import java.util.Arrays;
public class Demo001 {
public static void main(String[] args) {
int[] a = new int []{10,9,8,7,6,5,4,3,2,1}; //待排序数组
int [] b = a.clone(); //克隆一个待排序的数组对象
int [] c = a.clone(); //克隆一个待排序的数组对象
int [] d = a.clone(); //克隆一个待排序的数组对象
int [] e = a.clone(); //克隆一个待排序的数组对象
printArr(a); //输出数组
a = Xzpx(a); //选择排序
printArr(a); //输出数组
System.out.println("==============分割线===============");
printArr(b); //输出数组
b = Mppx(b);//冒泡排序
printArr(b); //输出数组
System.out.println("==============分割线===============");
printArr(c); //输出数组
Arrays.sort(c); // JDK自带的排序
printArr(c); //输出数组
System.out.println("==============分割线===============");
printArr(d); //输出数组
Arrays.sort(d); // JDK自带的排序
printArr(d); //输出数组
int index = Zbcz(d,4);
System.out.println("折半查找元素4," + (index == -1?"不存在":"为arr[" +index+"]"));
System.out.println("==============分割线===============");
printArr(e); //输出数组
Arrays.sort(e); // JDK自带的排序
printArr(e); //输出数组
index = Arrays.binarySearch(e, 4); //JDK自带的折半查找
System.out.println("折半查找元素4," + (index == -1?"不存在":"为arr[" +index+"]"));
}
/**
* 选择排序算法
* @param a 待排序数组
* @return 从小到大的数组
*/
public static int[] Xzpx(int [] a){
int [] result = new int[10]; // 目标结果数组
/*
* 选择排序的算法是: 先将第一个元素和后面的元素做比较, 如果当前比较的元素大于第一个元素, 则互换位置
* 比对一轮后, 第一个元素是最小的, 然后在用第二个元素做比较, 依次类推。
*/
for(int i = 0 ; i < a.length-1 ; i ++){ //外层循环控制待比较元素推移
for(int j = i+1 ; j <a.length ; j++ ){ //内层循环控制比较剩余元素,从第i个开始一直比对到最后一个
if(a[i] > a [j]){ //如果带比较的元素大于它后面的元素则交换。
/*
* 此处采用不用中间量的算法:一个数连续2次异或同一个数,则结果是这个数本身。
*/
a[i] = a[i]^a[j]; // a = a ^ b
a[j] = a[i]^a[j]; // b = a ^ b ^ b = a
a[i] = a[i]^a[j]; // a = a ^ b ^ a = b
}
}
}
result = a;
return result;
}
/**
* 冒泡排序算法
* @param a 待排序数组
* @return 从小到大的数组
*/
public static int[] Mppx(int [] a){
int [] result = new int[10]; // 目标结果数组
/*
*冒泡排序的简单算法是:从数组的第一个元素开始到倒数第二个元素一次和下一个元素做比较, 如果左边元素大于右边的元素, 则作交换。
*第一轮比较过后, 最大的元素就在数组的最末位了, 然后是第一个元素到倒数第三个元素。
*一直到第一个元素和第二个元素比较则结束
*/
for(int i = 0 ; i < a.length- 1 ; i ++){ //外层控制遍历的趟数
for(int j = 0 ; j < a.length - 1 - i ; j ++){ //内层控制每一趟遍历的次数
if(a[j] > a[j+1]){
/*
* 此处采用不用中间量的算法.
*/
a[j] = a[j] + a[j+1];
a[j+1] = a[j] - a[j+1];
a[j] = a[j] - a[j+1];
}
}
}
result = a;
return result;
}
/**
* 折半查找算法(有序, 从小到大)
* @param a 目标数组
* @param b 待查找的元素
* @return 元素的角标
*/
public static int Zbcz(int [] a , int b){
int index = 0 ;
int begin , end , mid;
begin = 0 ;
end = a.length-1;
mid = (begin+end)>>1; // int 和int 相除所得结果还是int
while(a[mid] != b){ //如果, 中间量不等于目标值。
if(a[mid] > b){ // 如果所选范围的中间量大于目标元素,则以现在的中间量-1作为边界的最大值。
end = mid -1;
}else if(a[mid] < b){ // 如果所选范围的中间量小于目标元素,则以现在的中间量+1作为边界的最小值。
begin = mid + 1;
}else if(end < begin){ // 最大值最小值不合逻辑,则结束。
mid = -1;
break;
}
mid = (begin+end)>>1; //重新计算中间值。
}
index = mid;
return index;
}
/**
* 数组打印
*/
public static void printArr(int[]a){
for(int i = 0 ; i < a.length ; i ++){
System.out.print("arr["+i+"] = "+a[i] +" ");
}
System.out.println();
}
}