一、数组
1.认识数组
1.什么是数组:数组是一个数据的集合,数组实际上是一个容器,可以同时容纳多个元素
2.数组动态声明和静态声明
3.数组可以存储基本数据类型也可以存储引用数据类型
4.数组具有lentgth属性,并且数组一旦创建,长度不可变
5.每个数组元素都有下标,从0开始
6..数组元素的数据类型都一致,空间大小一致,存储空间连续
7.数组的内存地址就是数组第一个元素的内存地址
8.数组数据结构的优缺点:
优点:检索某个下标上的元素时效率极高,
缺点:在数组上元素存储时连续的,所以随机增加/删除元素效率较低,同时数组无法存储大数据量,因为很难找到这么大的空间
注意:对于数组最后一个元素的增删是没有效率影响到
2.为什么数组检索效率高?
1.每一个元素地址在空间上存储连续的 2.每一个元素类型相同,所以占用空间大小一样 3.知道第一个元素内存地址,知道每一个元素占用的空间大小,知道下标,就可以通过一个数字表达式计算出某一个下标上元素的内存地址,直接通过内存地址定位到这个元素,所以数组时检索效率最高的
3.图解析
4.数组使用
1.数组的使用: 声明:int[] abc; 2.初始化: 静态初始化:int[] abc = {1,2,3}; 动态初始化:int[] abc = new int[5]; 3.数组访问:abc[4]; 4.数组下标越界异常:访问数组没有的下标,ArrayIndexOUtOfBoundsException 5.数组遍历:for(int i = 0;i < abc.length;i++){} 倒序遍历:for(int i = abc.length-1;i>=0;i--){}
5.数组排序
1.冒泡排序法(从小到大一次输出) 从一个数开始两两比较,小的在前,大的在后,第一个对大的数冒出来 找大数,外循环从length-1开始,比较之后交换位置 2.选择排序 对冒泡排序进行改进,交换次数减少,但是比较次数没有减少 先使用下标为0的元素,对后面元素依次进行比较,找到较小元素进行替换。 找小数,外循环从0开始,进行比较,较小数坐标不是i,则进行数据交换 3.二分法查找(必须建立在已经排好序的前提下) 数据与a[(startPos + endPos)/2]进行比较, 使用while循环
6.Arrays工具类
1.Object类 实例方法:toString 实例方法:equals 实例方法:clone 实例方法:finallize 实例方法:hashCode 2.Arrays工具类:工具类都是静态方法 String toString(数组):把数组里的数据,用逗号连接成一个字符串[值1,值2] asList:将数组转化为list集合 binarySearch()二进制搜索数组中某一个KEY copyOf(数组,新长度):从0下标复制数组到另一指定长度数组 copyOfRange()从指定范围复制数组 重写了equals方法 重写了toString方法,输出[1,2,3] void sort(数组);升序方法:对数组进行排序,对于基本类型的数组使用的是优化后的快速排序算法,效率高 对引用类型数组,使用的是优化后的合并排序算法 Arrays.copyOf(数组,新的长度):把数组赋值成一个指定长度的新数组 新数组的长度 大于 原数组, 相当于复制,并增加位置 新数组的长度 小于 原数组, 相当于截取一部分数据 copyOfRange()用于完成数组的截取,3个参数: * 参数1:要截取哪个数组【原数组】 * 参数2:从原数组的哪个下标开始 * 参数3:到原数组的哪个下标结束 * 注意:截取的元素包含开始下标处的元素,不包含结束下标处的元素
7.当方法的参数是数组的时候
//这种创建方式没问题(C++的写法) int a[] = [3,2,2] doSome(a2); doSome(new int[]{1,2,3}) doSome(new int[3]);
8.main方法的一维数组
//JVM传递过来的String类型的数组 长度为0; //这个数组里面会有值吗? //这个数组是留给用户的,用户在控制台上输入参数,这个参数自动转换成”String[] args“ //例如 运行程序中,输入java Text abc abc abc //使用IDEA,运行中的编辑配置,程序参数输入abc abc abc //JVM将abc abc abc以空格隔开转换成数组 //有什么用? //模拟一个系统,系统需要输入账号密码
public class A{
public static void main(String[] args){
//输入账号密码
if(args.length!=2){
System.out.println("登录错误");
return;
}
//判断用户是否正确
if(args[0].equals("admin") && args[1].equals("123"))
//建议使用下列判断
//不会出现空指针异常
// if("admin".equals(args[0]) && "123".equals(args[1]))
System.out.println("登录成功");
else {
System.out.println("123");
return;}
9.数组中存储的是引用数组类型和多态
父类数组中可以存放子类的元素 Animal[] a1 = new Cat[6];
数组扩容
//步骤: 1.第一步,先新建一个大容量的数组 2.第二部,将小数组存放到大数组中 3.第三步,将数组取消掉 数组扩容效率较低,因为涉及拷贝,所以在开发中最好预估好容量 //数组拷贝 System.arraycopy(src,srcPos:1, dest,destPos:2,length:2); 五个参数: 源(从哪拷贝) 起始位置 目标(拷贝到哪) 起始位置 拷贝长度
9.二维数组
二维数组是一个特殊的一维数组 三维数组是一个特殊的二维数组 静态初始化: int[][] a = { {1,2,3}, {1}, {1,2,3,4,5} }; a[0];表示第一个一维数组 a[0][2];表示第一个一维数组的第一个元素 动态初始化: int[][] a = new int[3][4] 三行四列,3个一维数组,每个一维数组四个元素
10.作业
编写程序:使用一维数组,模拟栈数据结构 要求:1.这个栈可以存储java中的任何引用数据类型 2.在栈中提供push方法模拟压栈(栈满了要求提示信息) 3.在栈中提供pop方法模拟弹栈(栈空了,有提示信息) 4.编写测试程序:new栈对象,调用push方法,pop方法模拟压栈和弹栈动作
package cn.edu.nuc.javase;
import java.util.Scanner;
public class A{
public static void main(String[] args){
B b1 = new B(new Object[3]);
Stack s1 =new Stack();
b1.push("abc");
b1.push("s1");
b1.push("b1");
b1.push("abc");
b1.pop();
b1.pop();
b1.pop();
b1.pop();
}
}
package cn.edu.nuc.javase;
public class B extends Stack{
public void push(Object obj){
if (getStackPoint() >= element.length){
System.out.println("此栈已满,压栈错误");
}
else {
System.out.println(obj+"压栈成功");
setStackPoint(getStackPoint()+1);
element[getStackPoint()-1] = obj;
}
}
@Override
public void pop() {
if (getStackPoint() == 0){
System.out.println("此栈已空,弹栈错误");
}
else {
System.out.println(element[getStackPoint()-1]+"弹栈成功");
element[getStackPoint()-1] = null;
setStackPoint(getStackPoint()-1);
}
}
public B(Object[] element) {
super(element);
}
public B() {
}
}
package cn.edu.nuc.javase;
public class Stack {
Object[] element;
private int stackPoint = 0;
public void push(Object obj){
}
public int getStackPoint() {
return stackPoint;
}
public void setStackPoint(int stackPoint) {
this.stackPoint = stackPoint;
}
public void pop(){}
public Stack(Object[] element) {
this.element = element;
}
public Stack() {
}
}
为某个酒店编写程序:酒店管理系统,模拟订房,退房,打印所有房间状态等功能。 1该系统是酒店前台; 2.酒店中的所有房间使用一个二维数组来模拟。"Room[][] room" 3.酒店中的每一个房间应该是一个java对象:Room 4.每一个房间Room应该有:房间编号、房间类型属性、房间是否是空闲 5.一个Room有 房间号属性;房间类型;是否空闲