Java数组(二)

***************************第四章 数组 ***************************************


一.why 什么时候想到使用数组


当定义的变量比较多的时候,考虑使用数组


需求: 求全班同学的平均成绩


人数少的时候(例如只有5人) 可以定义5个变量,每个变量分别用来存每个学生的成绩

int scoreA = 90;

int scoreB = 100;

int scoreC = 80;

...

但是如果是60个人 定义60个变量 显然比较繁琐 可以使用数组..


二.what 什么是数组

扫描二维码关注公众号,回复: 3933038 查看本文章


相同类型 元素的集合...


特点:

1. 元素的类型都是一样的


2. 数组中的元素在物理位置上是连续的...

数组的分类:

数组按照数组中元素的类型,分为两种


(1)基本类型数组

如果数组中的元素是基本类型,该数组叫做基本类型的数组


(2)引用类型数组

如果数组中元素的类型是引用类型,该数组叫做引用类型数组


三.how 如何定义数组

1.声明 2. 创建 3. 初始化

*******************************基本类型的数组***************************************


需求: 求全班同学的平均成绩


数组分配空间是在 堆里分配的


堆: java程序运行的时候 使用的另一段内存空间,一般程序运行的时候 动态创建出来的对象

都分配在堆了... new 出来的都在堆里

数组是引用类型的


演示代码:


/**
作者: zhangzy<br>
公司: 蓝桥软件学院<br>
时间: 2017-06-27 上午
功能: 演示基本类型数组的使用

*/

public class TestArray{

public static void main(String[] args){


//需求: 求全班同学的平均成绩

//1. 声明
//int[] intArr;// intArr数组的引用名

//2.创建 ((1)分配空间(2)默认初始化 基本类型默认初始化为0或0.0)
//intArr = new int[5]; //new int[5]; 创建数组的代码 返回的是刚刚创建出来的数组的首地址
//数组的首地址 就是数组中第一个元素的首地址

//3.初始化
/*
intArr[0] = 60;
intArr[1] = 70;
intArr[2] = 80;
intArr[3] = 90;
intArr[4] = 100;*/

//合并一下
//int[] intArr = new int[5];
//三步合并成一步
//int[] intArr = new int[]{60,70,80,90,100};
int[] intArr = {60,70,80,90,100};

int sum = 0;
//数组对象有一个属性 叫做 length 用来获得数组的长度
for(int i=0;i<intArr.length;i++){

sum = sum + intArr[i];
}

int avg = sum / intArr.length;

System.out.println("avg=" + avg);
//数组下标越界
//intArr[5] = 100;//数组的最后一个元素 是length-1 访问5时 报错 ArrayIndexOutOfBoundsException
}
}


***********************基本类型和引用类型的区别***************************


int a = 10;

1. 基本类型


实质就是数值 是数值的二进制位表示形式

2. 引用类型


实际是地址


相当于c语言中的指针 ,只不过它是简化版的指针 不能操作系统 不能进行 p++ p-- 操作


***************************增强的for循环 ***************************************


JDK5.0 提供的一个新特性

/**
作者: zhangzy<br>
公司: 蓝桥软件学院<br>
时间: 2017-06-27 上午
功能: 演示增强的for循环 jdk5.0的新特性 简化了数组的遍历
*/

public class TestAdvancedFor{

public static void main(String[] args){


int[] intArr = {60,70,80,90,100};

for(int temp:intArr){
System.out.print(temp + " ");
}

}
}


***************************引用类型数组 ***************************************


引用类型数组: 里面的元素 都是引用类型...


引用类型: 除了8种基本类型以外都是引用类型

String、数组、类


String s = "aaa";


s = null;


null 中文翻译成空 null的含义 表示什么都不引用


演示代码:


/**
作者: zhangzy<br>
公司: 蓝桥软件学院<br>
时间: 2017-06-27 上午
功能: 演示引用类型数组的使用

*/

public class TestRefArray{

public static void main(String[] args){


//定义字符串数组
//1.声明
//String[] strArr;

//2.创建 (分配空间、默认初始化 引用类型默认初始化为null)
//strArr = new String[3];
//String s1 = null;
//String s2 = null;
//String s3 = null;

//3.初始化
/*
strArr[0] = "aaa";
strArr[1] = "bbb";
strArr[2] = "ccc";*/

//Stirng[] strArr = new String[]{"aaa","bbb","ccc"};

String[] strArr = {"aaa","bbb","ccc"};

for(String str:strArr){
System.out.println(str);
}
}
}

//String s = "aaa";//s 字符串对象的引用) ...

***************************是否交换问题***************************************

***************************冒泡排序 ***************************************


数据结构


排序: 无序----------->有序

冒泡排序:

第一轮 指针指向第一个元素 让第一个元素和它后面的元素比较大小,如果 前面的元素> 后面的元素


交换位置,指针向后移动(不管交换不交换 指针都会向后移动 始终指向大的元素),第一轮比较完以后

最大的元素冒到最右边....


