Java学习11
Posted Zephyr丶J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习11相关的知识,希望对你有一定的参考价值。
Java学习11
和老师说做软件了,但是失败了
数组
1. java语言中的数组是一个引用数据类型,不属于基本数据类型,数组的父类是Object
2. 数组实际上是一个容器,可以容纳多个元素(数组是一个数据的集合)
3. 数组当中可以存储基本数据类型的数据,也可以存储引用数据类型的数据
4. 数组因为是引用类型,所以数组对象是在堆内存中(数组存储在堆内存中)
5. 对于数组当中,如果存储的是java对象的话,实际上存储的是对象的“引用(内存地址)”,数组中不能直接存储java对象
6. 数组一旦创建,在java中规定,长度不可变(数组长度不可变)
7.数组的分类:一维数组、二维数组、三维数组、多维数组...(一维数组较多,二维数组偶尔使用)
8.所有数组对象都有length属性(java自带的),用来获取数组中元素的个数
9. java中的数组要求数组中元素的类型统一,比如int类型的数组只能存储int类型,数组中存储的元素类型统一
10. 数组在内存方面存储的时候,数组中元素的内存地址(存储的每一个元素都是有规则的挨着排列的)是连续的。数组实际上是一种简单的数据结构
11. 所有的数组都是拿“第一个小方框的内存地址”作为整个数组对象的内存地址。(数组中首元素的内存地址作为数组对象的内存地址)
12.数组每一个元素都有下标,第一个是0,第二个是1....,最后一个元素的下标是:length-1,下标非常重要,因为我们对数组中元素进行存取的时候,都要以下标来进行
13.数组这种数据结构的优点和缺点是什么?
优点:查询/查找/检索某个下标上的元素时效率极高,可以说是查询效率最高的一个数据结构
第一:每一个元素的内存地址在空间存储上是连续的
第二:每一个元素类型相同,所以占用空间大小一样
第三:知道每一个元素的内存地址,知道每一个元素占用空间大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址,直接通过内存地址定位元素,所以数组的检索效率是最高的
缺点:1.由于为了保证数组中的每个元素的内存地址连续,所以在数组上随机删除或增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或向后位移的操作
2.数组不能存储大数据量,因为很难在内存空间中找到一块特别大的连续的内存空间
注意:对于数组中最后一个元素的增删,是没有效率影响的
14.怎么声明/定义一个一维数组?
语法格式:
int[] array1;
double[] array2;
String[] array3;
15.怎么初始化一个一维数组?
静态初始化一维数组:
int[] array = {100,2100,55};
也可以 int array[]={1,2,3}; //C++风格,不建议
动态初始化一维数组:
int[] array = new int[5]; //这里5表示数组的元素个数,每个元素默认值0
// Person类型数组,里面可以存储Person类型对象,以及Person类型的子类型都可以。
Person[][] arr = new Person[2][2];
16. 如果没有数组元素只有6个,而要取第七个,会报错:
ArrayIndexOutOfBoundsException(数组下标越界异常)
17. 什么时候动态初始化,什么时候静态初始化
当创建数组的时候,确定数组中存储哪些具体的数据的时候,采用静态初始化的方式
不确定存储哪些数据的时候,可以动态初始化的方式预先分配内存空间
18.引用数据类型的每个元素的内存空间是4个字节
数组应用
(***)printArray(new int[]{1, 2, 3});
main方法上的“String[] args”有什么用?
分析一下:谁负责调用main方法(JVM)
JVM调用main方法的时候,会自动传一个String数组过来
JVM默认传递过来的这个数组长度为0,不是null
那么这个数组什么时候会有值呢?
其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数会自动被转换为“String[] args”
例如这样运行程序: java ArrayTest02 abc def xyz
那么这个时候JVM会将字符串通过空格的方式进行分离,分离完成后,自动放到“String[] args”数组中,所以main方法上面的String[] args 数组主要是用来接收用户输入参数的
一维数组的扩容
在java开发中,数组长度一旦确定不可变,那么数组满了该怎么办?
数组满了,需要扩容
java中对数组的扩容是:
先新建一个大容量的数组,然后将小容量的数组中数据一个一个拷贝到大数组中,然后小数组对象被垃圾回收
所以数组扩容效率较低,因为涉及到拷贝的问题,所以在以后的开发中,尽量减少数组的拷贝
扩容需要的命令:(例子)
int[] src = {1,11,22,3,4}; //源数组
int[] dest = new int[20]; //目标数组
System.arraycopy(src,1,dest,3,2); //第一个参数:源数组;第二个:拷贝起始位置;三:目标数组;四:目标位置;五:拷贝个数
//拷贝完结果是在dest中,从第三个元素开始,0 0 11 22 0 0....
二维数组
1.二维数组是一个特殊的一维数组,特殊在这个一维数组当中的每一个元素都是一个一维数组。
2.三维数组是一个特殊的二维数组,特殊在这个二维数组中每一个元素都是一个二维数组
3.二维数组静态初始化:
int[][] array = {{1,1,1},{2,3,4,5},{0,0,0,0}};
4.二维数组的length属性是 一维数组的个数; array.length = 3; array[0].length=3
常见的算法
1.排序算法:
冒泡排序算法
选择排序算法
2.查找算法:
二分法查找
3.算法在java中不需要精通,因为在java中已经封装好了,要排序调用方法就行,例如:在java中提供了一个数组工具类:
java.util.Arrays
Arrays是一个工具类。工具类中的方法大部分都是静态的
其中有一个sort()方法,可以排序。静态方法,直接用类型调用就可以了
1.冒泡排序法:
相邻位置的数据比较,将较大的值放在右边;
每循环一次,将最大的值放在最右边(冒出最大的气泡);
2.选择排序法:
每一次从这堆参与比较的数据中找出最小值,拿着这个最小值和参与比较的最前面的元素交换位置
选择排序比冒泡排序的效率高,高在交换位置的次数上
关键在于:怎么找一堆数据中的最小的
先假设最左面的元素最小,将其下标存储在临时变量中,然后分别与后面的元素进行比较,如果比这时的最小元素小,则下标变为该元素的下标;当比较完一轮后,将最小元素交换到最前面;
因此交换次数等于元素个数减1
二分法查找
1.二分法查找是建立在排序的基础之上的
2.二分法查找效率要高于“一个一个找”的查找方式
3.二分法查找原理?
10(下标为0)23 56 89 100 111 222 235 500 600(下标为9)
目标找出600的下标:
(0+9)/2=4;(中间元素的下标)
arr[4]为100,由于100<600,说明被查找的元素在100的右边
那么此时开始的下标变为:4+1
(5+9)/2=7
arr[7]为235
......
4.二分法查找的终止条件是:一直折半,直到中间的那个元素恰好是被查找的元素
可以调用java.util.Arrays中的binarySearch方法和sort方法对数组进行查找和排序;(查看帮助文档)
java.util.Arrays中的方法都是静态的
以上是关于Java学习11的主要内容,如果未能解决你的问题,请参考以下文章
错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段
错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段
11.按要求编写Java应用程序。 创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的(代码片段