1.数组基础

1.什么是数组:

          同一类型数据的集合,就是一个容器。

2.数组的好处:

          可以自动为数组中的元素从零开始编号,方便操作这些数据。

3.格式:  (一旦创建,必须明确长度)

         格式1:

             元素类型   [ ]  数组名  =  new  元素类型  [元素个数即数组的长度];

             示例:int[] array = new int[5];

         格式2:

             元素类型 [ ]  数组名 =  new 元素类型 [ ]{元素1,元素2…};

             示例:int[] array = new int[]{1,2,3,4,5};

                       int[] array = {1,2,3,4,5};

数组有默认值:(不用初始化也可以使用,因为数组new int[5]是堆内存中的实例,堆内存中的实例都有默认的初始值)

如int[] array = new int[5];

System.out.pritln(array[0]);        

结果为0。

常见错误:

1.数组下标越界异常

int[] arr = new int[3];

System.out.println(arr[3]);

说明:编译不会报错,运行时报错。ArrayIndexOutOfBoundsException

          当访问数组中不存在的下标时,就会报此异常。

2.空指针异常

int [] arr = new int[3];
arr = null; System.ou.println(arr[0]);

说明:同样编译不会报错,运行时报错。NullPointeException

         空指针异常,当引用型变量没有任何实体指向时,如果访问该变量,就会报此异常。

 

2.数组的常见操作

1.遍历

打印数组中的所有元素

int[] arr = {43,6,645,43,3,2,1,54};

for (int i=0; i<arr.length; i++) {
System.out.print("arr["+i+"]:"+arr[i]+";");
}

2.获取最值

获取最大值

public int getMax(int[] arr){

    int max = arr[0];//记录元素值
for (int i = 1; i<arr.length; i++) {
if(arr[i]>max){
max = arr[i];
}
} return max; }

 

public static int getMax(int[] arr){

    int maxIndex = 0;//记录元素下标
for (int i = 1; i<arr.length; i++) {
if(arr[i]>arr[maxIndex]){
arr[maxIndex] = arr[i];
}
}
return arr[maxIndex];
}

3.排序

java API提供了排序的方法:java.util.Arrays.sort(arr);

1.选择排序法

原理:

代码:

