关闭

黑马程序员 基础(二)

292人阅读 评论(0) 收藏 举报

---------- 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的已经被初始化为0
		int[] 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学习型技术博客、期待与您交流! ------------

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6226次
    • 积分:244
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档