***************************第四章 数组 ***************************************
一.why 什么时候想到使用数组
当定义的变量比较多的时候,考虑使用数组
需求: 求全班同学的平均成绩
人数少的时候(例如只有5人) 可以定义5个变量,每个变量分别用来存每个学生的成绩
int scoreA = 90;
int scoreB = 100;
int scoreC = 80;
...
但是如果是60个人 定义60个变量 显然比较繁琐 可以使用数组..
二.what 什么是数组
相同类型 元素的集合...
特点:
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