黑马程序员 基础(二)

来源:互联网 发布:小管家erp软件 编辑:程序博客网 时间:2024/05/18 20:12

---------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

1,for_while_statement

          for_while循环在开发中,使用频率很高,有些时候,出现小问题不知道出在哪里,for循环主要分为四块,初始化部分,判断部分,增量部分,循环主体。

           for循环的特点是,

                 1,初始化部分在第一步执行,且只执行一次, 

                 2,判断部分在第二步执行,是决定for循环的次数,
                 3,代码块在第三步执行,执行要处理的语句等 

                 4,增量部分在第四步执行,控制变量的变化幅度

         下面的代码是演示a从一变到6所执行的过程,用sys打印出。

public static void for_while_statement(){int a = 1;for(System.out.println("第一步"+(++a));a<=6;System.out.println("第四步"+(++a))){System.out.println("第三步"+(++a));}//死循环有两种实现方式//for(;;){} //while(true){}}

结果验证:

a<=6部分无法用sys打印出来,因为第二部分需要一个boolean类型的值,打印7,8是因为a<=6之后,又执行了第三步,第四步

注意:可以用for和while实现死循环

2,数组初始化

        数组初始化有三种方法,不明确数据,明确数据(两种),很容易将其中的两种初始化弄混淆了,就是添加中括号的问题,切忌有大括号时,中括号里面不能有数字。

public static void init_array(){//不明确数据,array的已经被初始化为0int[] array = new int[5];//明确数据右边的中括号不能添加整数int[] array1 = new int[]{1,3,5,7};//简化形式int[] array2 = {1,2,,4,5};}

补充:第三种是第二种的简写,当数据很少且确定时,用第三种,当数据很多时,而且不确定,用第一种,数组中允许出现空值,就是逗号之间可以没有数据!

3,冒泡排序

        冒泡排序的思路是,每次从第一个元素出发,和紧挨着后面的元素比较,如果比后面的大,就交换,接着第二个(如果没有交换,就是原来的值,如果交换,就是和它交换的那个比较大的值)和后面的第三个做相似的比较,如果比较大,就就交换,接着第三个(如果没有交换,就是原来的值,如果交换,就是和它交换的那个比较大的值)和后面的第四个做相似比较...............直到倒数第二个元素,这时倒数第二个元素就是前面的所有元素中最大的值,在和最后一个元素比较,方法和前面类似,那么最后一个元素就是最大的值,接下来,对前面的n-1个元素以同样的方式进行比较,这样第二大的元素就确定了,n个元素需要比较n-1趟才能确定下来。

代码中i用于记录每趟比较的结束位置,j用于从第一个位置遍历到i-1的位置,这样确保每次都可以在i的位置获取最大值,注意i是递减的,i=length-1说明数组的下标是从零开始的

public static void bubble_sort(){int[] array = {3,6,5,2};for(int i = array.length -1; i > 0; i-- ){for(int j = 0; j < i; j++){if(array[j] > array[j+1]){array[j]^=array[j+1];array[j+1]^=array[j];array[j]^=array[j+1];}}for(int k = 0; k < array.length; k++){System.out.print(array[k]+" ");}System.out.println();}}

结果验证:

4,选择排序

          选择排序的思路是,认定把第一个位置的元素作为最小值,后面所有的元素都要和第一个位置比较,值比第一个位置小的,就立刻交换,这样确保每一趟在已经比较的元素中,第一个位置始终是比较过的元素中的最小值,这样一趟比较后,最小值放在第一个位置了,接着进行第二趟循环,假定第二小的元素就在第二个位置,后面的元素都要和第二个位置比较,以此类推,直到最后一趟,i为length-2,i不需要引用最后一个位置的元素位置,j每次都是从i+1的位置一直到length-1的位置,下面给出代码。

public static void select_sort(){int[] array = {3,6,2,5};for(int i = 0; i < array.length-1; i++ ){for(int j = i + 1; j < array.length; j++){if(array[i] > array[j]){array[j]^=array[i];array[i]^=array[j];array[j]^=array[i];}}for(int k = 0; k < array.length; k++){System.out.print(array[k]+" ");}System.out.println();}}

结果验证:

5,选择排序改进

         如果一开始数组呈现倒序排列,需要排成正序,那么交换的次数就是n(n-1)/2次,效率很低,采用标记的方法就可以有效的减少交换,效率提高很多。

public static void select_sort_1(){//采用标记的方式,可以有效 的提高效率,提高在减少交换的次数int[] array = {3,6,2,5};for(int k,i = 0; i < array.length-1; i++ ){k = i;for(int j = i + 1; j < array.length; j++){k = array[k] > array[j]? j : k;}if(k != i){array[k]^=array[i];array[i]^=array[k];array[k]^=array[i];}for(int t = 0; t < array.length; t++){System.out.print(array[t]+" ");}System.out.println();}}

结果验证:

补充:第二个for循环是为了打印每一趟的排序结果!

6,关于对象的创建分析

public static void analytics_heap_and_stack(){String str = new String("abc");}

  //1,在栈中先执行声明操作String str
  //2,接着在堆中执行new操作new String("abc")
  //3,执行分配堆内存地址,假设为分配的heapaddress为0x007A
  //4,为string类型对象进行初始化,赋值为"abc",其实在这里方法区也有一个“abc”,存放在常量池中
  //5,将堆内存地址赋值给声明的变量str,str中存放的是0x007A

 7,关于数组越界和无效的除零操作

        为什么写的代码编译通过,运行时出现异常?有时候不知道问题出在哪,这时候需要用异常机制了!

public static void index_out_of_array(){//编译器只是进行语法检查,查看语法是否正确,以及左右类型是否一致//因为为a分配空间时,是在运行的时候,数组大小才能确定下来,int[] a = {1,2,3};try {int k = a[3];} catch (IndexOutOfBoundsException e) {System.out.println("数组越界");}int k = a[3];}

原因在代码中说明了,一般的情况下不需要写try语句块,在涉及到程序跳转时,一定要在调用函数上加上try语句块,实际开发中很多情况不是用判断就可以解决的,例如jdbc操作,连接不成功,查询不合法等等,还有就是报文传送,超时怎么办?这些都是异常处理的范围,保证程序运行有条不紊。


8,break语句

        break语句是用于跳出循环用的一个方式,但是有局限性,有些需求需要在条件满足后就结束循环,如果循环嵌套很多,那么每层都要加上break语句才可以退出,这样很麻烦,那么有什么好的解决办法呢?用标号,类似goto语句!

public static void break_method(){//switch 方法前面演示过,演示简单循环方法for(int i = 1;;i++){if(i == 2) break;}System.out.println(1);//演示带标号循环方法x:for(;;){y:for(int i = 2 ;;i++){if(i == 3) break x;}}System.out.println(2);}

如果不用标号,直接就是死循环了。

验证代码:


9,continue语句

         continue语句主要作用是在条件不满足时,不执行continue后面的语句,继续循环的下一次,如果条件不满足,continue后面的语句就会执行。continue不是跳出循环,而是相当于一个筛子。continue也有标号的方法。

public static void continue_method(){for(int i = 1;i <= 3; i++){if(i % 2 == 0) continue;System.out.println(i);}//continue也可以使用带标号方法x:for(int j = 1;j < 3 ;j++){y:for(int i = 2 ;;i++){if(i == 3) continue x;System.out.println("a");}}System.out.println(3);}

如果不带标号,代码会进入死循环。

验证代码:


 

----------android培训、java培训、java学习型技术博客、期待与您交流! ------------