public void selectSort(int[] arr){
int temp;
for (int i = 0; i<arr.length-1; i++) {
for (int j = i+1; j<arr.length; j++) {
if(arr[i]>arr[j]){//交换
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}

 

2.冒泡排序法

原理:

代码:

public static void bubblesort(int[] arr){
int temp;
for (int i = 0; i<arr.length-1; i++) {
for (int j = 0; j<arr.length-1-i; j++) {
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
} }

*封装交换代码:

//交换数组中两个元素的位置
public static void swap(int[] arr, int a, int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = arr[a];
}

 

选择排序性能优化:

如上图所示,由于数组储存于堆内存中,重复多余的交换位置会带来多余的运算,所以想到定义中间变量来记录每次得到的最小值,再进行对应位置的交换,这样能减少交换的次数,提高效率。

代码:

public static void selectSort_2(int[] arr){

        for (int i = 0; i<arr.length-1; i++) {
int num = arr[i];
int index = i;
for (int j = i; j<arr.length; j++) {//内循环负责查找余下元素中的最小元素
if(num>arr[j]){
num = arr[j];//用num记录最小的元素
index = j;//用index记录最小元素的下标
}
}
            if(index!=i){
swap(arr, i, index);//交换最新要要排序的元素和查找到的最小元素位置
            }
}
}

          

4.查找

1.查找某元素第一次出现的位置

代码:

public static int getIndex(int[] arr , int num){
for (int i = 0; i<arr.length; i++) {
if(num==arr[i]){
return i;
}
}
return -1;
}

2.二分查找(折半查找)

**适用于有序数组

java API也提供了二分查找 。java.util.Arrays.binarySearch(int[],target);如果存在,返回下标,如果不存在,返回 -插入点-1

代码: 

1.递归法:

public static int find(int arry[], int target, int beginIndex, int endIndex) {
if (beginIndex > endIndex) {
return -1;
}
int middleIndex = (beginIndex + endIndex) / 2;
if (arry[middleIndex] == target) {
return middleIndex;
} else if (arry[middleIndex] < target) {
beginIndex = middleIndex + 1;
} else
endIndex = middleIndex - 1;
return find(arry, target, beginIndex, endIndex);
}

2.while循环 

1.

public static int halfSearch(int[] arr, int target){
int min = 0, max = arr.length-1, mid = (min + max)/2;
while(arr[mid]!=target){//
if(target>arr[mid])
min = mid + 1;
else if(target<arr[mid])
max = mid - 1; if(max<min){
return -1;
}
mid = (min + max)/2;
}
return mid;
}

 

2.

public static int halfSearch(int[] arr, int target){
int min = 0, max = arr.length-1, mid; while(max>=min){ mid = (min + max)/2;
if(target>arr[mid])
min = mid + 1;
else if(target<arr[mid])
max = mid - 1;
else
return mid; }
return -1;
}

 

面试题:给定一个有序的数组,如果往数组中存储一个元素,并保证这个数组还是有序的,那么这个元素的存储的角标如何获取。

答案:直接使用上面的二分查找的函数,把返回-1改成返回min即可。

3.二维数组

格式1:int[][] arr = new int[3][2];

  • 定义了名称为arr的二维数组
  • 二维数组中有3个一维数组
  • 每一个一维数组有2个元素
  • 一维数组的名称分别是arr[0],arr[1],arr[2]
  • 给第一个一维数组1下标位赋值为78的写法是:arr[0][1]=78;

格式2:int[][] arr = new int[3][];

  • 二维数组中有3个一维数组
  • 每一个一维数组都是默认初始化值null
  • 可以对这3个一维数组分别进行初始化

       arr[0] = new int[3];

       arr[1] = new int[1];

       arr[2] = new int[2];

格式3:int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};

 

考虑如下代码:

int[][] arr = new int[3][2];
System.out.println(arr);//[[I@6dc57a92
System.out.println(arr[0]);//[I@3ff23f8b
System.out.println(arr[0][0]);//0 int[][] arr2 = new int[3][];
System.out.println(arr2);//[[I@3929df79
System.out.println(arr2[0]);//null
System.out.println(arr2[0][0]);//NullPointerException

说明:

第一种定义方式:在栈内存中保存一个arr的变量,用来记录二维数组在堆内存中的地址值。在堆内存中会创建一个二维数组,开辟三个连续的空间用来保存三个一维数组的首地址值。堆内存中还会有三个对应的一维数组的实体,每一个一维数组的每一个元素默认初始化值为0.

第二种定义方式:在栈内存中保存一个arr的变量,用来记录二维数组在堆内存中的地址值。在堆内存中会创建一个二维数组,开辟三个连续的空间默认初始化值为null。

 

二维数组的长度的获取:

二维数组的长度用arr.length获取,得到的是二维数组中一维数组的个数。如:

int [][] arr = new int[3][2];

arr.length的值为 3。

arr[0].length获取的是第一个一维数组的长度。

----------完----------

by_世界是我的床

[java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组的更多相关文章

  1. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  2. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  3. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  4. java学习笔记--java中的基本数组[5]

    java基础很重要, 今天呆家看java视频,顺便总结前几周看的java书籍,做一下简单的总结:1:数组的声明,2:数组的赋值: 3:数组的方法: 声明一个数组主要有两种方式: //类型 []数组名字 ...

  5. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

  6. Java学习笔记-Java概述和环境配置

    基础常识 软件:一系列按照特定顺序组织的计算机数据 和指令的集合 常见的软件: 系统软件:如:DOS,windows,Linux等 应用软件:如:扫雷,迅雷,QQ等 软件的出现实现了人与计算机之间的更 ...

  7. Java学习笔记1(基础)

    计算机语言和Java 计算机语言主要由一些指令(包括数字.符号和语法等)组成,可以分为机器语言.汇编语言.高级语言三大类.Java是一种高级计算机语言,是一种可以编写跨平台应用软件.完全面向对象的程序 ...

  8. Java学习笔记——java基础

    2020.9.1 学习来自 https://www.liaoxuefeng.com/wiki/1252599548343744/1255883729079552 一.变量和数据类型 基本数据类型 基本 ...

  9. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

随机推荐

  1. leetcode || 53、Maximum Subarray

    problem: Find the contiguous subarray within an array (containing at least one number) which has the ...

  2. mybatis 关联映射传递多参数方法

    <resultMap type="com.secoo.my.bean.OrderItemComment" id="orderItemResult"> ...

  3. Mac电脑没有声音,苹果电脑没有声音怎么办

      对于使用 Windows 系统电脑的小伙伴来说,可能有很多人会遇到电脑没有声音的问题.苹果 Mac 电脑也会出现没有声音的问题,不过相对较少.这里以我遇到的一个没有声音的问题为例,简单介绍处解决的 ...

  4. IIS 之 添加绑定域名 或 设置输入IP直接访问网站

    1.打开IIS,右键站点 → 编辑绑定,弹出“网站绑定”窗口,如下图:   2.点击“添加”,弹出“添加网站绑定”窗口,如下图:   注意:若想输入 IP 地址直接访问,则可以有以下两种设置任一均可: ...

  5. android开发之路06(浅谈单例设计模式)

    设计模式之单例模式: 一.单例模式实现特点:①单例类在整个应用程序中只能有一个实例(通过私有无参构造器实现):②单例类必须自己创建这个实例并且可供其他对象访问(通过静态公开的访问权限修饰的getIns ...

  6. Mac Yosemite OS10.10 Apache 虚拟主机设置

    昨天睡觉前开始挂机下载OS10.10 Yosemite,早上6点半就很兴奋地起来安装新系统了.安装完成后打开界面,感觉真的大不一样了,很优很美,很喜欢. 在下载各种更新,体验各种新功能的同时,我也不忘 ...

  7. SQL Server select into/bulkcopy用法

    select into/bulkcopy用法 一.背景 如何提升批量插入效率,各位看官,瞧好了! exec sys.sp_dboption '数据库名','select into/bulkcopy', ...

  8. Hibernate的回调与拦截

    在Hibernate中,有两种方式可以捕获实体对象的GRUD操作并执行相应的处理 Hibernate回调(org.hibernate.classic.Lifecycle接口): //Provides ...

  9. 历经曲折的freescale

    从来没有想到自己在大学最信任的队友会突然放弃,,为了这个,,我可以说放弃了很多,,这几天可以我也不知道怎么办了,,我想不通的是为什么可以这样,为什么可以这么不负责任,,为什么这么自私,,这些我永远都不 ...

  10. (转载)ConcurrentHashMap 原理

    集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区 (Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章 ...