目录
3.1数组
3.1.1数组概念
数组是保持固定数目的同一类型的值的容器对象。元素可以是基本类型或引用类型、通过下标来访问元素、长度固定(length)
数组中的每一项称为一个元素,每个元素都由其数字索引访问。如上图所示,编号从0开始。例如, 第9个元素将在索引8处访问。
3.1.2创建数组
由于数组的特殊性,所以创建数组(分配连续空间)需要采用特殊的语法,语法如下:
new 数据类型[长度]
示例:
package com.wxkj.yang;
public class Test02 {
/**
* 注意:数组长度一旦确定即不可改变
* 属性:length 数组的长度
*
* 数组的取值方式:数组的变量名称[元素索引位置]
* 注意:元素索引从零开始,到长度减一位置,如果不在此范围,会造成下标越界异常
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// service();
setElement();
}
public static void init(){
//int[] ints = {10,20};
int[] ints;
ints = new int[5];
//类型[] 数组名称 赋值 创建(新建) 类型[长度]
int[] ints1 = new int[5];
}
public static void service(){
int[] ints = {10,12,45};
// int hashCode = ints.hashCode();
// System.out.println(hashCode);
// int length = ints.length;
// System.out.println(length);
for(int i=0;i<ints.length;i++){
int num = ints[i];
System.out.print(num+" ");
}
}
public static void setElement(){
// int[] ints = {10,12,45};
// ints[0] = 20;
// System.out.println(ints[0]);
int[] ints = {10,12,45};
for(int i=0;i<ints.length;i++){
ints[i] = 21+i;
System.out.print(ints[i]+" ");
}
}
}
3.1.3数组元素的初始化
我们创建了一个数组(同类型的连续空间),并且通过一个引用型变量记录了数组的起始地址。然后 通过引用型变量中的地址就可以使用数组空间,语句如下:
引用型变量名[索引]
3.1.3数组变量声明、数组创建整合
实际使用时可以将数组变量声明、数组创建整合为一条语句。
如:数组类型[] 数组变量名 = new 数组元素类型[5];
数组元素默认值:
整数型为0
浮点型为0.0
字符型为‘\u0000’(不同的系统平台显示结果不同)
布尔类型为false
引用类型为null
也可以创建数组时不指定长度,而使用元素值来取代
数组元素类型[] 数组名 = new 数组元素类型[]{元素0,元素1,....};
数组元素类型[] 数组名 = {元素0,元素1,....};
有几个元素值,数组长度就是几;而且元素默认值是此处给出的值
3.1.4. 数组的使用
-
通过下标访问指定元素
Java语言的数组索引(下标、角标)是从0开始的,数组的下标的最大值长度-1(??)
不要超出索引的范围,如果超出范围出现异常 ArrayIndexOutOfBoundsException
-
获取数组元素的个数 在Java中,所有数组都提供了一个length属性,通过这个属性可以访问到数组的长度
-
遍历数组 依次访问数组中的每一个元素,获取每个下标对应的元素值
简单for循环
public static void main(String[] args) {
int[] ages = new int[5];
//数据元素初始化
for (int i = 0; i < ages.length; i++) {
ages[i] = i;
}
//数据元素获取
for (int i = 0; i < ages.length; i++) {
System.out.println(ages[i]);
}
增强for循环(foreach)
public static void main(String[] args) {
int[] ages = new int[5];
//数据元素初始化,这是没用的,赋值的是age变量,不是数组元素
for (int age: ages) {
age=1;
}
//数据元素获取
for (int age: ages) {
System.out.println(age);
}
}
增强for循环在部分计算机语言中使用的是foreach关键字,Java不支持foreach关键字
增强for循环还可以用来遍历集合元素(Iterable),后面章节学习
3.2数组元素的排序
-
数组排序的必要性
-
在数组 A 中搜索特定值 v
-
查找数组 A 中的最小或者最大值
-
测试唯一性并删除数组中的重复元素
-
计算特定值 v 在数组 中出现多少次
-
获取两个排序数组之间的交集/并集
-
什么是算法
计算的方法,解决问题的方案
3.2.1冒泡排序(Bubble Sort)
每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。
对一个有N个元素(如:5个元素)的数组进行冒泡排序的思路:
-
比较一对相邻元素(如:ages[0]、ages[1])
-
如果大小关系不符合规则(如规则:ages[0]<ages[1]),则交换数据
-
重复步骤1、2,直到数组末尾(最后比对的是ages[3]、ages[4])
-
重复步骤3,每次重复直到所有元素都以排序
package com.wxkj.yang;
public class Test04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums = {2,5,4,8,6,1,3};
int temp = 0;
boolean flag = false;
for(int i=0;i<nums.length;i++){
for(int j=0;j<nums.length-1-i;j++){
if(nums[j]>nums[j+1]){
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
flag = true;
}
}
if(!flag){
break;
}
}
for (int n : nums) {
System.out.print(n+" ");
}
}
}
3.2.2插入排序(Insertion Sort)
将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是 数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将 其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
实现思路: 类似于打扑克时,发牌完成后整理自己手中牌的路子,假定最左侧第一个是排好序的,然后从未 排序元素中取一个元素出来,按序插入到已排序的序列中。
-
初始数据 假设2是排好序的,也是已排序区间有一个元素
/**
* 插入排序法
* 在已经排好顺序的额数组中插入一个元素,数组依然保持原有排列方式
* 1、查找要插入的元素在数组中应该存在位置
* 2、创建新数组,长度为原数组长度加1
* 3、将新元素应该存在位置及之后的元素向后移一个位置
* 4、将新元素插入到其应该存在的位置
*/
public static void chaRu(){
int[] nums = {5,20,14,17,15,82,2,54,1};
Arrays.sort(nums);
// for(int i=0;i<nums.length;i++){
// System.out.print(nums[i]+" ");
// }
int[] nums1 = new int[nums.length+1];
int newNum = 52;
int index = 0;
for(int i=0;i<nums.length;i++){
nums1[i] = nums[i];
}
for(int i=0;i<nums1.length-1;i++){
if(nums1[i]<=newNum&&newNum<=nums1[i+1]){
index = i+1;
int j=nums1.length-1;
for(;j>index;j--){
nums1[j] = nums1[j-1];
}
if(j==index+1){
break;
}
}
}
nums1[index] = newNum;
for (int i : nums1) {
System.out.print(i+" ");
}
}
3.2.3选择排序(Selection sort)
第一次从待排序的数据中选择出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元 素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为 零。
-
初始数据 假设所有数据都是未排序的
public static void xuanZhe(){
int[] nums = {5,20,14,17,15,82,2,54,1};
for(int i=0;i<nums.length;i++){
for(int j=i;j<nums.length;j++){
if(nums[i]>nums[j]){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
System.out.print(nums[i]+" ");
}
}
3.2.4快速排序
只能升序排序
int[] nums = {5,20,14,17,15,82,2,54,1};
Arrays.sort(nums);
// 逆序输出
for(int i=nums.length-1;i>=0;i--){
System.oout.print(nums[i]);
}
3.3 数组元素的查找
3.3.1顺序查找
遍历整个数组,依次把每一位元素和要查找的数据进行比较
public static int chaZhao(int ints[]){
int index = 0;
int value = 10;
boolean falg = false;
for(int i=0;i<ints.length;i++){
if(ints[i] == value){
index = i;
falg = true;
break;
}
}
if(falg == false){
return ints.length+1;
}
return index;
}
3.3.2二分法查找(Binary Search)
二分查找(Binary Search)算法,也叫折半查找算法。前提是数组是有序(升序或者降序)的,将 待查找的元素与中间下标对应的元素比较,如果大于中间下标对应的元素,则去右半部分查找。直到找 到要查找的元素,或者区间被缩小为0。
public static void erFenChaZhao(int[] ints,int num){
Arrays.sort(ints);
int low =0;
int high = ints.length-1;
while(low<=high){
int mid = (low+high)/2;
if(ints[mid] == num){
System.out.print("结果为:"+mid);
return;
}else if(ints[mid]<num){
low = mid+1;
}else{
high = mid-1;
}
}
System.out.println("没找到");
}
3.4关键知识点默
-
eclipse的基本使用
-
数组是保持固定数目的同一类型的值的容器对象
-
数组变量(属于引用型变量<对应于基本类型变量>),int[] arr或者int arr[]
-
创建数组,new int[5]
-
数组创建、数组变量声明整合
-
int[] arr=new int[5];
-
int[] arr=new int[]{1,2,3,4,5};
-
int[] arr={1,2,3,4,5};
-
-
-
数组的使用
-
通过下标访问元素,下标的范围0-长度-1,arr[0],数组元素有默认值
-
使用length属性获取数组的长度
-
遍历数组元素
-
for
-
增强for
-
-
排序:冒泡排序、 插入排序、 选择排序
查找: 顺序查找 二分法查找
通过数组变量理解引用型变量 引用型变量放的是个地址,便于通过一个变量找到多个空间
常见面试题
-
基本数据类型和引用数据类型之间的区别?打印结果是什么?
-
在Java中,声明一个数组过程中,是如何分配内存的?
-
数组的定义方式?
-
说说你知道的数组排序算法? 写个冒泡算法?