数组
1.数组的Arrays类
//数组的工具类java.util.Arrays
API提供了一个Arrays供我们使用,对数据对象进行一种基本的操作
具有以下常用功能:
- 给数组赋值:fill方法
- 对数组排序:sort方法升序
- 比较数组:equals方法比较数组中元素是否相等
- 查找数组元素:binarySearch对排序好的数组进行二分查找
代码示例:
int[] a = {6,4,8,2,9,45,21};
int[] b = {50, 50, 50, 50, 50, 50, 50};
System.out.println(Arrays.toString(a));//打印数组元素
Arrays.sort(a);//排序升序
System.out.println(Arrays.toString(a));
System.out.println(Arrays.binarySearch(a,8));//查找
Arrays.fill(a,50);//全部赋值
System.out.println(Arrays.toString(a));
System.out.println(Arrays.equals(a,b));//判断数组是否完全相等
除此之外,打开JDK帮助文档,搜索Arrays可以看到更多方法
排序:总共有八大排序
1、冒泡排序
外层冒泡轮数,内层一次比较
时间复杂度为O(n*n)
代码:
public static void main(String[] args) {
int[] a = {4,2,1,87,54,90,65,43,23,44,65,78,54};
System.out.println(a.length);
sort(a);
System.out.println(Arrays.toString(a));
}
//冒泡排序
//1、比较数组中两个相邻的元素,如果第一个数大于第二个数,则交换两数
//2、每一次比较都会产生一个最大或最小的数
//3、下一轮则可以减少一次排序
//4、依次循环,直到结束
public static void sort(int[] a){
int t = 0;
for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - 1 - i; j++) {
if(a[j]>a[j+1]){
t = a[j+1];
a[j+1] = a[j];
a[j] = t;
}
}
}
}
输出结果:
13
[1, 2, 4, 23, 43, 44, 54, 54, 65, 65, 78, 87, 90]
思考:如何优化?
2、稀疏数组
1、需求
编写五子棋游戏中,有存盘退出和续上盘的功能
分析:该二维数组很多默认值是0,记录了很多没有意义的数据
解决:稀疏数组
稀疏数组介绍:
1、一个数组中大部分元素为0,或者为同一值的数组,可以使用稀疏数组来保存该数组
2、处理方式:记录数组几行几列,多少个不同值
3、把具有不同的元素和行列及值记录在一个小规模数组中,从而缩小程序的规模
代码实现:
//稀疏数组
public class ArrayDemo08 {
public static void main(String[] args) {
//创建一个二维数组11*11 0:无棋子 1:黑棋 2:白棋
int[][] a = new int[11][11];
a[1][2] = 1;
a[2][3] = 2;
//输出原始数组
System.out.println("输出原始数组");
for (int i = 0; i < a.length; i++) {
for (int i1 = 0; i1 < a.length; i1++) {
System.out.print(a[i][i1]+"\t");
}
System.out.println();
}
//转化为稀疏数组
//获取有效值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(a[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数"+sum);
//创建一个稀疏数组的数组
int[][] b = new int[sum+1][3];
b[0][0] = 11;
b[0][1] = 11;
b[0][2] = sum;
//遍历二维数组,将非零的值存放到稀疏数组中
int m = 1;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(a[i][j]!=0){
b[m][0] = i;
b[m][1] = j;
b[m][2] = a[i][j];
m++;
}
}
}
for (int i = 0; i < b.length; i++) {
for (int i1 = 0; i1 < b.length; i1++) {
System.out.print(b[i][i1]+"\t");
}
System.out.println();
}
//还原稀疏数组
int[][] c = new int[b[0][0]][b[0][1]];
int n = 1;
for (int i = 0; i < m-1; i++) {
c[b[n][0]][b[n][1]] = b[n][2];
n++;
}
for (int i = 0; i < c.length; i++) {
for (int i1 = 0; i1 < c.length; i1++) {
System.out.print(c[i][i1] + "\t");
}
System.out.println();
}
}
}
输出结果:
输出原始数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
有效值的个数2
11 11 2
1 2 1
2 3 2
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
分析:代码实现将原始数组转化为稀疏数组,稀疏数组第一列存储行,第二列存储列,第三列存储有效值
第一行是总的行列与有效值个数,其他是各个有效值所在的位置及有效值的值
面向对象编程(OOP)
1、初识面向对象
面向过程与面向对象
面向过程思想:
- 步骤清晰简单,第一步做什么,第二部做什么
- 面向过程适合处理一些较为简单的问题
- 面向对象思想:物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对分类进行独立思考。最后才对分类下的细节进行面向过程思考。面向对象适合处理复杂的问题,适合处理多人协作的问题
- 属性+方法=类
- 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统,但是,具体到微观操作,仍然需要面向过程的思路去处理
//方法在类里面,Demo01就是一个类,用class修饰
//一个真正的程序里面只有一个main方法
//return代表方法结束,返回一个结果,可能为空,也可能是其他类型
什么是面向对象:
-
面向对象编程(Object Oriented Programming)
-
本质:以类的方式组织代码,以对象的形式封装数据
-
抽象:
三大特性:
-
封装:将数据包起来,不暴露。留一个接口给外部访问
-
继承:子类得到父类的东西
-
多态:同一个事物有多重形态
2、方法回顾和加深
方法的定义
-
修饰符:public,static等等
-
返回类型
break:跳出switch,结束循环
return:代表方法结束
-
方法名:符合命名规范 见名知意
-
参数列表:参数类型,参数名,参数个数
-
异常抛出
像之前的xception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 11 at com.wangchaohong.array.ArrayDemo01.main(ArrayDemo01.java:17)
数组越界异常
-
方法的调用:递归,自己调用自己
-
非静态方法
static与类一起加载的//修饰符有static的可以直接调用
类实例化之后才存在先有对象后有类
Demo03 demo03 = new Demo03(); int sum = demo03.add(2,3);//非静态方法调用,new一个对象,2,3为实参 System.out.println(sum); } public int add(int a, int b){//形参 return a+b; }
//静态方法,加static,非静态方法不加static public class Demo02 { public static void main(String[] args) { //实例化这个对象 //对象类型 对象名 Student student = new Student(); student.say(); } //static与类一起加载的 //类实例化之后才存在 //a与b不加static无法相互调用,当new了对象可以调用 public void a(){ } public void b(){ } }
我认为类进行实例化就是对象,相当于结构体与结构体变量
-
形参和实参
-
值传递和引用传递
值传递:输出a的值没有发生改变
package com.oop; //值传递 public class Demo04 { public static void main(String[] args) { int a = 5; System.out.println(a); } public static void change(int a){ a = 10;//没有返回值 } }
引用传递:
//引用传递:对象,本质还是值传递 public class Demo05 {//一个类里只能有一个public class public static void main(String[] args) { Person person = new Person(); System.out.println(person.name); change(person); System.out.println(person.name); } public static void change(Person person){//传递对象改变了其值,传递的是地址 person.name = "wangchaohong";//改变了其值,一个具体的人可以改变属性 } } class Person {//定义一个person类,下面的一个属性 String name;//null } //数组的工具类java.util.Arrays
感觉值传递与引用就像是只传递值和传递了地址
-
this关键字