黑马程序员_Java基础04天日志
来源:互联网 发布:艾森豪威尔总统 知乎 编辑:程序博客网 时间:2024/05/19 13:28
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 数组(静态初始化常见问题)
问题1:ArrayIndexOutOfBoundsException:x:操作数组时,访问到了数组中不存在的角标
例:int [] arr=new int[3]; arr[3];
问题2:NullPointerException:空指针异常:当引用没有任何指向值为null的情况,该引用还在用于操作实体.
例:int[] arr; arr=null; arr[1];
2. 数组(常见操作-遍历)
2.1 数组中有一个属性可以直接获取数组长度。使用方式:.length
2.2 实例: for(int i=0;i<arry.length.i++)
2.3 输出数组地址:System.out.println(arr);
例:若输出值为 [I@de6ced “[” 代表是数组 “ I” 代表是int 类型的数组 “@”后为地址 其意思为,这是一个int类型数组,de6ced是它的地址。
3. 获取数组中的最值
3.1 思路:
1.获取最值需要进行比较。每次比较都会有一个比较大的值,因为该值不确定,通过一个变量进行临时储存。
2.让数组中的每一个元素都和这个变量中的值进行比较。如果大于该变量中的值,就用该变量记录较大值。
3.当所有元素都比较完成,那么该变量中储存的就是数组中的最大值了。
3.2 代码:
4. 选择排序
4.1 原理:假如是升序排序,从数组的第一位开始循环,把第一位依次与后面的所有数进行比较,比第一位小的数就与它交换,一次循环结束后,就能把最小的那个数排到第一位,然后在从第二位数开始,依次与其后面的数进行比较。循环结束后第二小的数就排到了第二位,依次类推,就可以把所有数进行顺序排序了。降序排序的原理也是一样。
4.2 代码:
升序排序
降序排序
5. 冒泡排序
5.1 原理:相邻的两个元素进行比较,如果符合条件就换位。跟选择排序差不多,只不过每次比较的元素是相邻的元素。还有一点不同,就是每次的最大值或最小值都排在最后位。
5.2 代码:
升序排序
降序排序
6. 折半查找
6.1 要求和优点:可以提高效率,但必须保证数组是有序数组。
6.2 原理:对一个有序数组进行折半分开,把需要查找的元素与数组中间元素比较大小,若查找的元素比中间元素大,则继续把数组往大的方向进行折半,若比中间元素小,则把数组往小的方向进行折半。再继续用查找的元素比较折半后数组的中间元素。依次类推,若存在该元素,则总有一个中间元素与其相等。然后返回该中间元素下标。
6.3 实例:
方法1:
public static intgetIndex(int[] arr,intnum){ intmin,max,mid; min=0; max=arr.length-1; mid=(min+max)/2; while(min<=max){ if(num<arr[mid]){ max=mid-1; }else if(num>arr[mid]){ min=mid+1; }else{ return mid; } mid=(min+max)/2; } return -1; }
方法2:
public static intgetIndex_2(int[] arr,intnum){ intmin=0,max=arr.length,mid=(min+max)/2; while(arr[mid]!=num){ if(num<arr[mid]){ max=mid-1; }else if(num>arr[mid]){ min=mid+1; } if(min>max){ return -1; } mid=(min+max)/2; } return mid; }
7. 用代码实现十进制转换为二进制
7.1原理:每次除以2取余。
7.2代码:
public static voidtoBin(int num) { StringBuffer sb = newStringBuffer(); while(num>0) { //System.out.println(num%2); sb.append(num%2); num = num / 2; } System.out.println(sb.reverse()); }
8. 用代码实现十进制转换为十六进制
8.1 原理:四个二进制位就是一个八进制位。用&算法得到后面的四个二进制位再转换相应的十六进制,每次运算完后,把数右移4位再继续循环。原因:因为通过&算法已经得到了后面的4位,所以要把它们去掉,再把它们前面的4位取出来,依次可得全部的有效位。
8.2 代码实现:
public static voidtoHex(int num) { StringBuffer sb = newStringBuffer(); for(int x=0;x<8; x++) { int temp= num & 15; if(temp>9) //System.out.println((char)(temp-10+'A')); sb.append((char)(temp-10+'A')); else //System.out.println(temp); sb.append(temp); num = num >>> 4; } System.out.println(sb.reverse()); }
注: reverse()方法是StringBuffer类里面的一个方法,作用是对StringBuffer对象里存储元素进行反转然后返回。
Append()方法是把元素加入StringBuffer对象中进行储存。
(char)(temp-10+’A’)的作用是把 &15 大于9的值转换为对应的十六进制的 A~F.
9. 查表法十进制——十六进制
9.1查表法:将所有的元素临时储存起来。建立对应关系。
9.2 临时数组:
char[]chs = {'0','1','2','3' ,'4','5','6','7' ,'8','9','A','B' ,'C','D','E','F'};
每次&15后的值作为索引去查建立好的表。就可以找对应的元素
代码:
public static voidtoHex(int num) { 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 & 15; //System.out.println(chs[temp]); arr[--pos] = chs[temp]; num = num >>> 4; } System.out.println("pos="+pos); //存储数据的arr数组遍历。 for(intx=pos;x<arr.length; x++) { System.out.print(arr[x]+","); } }
注:--pos的意思是,先将pos自减再用作于下标。
10. 查表法十进制——二进制
10.1临时数组: char[] chs = {'0','1'};
10.2 代码:
public static voidtoBin(int num) { //定义二进制的表。 char[]chs = {'0','1'}; //定义一个临时存储容器。 char[]arr = new char[32]; //定义一个操作数组的指针 int pos= arr.length; while(num!=0) { int temp= num & 1; arr[--pos] = chs[temp]; num = num >>> 1; } for(intx=pos; x<arr.length; x++) { System.out.print(arr[x]); } }
11. 进制转换优化
11.1把十进制转换为二进制和转换为十六进制的代码合并,把不同变量的作为参数传进来。
11.2具体实现代码:
num为需要转换的十进制数,base是&运算的数。offset是移位数。
public static voidtrans(int num,intbase,int offset) { 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[32]; int pos= arr.length; while(num!=0) { int temp= num & base; arr[--pos] = chs[temp]; num = num >>> offset; } for(intx=pos; x<arr.length; x++) { System.out.print(arr[x]); } return ;}
12. 二维数组
12.1格式:int[ ][ ] y=new int[x][x]; inty[ ][ ]=new int[x][x];
int[ ] y[ ]=new int[x][x]; x为不确定的整数。
12.2 方式1:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
上面定义的二维数组的意义是:
a. 定义一个名称为arr的二维数组
b.二维数组的长度表示方式:arr.length;
c.二维数组中的有三个一维数组
d.每一个一维数组中具体元素也都已初始化
e.第一个一维数组arr[0] = {3,8,2};
f.第二个一维数组arr[1] = {2,7};
g.第三个一维数组arr[2] = {9,0,1,6};
h.第三个一维数组的长度表示方式:arr[2].length;
12. 2 第二种方式:int [][]arr=new int[3][ ];
arr[0] =new int[3]; 定义第一个一维数组,长度为3
arr[1] =new int[1]; 定义第一个二维数组,长度为1
arr[2] =new int[2]; 定义第一个三维数组,长度为3
- 黑马程序员_Java基础04天日志
- 黑马程序员_java基础01天日志
- 黑马程序员_Java基础02天日志
- 黑马程序员_Java基础03天日志
- 黑马程序员_Java基础05天日志
- 黑马程序员_Java基础06天日志
- 黑马程序员_Java基础07天日志
- 黑马程序员_Java基础08天日志
- 黑马程序员_Java基础09天日志
- 黑马程序员_Java基础10天日志
- 黑马程序员_java基础
- 黑马程序员_java基础
- 黑马程序员_java 基础
- 黑马程序员_java基础
- 黑马程序员_Java基础
- 黑马程序员_java基础
- 黑马程序员_java基础
- 黑马程序员_java基础
- 《SAS编程与数据挖掘商业案例》学习笔记之一
- JavaScript学习13 JavaScript中的继承
- hdu 5018 Revenge of Fibonacci(BestCoder Round #10)
- plsql游标最后一行重复的问题
- ActiveMQ传输文件的几种方式原理与优劣
- 黑马程序员_Java基础04天日志
- 挖地雷问题(DAG最长路)
- 如何在SAE中使用smarty模板,实现MVC开发模式
- How to use Display Zoom on your iPhone 6 or iPhone 6 Plus
- 软件工程师-华为机试注意事项
- USACO 之 Section 1.3 Greedy Algorithm
- 机制OR策略
- C/C++面试经验
- 《SAS编程与数据挖掘商业案例》学习笔记之二