第二轮执行过程 和第一个一样,执行完以后 次大的元素冒到的最右边

1.时间复杂度: 问题域的大小 和解决该问题 所用时间的一个关系,叫做时间复杂度


这里的问题是排序, 问题域的大小 待排序的元素的个数...


需要先求比较次数 n*(n-1)/2 O(n方)


2.空间复杂度; 问题域的大小 和解决该问题 所用空间(内存)的一个关系,叫做空间复杂度...


O(1) 恒定不变的值

*************************二维数组***********************************

没有二维数组


二维数组的实质是一维数组


它是引用类型的一维数组,只不过每个元素引用的又是一个一维数组

演示代码:


/**
作者: zhangzy<br>
公司: 蓝桥软件学院<br>
时间: 2017-06-28 上午
功能: 演示二维数组的使用

*/

public class TestArray2{

public static void main(String[] args){

/*
int arr1 = new int[]{1,2,3};
int arr2 = new int[]{1,2,3,4};
int arr3 = new int[]{1,2,3,4,5};

//一.声明
int[][] intArr;

//二.创建 (分配空间、默认初始化)
intArr = new int[3][];

//三.初始化
intArr[0] = arr1;
intArr[1] = arr2;
intArr[2] = arr3;*/


int[][] intArr = new int[][]{{1,2,3},{1,2,3,4},{1,2,3,4,5}};
//int[][] intArr = {{1,2,3},{1,2,3,4},{1,2,3,4,5}};

for(int i=0;i<intArr.length;i++){

for(int j=0;j<intArr[i].length;j++){
System.out.print(intArr[i][j] + " ");
}

System.out.println();
}


}
}

*******************String类的实质----底层是由 字符数组 组成的*****************

1.查看源代码


public final class String{

private final char value[];//字符数组用于存储 字符串的字面值

...
}

**
源代码在 jdk\src.zip下

字节码在 jre\lib\rt.jar 中


2. 反编译

编译
.java--------->.class


反编译
.class------------->.java


当别人没有提供源代码,只提供了.class文件,如果想学习别人如何实现的..

可以通过反编译得到源代码...


cavaj 反编译工具


*********************************如何通过打断点来调试代码**************************

1.如何打断点

在行号前面双击即可... 取消断点再双击


注意: 断点这一行还没有执行

如何调试

1. step into 单步进入 逐语句

碰到方法会进入该方法 每次执行方法中的一句


每次执行一句


2. step over 单步跳过 逐方法

碰到方法 直接把整个方法全部执行完毕 每次执行一个方法

3. step return 单步跳出


平时不可用, 当使用单步进入 进入到方法后 如果一下子想把方法中 没有执行的代码 全部执行完毕

可以使用 单步跳出..

**************************************字符串连接********************************


1. +

String s = "hello";

s = s + ",world!";

System.out.println(s);


2. 字符串的concat方法

String s1 = "aaa";
s1.concat("bbb");
System.out.println(s1);

注意不会在原来的字符串上进行修改,只是在备份上进行修改

**************************************字符串常量池********************************


一.why 为什么有字符串常量池


String s1 = "aaa";

String s2 = "aaa";

String s3 = "aaa";

String s4 = "aaa";

String s5 = "aaa";


假设没有字符串常量池, 创建100个 相同字面值 "aaa"对象, 会在堆中 分配100分 内存,显然是浪费内存,不合理...


java的设计人员肯定考虑到了这个问题, 为了高效的使用内存, 定义了字符串常量池的概念


二. what


新的内存空间, 同样的字面值对象 "aaa" 只会在字符串常量池中出现一次, 如果第二次再定义相同的字面值 "aaa"

对象,并不会在内存中再新建一份 新的空间保存"aaa" 而是直接 引用常量池中 已经有的 "aaa"对象


**************************************创建了几个对象********************************


一. 直接赋值

创建了一个对象 在字符串常量池中

无则创建、有则返回


String s1 = "aaa";// 创建了几个对象? 创建了1个对象 在字符串常量池中

演示代码:

package com.chapter5;

public class 演示创建了几个对象 {
public static void main(String[] args) {

String s1 = "aaa";
String s2 = "aaa";

System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
}
}


2. new

创建了两个对象:

(1) 字符串常量池中 真正的字面值对象


无则创建、有则返回

(2) 堆里的

无论如何都要被创建,存的是常量池中 字面值对象的地址

*************************************==和equals的区别******************************************


一. ==


实质比较的是二进制位


1. == 左右两边是基本类型

int a = 10;
int b = 10;

System.out.println(a==b);//true

比较的是数值 数值相等 就是 true 不相等就是 false

2. == 左右两边是引用类型


地址

地址相同 true 如果双等号两边 两个引用 引用的是同一个对象 返回true

地址不同就是false 两个引用 引用的不是同一个对象 返回false


二.equals


String 类的equals 比较的是 字面值 字面值相等 true 字面值不相等 false

猜你喜欢

转载自www.cnblogs.com/MrTanJunCai/p/9906746.html