package array;
import java.util.Arrays;
public class ArrayTest {
static String[] strs = new String[5];//声明一个数组strs并初始化
public static void main(String[] args) {
int[] arr = new int[] {7,5,8,2};//声明一个数组arr并初始化
System.out.println(arr);//输出arr数组的地址
System.out.println(strs[2]);//输出strs数组的第三个元素
System.out.println(arr[2]);//输出arr数组的第三个元素
String str1 = new String("hello");//声明并定义一个字符串str1并赋值hello
strs[0] = str1;//将str1的内容赋值给strs数组的第一个元素
System.out.println(strs[0]);//输出strs数组的第一个元素
System.out.println("==================");
//遍历strs,以数组方式输出
for(int i = 0;i<strs.length;i++) {
if(i==0) {
System.out.print("["+strs[0]+",");
}else if(i==strs.length-1) {
System.out.print(strs[i]+"]");
}else {
System.out.print(strs[i]+",");
}
}
System.out.println("\t");
System.out.println("==================");
//遍历arr
//先new一个对象
ArrayTest at = new ArrayTest();
//调用遍历的方法,传入想要遍历的数组
at.showIntArray(arr);
//使用jdk内置的数组打印方法,适合只查看数组内容
String result = Arrays.toString(arr);
System.out.println(result);
}
//自定义一个int数组的遍历方法
public void showIntArray(int[] array) {
for(int i = 0;i<array.length;i++) {
if(i==0) {
System.out.print("["+array[0]+", ");
}else if(i==array.length-1) {
System.out.print(array[i]+"]");
}else {
System.out.print(array[i]+", ");
}
}
}
}
package array;
import java.util.Arrays;
public class ArrayTest2 {
static int[] array = new int[] {2,4,6,8,1,3,5};//准备对象来调用成员方法
//准备一个计数的变量size
static int size;
public static void main(String[] args) {
//new一个对象命名为at2,用来调用ArratTest2中的方法
ArrayTest2 at2 = new ArrayTest2();
//new一个对象命名为at,用来调用ArratTest中的方法
ArrayTest at = new ArrayTest();
//判断原array和经过拷贝方法后的at2.copyArray(array)是否占用同一块内存
//即是否经过复制生成新的数组
if(array == at2.copyArray(array)) {
System.out.println("地址相同,是同一块内存");
}else {
System.out.println("地址不同,不是同一块内存");
}
//用ArrayTest中的方法遍历ArrayTest2中拷贝生成的新数组
at.showIntArray(at2.copyArray(array));
System.out.println("\t");//换行
System.out.println(array);//打印原数组array的地址
System.out.println(at2.copyArray(array));//打印拷贝后的数组的地址
System.out.println("================");
//打印array的长度
System.out.println(array.length);
//打印array在extendArray方法执行后的长度
//输入了一个数组,执行方法中的长度翻倍
System.out.println(at2.extendArray(array).length);
//打印array在extendArray方法执行后的长度
//输入了一个数组和int类型的数字,执行把int数组扩容int数字个长度
System.out.println(at2.extendArray(array,20).length);
System.out.println("================");
array = new int[5];//new一个新的数组,长度为5,并将array指向这个新数组
//用for循环来向数组array中添加数
for(int i=1;i<100;i++) {
//执行add方法
at2.add(i);
}
//用Arrays方法打印数组array
System.out.println(Arrays.toString(array));
System.out.println("==============================");
//二维数组的遍历
int [][] two = new int[3][3];
for(int i=0;i<two.length;i++) {
for(int j=0;j<two.length;j++) {
System.out.print(two[i][j]+"\t");
}
System.out.println();
}
}
//方法:数组的拷贝,以int数组为例
//要求:传入一个数组,得到该数组的拷贝数组(两个数组的地址是不一样的)
public int[] copyArray(int[] oldArray) {
//第一步:声明并初始化一个新数组newArray并将oldArray的长度赋给newArray
int[] newArray = new int[oldArray.length];
//第二步:把oldArray里的每一项取出来对应的赋值给newArray里的每一项
for(int i=0;i<oldArray.length;i++) {
newArray[i] = oldArray[i];
}
return newArray;
}
//方法:数组的扩容
//要求一:写一个方法,传入一个int数组,每执行一次,扩容一倍
public int[] extendArray(int[] oldArray){
//定义一个int型len,使它等与老数组的长度
int len = oldArray.length;
//将新数组的长度初始化为len的二倍,即扩容二倍
int[] newArray = new int[len*2];
//用for循环来将老数组的数据拷贝到扩容后的新数组中
for(int i=0;i<oldArray.length;i++) {
newArray[i] = oldArray[i];
}
return newArray;
}
//要求二:写一个方法,传入一个int数组和一个int数字,把int数组扩容int数字个长度
public int[] extendArray(int[] oldArray,int count){
//定义一个int型len,使它等与老数组的长度
int len = oldArray.length;
//将新数组的长度初始化为len+count,即扩容int数个
int[] newArray = new int[len+count];
//用for循环来将老数组的数据拷贝到扩容后的新数组中
for(int i=0;i<oldArray.length;i++) {
newArray[i] = oldArray[i];
}
return newArray;
}
//方法:需求:给at2声明一个add方法,无限向array中添加int数
//应该先判断array是否已经满了
//思路一:array是从空的开始添加
//可以准备一个计数的变量size,每添加一次就记录一次,
//当计数器等于array的初始化长度时,则证明满了
//先声明一个add方法
public void add(int i){
//判断可计数变量size是否等于array的长度
//如果等于,对array执行扩容方法,长度+1,并使array指向新地址
if(size == array.length){
array = extendArray(array,1);
}
//将新获得的i赋值给array的第size下标的元素,实现添加int数
array[size] = i;
size++;
}
//根据下标去删除
//删除的时候先判断是否为最后一个元素,如果是直接变为0
//如果不是最后一个元素,要注意把后面的元素向前移位
public void remove(int index){
}
}
可以理解为数组中保存了数组的类型
{{1,2,3},
{4,5,6},
{7,8,9}}
二维数组的定义方式
int[][] array;
二维数组初始化
new int[2][3];
new int[2][];
//可以不指定列,但是一定要指定行
访问
int[2][3] = 10;
int[0][0] = 1;
二维数组实例:
提供一个需求:
我们有一个三层楼的公寓,每一层三间房子,我们现在有六个学生,第一层住两个学生,这两个学生不想连着住,第二层住三个学生,第三层住一个学生,使用二维数组模拟一下住户图
先建立一个student类:
package com.briup.day06;
public class Student {
//提供成员
//属性 ---> 变量
String name;
int age;
String gender;
//第一次使用一下构造器
public Student() {
//如果一个类中没有定义任何的构造器
//则默认提供一个没有参数的构造器
}
//给一个可以放名字的构造器
public Student(String name) {
this.name = name;
}
//全参构造器
public Student(String name,int age,String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
//方法
public void study() {
}
public void show() {
}
//设置名字的方法
public void setName(String newName) {
name = newName;
}
//获取名字的方法
public String getName() {
return name;
}
}
然后创建Test.java
package com.briup.day06;
public class Test {
public static void main(String[] args) {
Student[][] room = new Student[3][3];
//Student的数组中保存的一定是Student的对象
Student s1 = new Student("tom");
Student s2 = new Student("jerry");
Student s3 = new Student("ben");
Student s4 = new Student("ken");
Student s5 = new Student("lisa");
Student s6 = new Student("ella");
//分配房间
room[0][0] = s1;
room[0][2] = s2;
room[1][0] = s3;
room[1][1] = s4;
room[1][2] = s5;
room[2][0] = s6;
//输出房间的分配图
//如果有人居住,则输出名字
//如果没有人居住,则输出无人居住
for(int i=0;i<room.length;i++) {
for(int j=0;j<room.length;j++) {
//三目运算符的使用场景
System.out.print((room[i][j]==null?"无人居住":room[i][j].getName())+"\t");
}
System.out.println();
}
}
}
运行出的结果为
tom 无人居住 jerry
ben ken lisa
ella 无人居住 无人居住
1.使用之前确保jdk是好的
2.eclipse放在非中文非c盘的路径下
3.准备一个你喜欢的找得到的英文路径,创建一个文件夹javacode,作为工作空间(workplace)
4.开始第一个java工程
new—>project—>java project
5.新建一个包
右键src—>new—>package,输入包名
6.在对应的包里新建类
例子:
数组a [8,3,1,5,3,2,6];
升序数列:[1,2,3,3,5,6,8];
降序数列:[8,6,5,3,3,2,1];
相邻的两个两个进行比较,根据大小位置交换位置,过程为:
[8,3,1,5,3,2,6]
//第一次循环
[3,8,1,5,3,2,6]
[3,1,8,5,3,2,6]
[3,1,5,8,3,2,6]
[3,1,5,3,8,2,6]
[3,1,5,3,2,8,6]
[3,1,5,3,2,6,8]
//第二次循环
[1,3,5,3,2,6,8]
[1,3,3,5,2,6,8]
[1,3,3,2,5,6,8]
//第三次循环
…
直到
[1,2,3,3,5,6,8]
数组中进行对比的下标的组合
0 1
1 2
2 3
3 4
4 5
5 6
用程序来实现:
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i){
if(a[j]<a[j+1]){
//交换位置(降序)
//不使用第三方变量
//1.+=
a[j] = a[j]+a[j+1];
a[j+1] = a[j] - a[j+1];
a[j] = a[j] - a[j+1];
//2.^
a[j] = a[j]^a[j+1];
a[j+1] = a[j]^a[j+1];
a[j] = a[j]^a[j+1];
//使用第三方变量
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
实例:
package com.briup.test;
//冒泡排序
import java.util.Arrays;
//ctrl+shift+o:监测需要导入的包和删除未使用的包
public class SortTest {
//定义两个常量
static Boolean UP = true;
static Boolean DOWN = false;
public static void main(String[] args) {
int[] array = new int[] {8,3,1,5,3,2,6};
System.out.println("排序前:");
System.out.println(Arrays.toString(array));
//排序,以升序为例
// array = sort(array,UP);
// array = sort(array,DOWN);//如果是降序
//jdk有提供的自然排序方法
// Arrays.sort(array);
for(int i=0;i<array.length-1;i++){
for(int j=0;j>array.length-1-i;j++) {//如果需要降序,将循环条件改为j
if(array[j]<array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
System.out.println("排序后:");
System.out.println(Arrays.toString(array));
}
//排序算法的封装
public static int[] sort(int[] array,boolean flag) {
//判断一下是升序还是降序
if(flag) {
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-1-i;j++) {
if(array[j]>array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}else {
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-1-i;j++) {
if(array[j]<array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
return array;
}
}
剩下还有快速排序,希尔排序,插入排序,选择排序,今天暂时没有涉及到.
类和对象的关系
类是一个相同属性和行为的对象的集合,只是起描述作用
对象是一个类的实际表现
清楚一个类有哪些内容
public class 类名{
类中有哪些成员?
变量
方法:
修饰符:
返回值:
方法名:
参数列表:
抛出异常:throws
方法体:
构造器.一般类中准备一个无参构造器和全参构造器
package com.briup.test;
package com.briup.test;
import sun.security.provider.certpath.IndexedCollectionCertStore;
//使用数组来模拟栈的数据结构
//先进后出
//添加元素从尾部开始添加
//删除元素从尾部开始删除
public class Stack {
int[] data; //储存数据
int size;//保存栈的实际长度
//使用构造器做初始化
public Stack() {
data = new int[10];
}
public Stack(int length) {
data = new int[length];
}
//入栈的方法
public void in(int i) {
//判断栈是否溢出
if(size == data.length) {
System.out.println("栈溢出,请检查");
}
data[size++] = i;
//size++;
}
//出栈的方法
public int out() {
//判断栈是不是空了
if (size == 0) {
System.out.println("栈已空,无数据可出");
}
int temp = data[size-1];
data[size-1] = 0;
size--;
return temp;
}
//修改栈内指定位置的元素
public void change(int index,int number) {
//判断index是否再size的范围
if (index<size) {
data[index] = number;
}else {
System.out.println("输入索引有误");
}
data[index] = number;
}
//获取栈的长度
public int size() {
return size;
}
//输出栈的内容
public void show() {
for(int i=0;i<size;i++) {
System.out.println("当前栈中第"+(i+1)+"个元素是:"+data[i]);
}
}
}
今天的内容感觉比昨天的要简单一些,接受起来相对比较容易,可能是因为之前没有学过数组的相关内容的原因,今天自习时间都用来回顾昨天的内容了,到现在还是有一些地方一知半解,得利用这个周末来好好理清一下数组的相关内容.今天是第一天开始使用工具,也是深深感受到了工具的强大,明天加油!