我的个人学习打卡笔记
戒言
座右铭:
Ctrl + C 可以复制得了别人的代码,但永远复制不了别人的人生和成功。
改变的确很难,但结果值得努力一试。
学习和工作的目的不仅仅是获得回报,也是自我经验的积累和技术的提升。
技术永远不会止步,止步的只有懈怠的我们。
有的人的确不是天生的将军,但也不是天生的士兵。
前言:
在数据结构和Java基础的学习过程中,数组是一个重要的不可避免的学习要点,在网上充了充电之后写下这篇关于数组的学习笔记,以供参考。
步入正文
一、今日学习
1.数组的概念
数组的定义:数组(Array)是具有相同数据类型的元素的有序集合(因此数组在创建时必须要声明数据类型)。
数组的元素个数代表数组的长度;常用的数组有一维数组和二维数组;
2.数组的初始化
初始化:在内存中为数组容器开辟空间,并将数据存放入容器中的过程。
1).静态初始化
完整格式 : 数据类型 [] 数组名 = new 数据类型 [] {元素1,元素2,元素3......};
范 例 :int [] array = new int []{11,22,33};
简化格式 : 数据类型 [] 数组名 ={元素1,元素2,元素3......};
范 例 :int [] array = {11,22,33};
2).动态初始化
初始化时只指定数组的长度,由系统为数组分配初始值。
格式:数据类型[] 数组名 = new 数据类型[数组长度];
范 例 :int [] array = new int [6];
数组默认初始化值的规律:
整数类型: 默认初始化值0
小数类型:默认初始化值0.0
字符类型:默认初始化值‘/u0000’ 空格
布尔类型:默认初始化值 false
引用数据类型:默认初始化值 null
3).动态静态初始化区别
3.数组的地址值
例:[D@776ec8df 和 [I@776ec8df
解释: [ 表示当前是一个数组 D表示当前数组里面的元素都是double类型 I就表示当前数组里面的元素都是int类型@表示一个间隔符号(固定格式)776ec8df表示数组真正的地址值(十六进制) 在程序运行当中[D@776ec8df这个整体也称为数组的地址值
4.数组元素的访问
格式:数组名[索引];索引和下标、角标一个意思。索引的特点:从0开始,逐个+1增长,连续不间断。
获取数组中的元素:
格式: 数组名[索引]
把数据存储到数组中:
格式: 数组名[索引] = 数据/变量
5.数组的遍历
核心:利用循环遍历整个数组,同时需要先获取数组的长度,数组的长度还需要减一(索引是从零开始的),获取长度的方法:数组名.length
基于数组遍历内容进行数组求和和统计个数:
仍然需要循环结构从而遍历每一个元素同时需要定义一个变量用于存放数组求和后的结果 即定义一个sum名称的变量(变量要初始化)
统计个数也是相同道理,只是加入了一判断语句和count变量(变量要初始化)用于存放个数,在判断语句中,满足判断条件则count变量进行自增一次,不符合则进行下一次遍历。
具体内容参见代码。
6.数组的常见操作
求最值:
max的初始化值可以是数组中的任意一个元素,但不能是0,如果数组中全是负数就导致最大值为0,这与实际情况相违背。代码的优化:当初始化值为数组的零索引时,循环开始条件可以为1,这样就避免自己跟自己比较的那一步。
求和、交换数据、打乱数据等具体详见代码
7.数组的内存图
Java内存分配:
栈:方法运行时使用的内存,比如main方法运行时,进入方法栈中执行—即入栈,执行完方法–即出栈
堆:存储对象或则数组,new来创建,存储在堆内存中
方法区:存储可以运行的class文件
本地方法栈:JVM在使用操作系统功能的时候使用
寄存器:供CPU使用
二、学习笔记
1.代码
代码如下:
数组的定义:
int [] array ; //数据类型 [] 数组名 *常用*
int array [] ; //数据类型 数组名 []
数组的初始化:
静态:定义数组存储三个学生的姓名
String[] array1 = new String[]{"林冲","张飞","孙悟空"};
String[] array1 = {"林冲","张飞","孙悟空"};
动态:定义数组存储50个学生的姓名,根据索引可以手动往里面添加
String[] array1 = new String[50];
System.out.println(array[0]);//打印结果:null
array1[2] = "林黛玉";
System.out.println(array[2]);//打印结果:林黛玉
打印数组的地址值:
System.out.println(array1); //输出 [Ljava.lang.String;@15db9742
数组元素的访问:
int[] arr ={1,2,3,4,5,6};
int number = arr[0];
System.out.println(number);//打印结果:1
System.out.println(arr[1]);//打印结果:2
arr[0] = 100;
System.out.println(arr[0]);//打印结果:100 将数据100存储替换到数组中,原来的1被覆盖掉了
数组的遍历:
for(int i=0;i<=arr.length-1;i++){
System.out.println(arr[i]);
};//打印结果: 1 2 3 4 5 6(这里是横向排列,在实际运行当中是纵向排列的) 在idea编译器里提供了一个快速的遍历方法:数组名.fori
数组的求和:
int sum = 0;
int[] arr={1,2,3,4,5,6};
for (int i=0;i<=arr.length-1;i++){
sum = sum +arr[i];
}
System.out.println(sum);//打印结果:21
数组中统计个数:
int number = 0;
int[] arr={1,2,3,4,5,6,7,8,9,10};
for (int i=0;i<=arr.length-1;i++){
if (arr[i]%3==0) {
number = number + 1;//简写:number++;
}
}
System.out.println("能够被三整除的元素的个数:"+number);
数组中变化数据:
int[] arr={1,2,3,4,5,6,7,8,9,10};//偶数变为二分之一,奇数变为二倍
for (int i=0;i<=arr.length-1;i++){
if (arr[i]%2==0) {
arr[i] = arr[i] / 2;
}
else{
arr[i] = arr[i] * 2;
}
System.out.println(arr[i]); //打印结果:2 1 6 2 10 3 14 4 18 5 补充:代码格式规范要求 每个循环只执行一个目的,多个目的时应使用多个循环 避免在一个循环里面执行多条语句从而增加复杂性。
求数组中的最大值:
int[] arr={33,5,22,64,78,25,5};
int max= arr[0];
for (int i=0;i<arr.length;i++){
if(arr[i]>max){
max = arr[i];
}
}
System.out.println(max);//打印结果:78
求数组中的最小值:
int[] arr={33,5,22,64,78,25,5};
int min= arr[0];
for (int i=1;i<arr.length;i++){
if(arr[i]<min){
min = arr[i];
}
}
System.out.println(min);
动态生成随机(1-100之间)数组并求和:
Random r = new Random(); //生成随机数;这里用到Random类,引用数据类型
int[] arr=new int[10]; //动态初始化数组,创建一个长度为十的数组
for(int i=0;i<arr.length;i++){
int number = r.nextInt(bound:100)+1;//(bound:100)生成的数范围在0-99 所以在后面+1 (bound:边界)固定语法
arr[i] = number;//数组存放随机数
}
int sum = 0;
for(int i=0;i<arr.length;i++){
sum = sum +arr[i];//求和
}
int avg = sum / arr.length;//求平均
int count = 0;//求小于平均数的个数,先定义一个count变量存放个数
for(int i=0;i<arr.length;i++){
if(avg>arr[i]){
count++;
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");//横向打印随机数组
}
交换数组中的数据:
int[] arr = {1,2,3,4,5,6};
for(int i = 0,j = arr.length-1;i<j;i++;j--){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}// 定义了两个变量 首尾同时遍历,当i变量在j变量右边时表示已经对调完因此循环条件为i<j
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]);
}
数组的倒序排列(个人思路):
int[] arr={8,115,45,165,4845,15648,15,54,1564};
int temp=0;
if(arr.length%2==0){
for(int i=0;i<=arr.length/2-1;i++){
temp = arr[i];
arr[i] = arr[arr.length-i-1];
arr[arr.length-i-1] = temp;
}
}//思路:先判断数组的长度,如果是偶数型,例{0,1,2,4} 那么对调时 索引对应如下:0与3,1与2,所以循环到i=1到结束,而{0,1,2,4,6}索引对应如下:0与4,1与3 2索引对应值不变,所以循环到i=1时结束,另外0+3这些对位索引值等于数组的长度减一。具体思路参见代码
else{
for(int i=0;i<=(arr.length-1)/2-1;i++){
temp = arr[i];
arr[i] = arr[arr.length - i-1];
arr[arr.length-i-1] = temp;
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]);
}//以上代码可以正常运行
打乱数组中的数据:
int[] array1 ={1,2,3,4,5};
Random number = new Random();
int temp=0;
for (int i = 0; i < array1.length ; i++) {
int number2= number.nextInt(5);
temp = array1[i];
array1[i]=array1[number2];
array1[number2] = temp;
}
for (int j = 0; j < array1.length; j++) {
System.out.print(array1[j]+" ");
}
2.笔记
1). 数组的理解:可以理解为一个盒子用来放相同属性的物品比如你的玩具箱子里面放的都是玩具。
2). 数组在创建时需要先声明数组的数据类型(容器的类型和存储的数据类型保持一致),int类型的数组里面就不能存放float型数据,虽然定义上说必须是相同数据类型,但在double类型的数组中可以放入int型的数据,因为Java当中存在隐式转换(即从存储范围小的类型到存储范围大的类型)同第三点。
3). int类型的数组容器(boolean × byte √ short √ double ×)double类型的数组容器(byte √ short √ int √ long √ float √ double √ boolean ×)
4). 数组一旦创建完毕,长度就固定无法改变。
5). 索引越界异常:访问索引数超过数组本身的长度。最小索引:0 最大索引:数组长度-1。
6).Random类:引用数据类型 使用格式: Random 名字 = new Random();
7).对入栈 出栈 已经内存分配的个人理解: main方法是程序的入口,最先压栈(入栈),在main方法里的函数会依次按照顺序(由上至下)进入栈区,每个方法的实体化对象在堆区进行创建,在Java语法中new关键字的作用,就是在堆区开辟空间,在栈区中方法先进后出,后进先出。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
三、总结
1.扩展
随机数的生成原理:Java Random.nextInt()方法的理解
随机数的语法
Java内存的分布:内存分配 栈 堆
内存分配视频讲解