标题格式【#】定义的bug
##数组的概念
> 同一种类型数据的集合,其实数组就是一个容器
---
##一维数组
###格式①
> 元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
####示例:
>> int[] arr = new int{5];
>
>与上一个属于同一类的还有下面的另外一种定义格式:
>
>>int arr[] = new int[5];
>
>其中的new用来在容器中产生一个容器实体
>
>示例的解析: 等号左边表示 数组名arr 是一个变量,其类型为 [ ] 类型,其中存放的数据为int类型
###格式②
>元素类型[] 数组名 = new 元素类型[]{元素, 元素, ...};
####示例:
>>int[] arr = new int[]{3, 5, 1, 7};//中括号中不要写长度
>
>>int arr[] = new int[3, 5, 1, 7];
>
>其中的new用来在容器中产生一个容器实体
>
>>int[] arr = {3, 5 ,1 ,7};//通过大括号来标识数组中的元素的个数、内容,这是一种静态的初始化方式
####使用建议:
> 当需要加入数组中的数据明确的时候可以使用这种格式
---
##数组的好处:
> 可以自动给数组中的元素从0开始编号,方便操作这些元素
----
##数组的内存结构
> Java程序在运行时,需要在内存中分配空间,为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理的方式
###堆内存
- 数组和对象,通过new建立的实例都存放在堆内存中
- 每一个实例都有内存地址值
- 实体中的变量都有默认初始化值
> 这个默认的初始化值,具体的默认值是多少,要根据数据类型而定,比如 int 对应 0 、boolean对应 false 、char 对应 ‘\u0000‘ ***相当于空位:空格,其中的u代表unicode码***
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/20150320224429480.png)
备注:其中的地址值 0X0079为一个假设的地址值
修改以上的数组x的指向, x = null;
>![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/20150320234931272.png)
>
>此时,这个x变量和数组就没关系了,这样数组在堆内存中就没有被使用了
>
>**当一个实体在堆内存中没有任何的引用所使用它,我们或java虚拟机就视它为垃圾,这个垃圾不会立刻在内存中被清理掉,而是在不定时的时间内启动一个叫做垃圾回收机制,将这个数组实体在堆内存中清除**
- 实体不再被使用,会在不确定的时间内被垃圾回收器回收
###栈内存
> 用于存储局部变量,当数据使用完,所占空间会自动释放
##练习题
**Q**:经过红色框的操作后,堆中是否存在垃圾值 ?
**A:**
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/20150321000534698.png)
---
##操作数组的常见疑问
###**1.**数组是在编译的时候建立还是在运行的时候建立?
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150327210341.png)
> 现象:
> >从上图可以看出 arr[4] 并不属于 arr 数组,但是没有报错
>解释:
>>说明了,在编译时并没有建立数组,只检查了语法有无错误
>>![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150327211113.png)
>结论:
>>在运行的时候才会在堆内存中去开辟空间分配值
>>![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150327213833.png)
###**2.** 待续
---
##数组的常见操作
###1.获取数组中元素(遍历)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328103459.png)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328103807.png)
###2.获取数组中的最值
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328135613.png)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328135658.png)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328135818.png)
---
###3.排序
####选择排序
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328142140.png)
> 先拿0角标为的值和其他所有位上的值进行比较,谁最小就把谁放在0角标位上,然后接着拿 1 角标上的值和其他位的值进行比较,谁最小就把谁放在1角标位上,依次比下去
规律:
> 第一次比较用了五个箭头,第二次用了四个箭头,依次,回忆以前的知识[for循环嵌套中的尖朝下](http://blog.csdn.net/hi0_o/article/details/45724931)
*****
****
***
**
*
```java
class ArrayTest{
public static void selectSort(int[] arr){
for (int x=0; x<arr.length-1; x++){
for (int y = x + 1; y<arr.length; y++) {
if (arr[x]<arr[y]) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
public static void main(String[] args){
int[] arr = {5, 1, 6, 4, 2, 8, 9};
System.out.println(" 排序前");
printArray(arr);
//排序
selectSort(arr);
System.out.println(" 排序后");
printArray(arr);
}
public static void printArray(int[] arr){
System.out.print("[");
for (int x = 0; x<arr.length; x++) {
if (x!=arr.length-1) {
System.out.print(arr[x]+", ");
} else {
System.out.println(arr[x]+"]");
}
}
}
}
//```这个要去掉【//】然后让这行变为 【```】这样
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/QQ%E6%88%AA%E5%9B%BE20150516154859.png)
> 从上面三张图可以看出,内循环结束一次,最值出现在头角标上
>
>
>
> 选择排序只需要将第二个for循环中的初始化 y 改一改
####冒泡排序
> 相邻的两个元素进行比较,如果符合条件就换位
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331080055.png)
冒泡排序只需要将第二个for循环中的条件 y 改一改
####选择排序与冒泡排序的异同
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331083419.png)
改进
> 从图中还不难看出,换位置的代码是重复使用的,此时可以使用函数来封装成一个功能
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331084324.png)
***最快的排序方法***
**希尔排序(三层循环+位运算)**
**其他排序性能低的原因是:**
>
> 每一次符合条件都会,在数组当中,对数组内部的元素进行位置的置换,而堆内存中换位置,比较消耗资源
**找寻方案:**
>
> 问题就来了,我们能不能说,当两个数需要需要换位置的时候,先不置换他们的位置,我先把他们需要置换位置的的角标以及元素在栈内存中定义两个变量,临时记录下来,当全都比较(此时没有换位置)完了以后,我取最终需要换位置的值就可以了
**就是把堆内存中频繁换位置转移到栈内存中**
---
###4.查找
####普通的根据数值找位置
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331091408.png)
####折半查找
可以提高效率,但是必须保证该数组是有序的数组
#####折半的第一种方式
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331150457.png)
#####折半的第二种方式
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331151229.png)
> 折半到最大值max都小于min的时候,说明没有这个数,返回 -1 作为标志
#####折半的练习
**有一个有序的数组,想要将一个元素 插入到该数组中,还要保证该数组是有序的,如何获取该元素在数组中的位置**
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331200511.png)
######该练习的分析
1. ![列表内容](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331200822.png)
2. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331200933.png)
3. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201206.png)
4. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201302.png)
5. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201513.png)
6. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201801.png)
---
##二维数组
###格式①
> int[][] arr = new int[3][2];
- 定义了名称为arr的二维数组
- 二维数组中有3个一维数组
- 每一个一维数组中有2个元素
- 一维数组的名称分别为arr[0]、 arr[1]、 arr[2]
- 给第一个一维数组的1角标位置赋值为78,写法为:arr[0][1] = 78;
-
###格式②
> int[][] arr = new int[3][]
- 二维数组中有3个一维数组
- 每个一维数组的默认初始化值为 null
- 可以对这三个一维数组分别进行初始化
> arr[0] = new int[3];
> arr[1] = new int[1];
> arr[2] = new int[2];
>可以理解为arr[0]、arr[1]、arr[2]相当于就是变量
**格式①与格式②中等号左边的等价方式还有 int arr[][]、int []arr[]**
###静态初始化方式
> int[][] arr = {{3, 5, 6},{1, 4, 2, 7},{4}};
###示例
###代码
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150402185807.png)
###解析
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150402193920.png)
> 其中的 arrp[1][1] 和 arr[2][2]不再该二维数组中,因为越界了
原本【一维数组】该与【二维数组】位于同一个标题等级的缩进位置,然则不同,所以BUG
就是将这行【##二维数组】改为了【#二维数组】,后面的二维数组的其他部分的标题格式统一减少一个,其他的没有改变
##数组的概念
> 同一种类型数据的集合,其实数组就是一个容器
---
##一维数组
###格式①
> 元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
####示例:
>> int[] arr = new int{5];
>
>与上一个属于同一类的还有下面的另外一种定义格式:
>
>>int arr[] = new int[5];
>
>其中的new用来在容器中产生一个容器实体
>
>示例的解析: 等号左边表示 数组名arr 是一个变量,其类型为 [ ] 类型,其中存放的数据为int类型
###格式②
>元素类型[] 数组名 = new 元素类型[]{元素, 元素, ...};
####示例:
>>int[] arr = new int[]{3, 5, 1, 7};//中括号中不要写长度
>
>>int arr[] = new int[3, 5, 1, 7];
>
>其中的new用来在容器中产生一个容器实体
>
>>int[] arr = {3, 5 ,1 ,7};//通过大括号来标识数组中的元素的个数、内容,这是一种静态的初始化方式
####使用建议:
> 当需要加入数组中的数据明确的时候可以使用这种格式
---
##数组的好处:
> 可以自动给数组中的元素从0开始编号,方便操作这些元素
----
##数组的内存结构
> Java程序在运行时,需要在内存中分配空间,为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理的方式
###堆内存
- 数组和对象,通过new建立的实例都存放在堆内存中
- 每一个实例都有内存地址值
- 实体中的变量都有默认初始化值
> 这个默认的初始化值,具体的默认值是多少,要根据数据类型而定,比如 int 对应 0 、boolean对应 false 、char 对应 ‘\u0000‘ ***相当于空位:空格,其中的u代表unicode码***
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/20150320224429480.png)
备注:其中的地址值 0X0079为一个假设的地址值
修改以上的数组x的指向, x = null;
>![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/20150320234931272.png)
>
>此时,这个x变量和数组就没关系了,这样数组在堆内存中就没有被使用了
>
>**当一个实体在堆内存中没有任何的引用所使用它,我们或java虚拟机就视它为垃圾,这个垃圾不会立刻在内存中被清理掉,而是在不定时的时间内启动一个叫做垃圾回收机制,将这个数组实体在堆内存中清除**
- 实体不再被使用,会在不确定的时间内被垃圾回收器回收
###栈内存
> 用于存储局部变量,当数据使用完,所占空间会自动释放
##练习题
**Q**:经过红色框的操作后,堆中是否存在垃圾值 ?
**A:**
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/20150321000534698.png)
---
##操作数组的常见疑问
###**1.**数组是在编译的时候建立还是在运行的时候建立?
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150327210341.png)
> 现象:
> >从上图可以看出 arr[4] 并不属于 arr 数组,但是没有报错
>解释:
>>说明了,在编译时并没有建立数组,只检查了语法有无错误
>>![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150327211113.png)
>结论:
>>在运行的时候才会在堆内存中去开辟空间分配值
>>![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150327213833.png)
###**2.** 待续
---
##数组的常见操作
###1.获取数组中元素(遍历)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328103459.png)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328103807.png)
###2.获取数组中的最值
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328135613.png)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328135658.png)
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328135818.png)
---
###3.排序
####选择排序
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150328142140.png)
> 先拿0角标为的值和其他所有位上的值进行比较,谁最小就把谁放在0角标位上,然后接着拿 1 角标上的值和其他位的值进行比较,谁最小就把谁放在1角标位上,依次比下去
规律:
> 第一次比较用了五个箭头,第二次用了四个箭头,依次,回忆以前的知识[for循环嵌套中的尖朝下](http://blog.csdn.net/hi0_o/article/details/45724931)
*****
****
***
**
*
```java
class ArrayTest{
public static void selectSort(int[] arr){
for (int x=0; x<arr.length-1; x++){
for (int y = x + 1; y<arr.length; y++) {
if (arr[x]<arr[y]) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
public static void main(String[] args){
int[] arr = {5, 1, 6, 4, 2, 8, 9};
System.out.println(" 排序前");
printArray(arr);
//排序
selectSort(arr);
System.out.println(" 排序后");
printArray(arr);
}
public static void printArray(int[] arr){
System.out.print("[");
for (int x = 0; x<arr.length; x++) {
if (x!=arr.length-1) {
System.out.print(arr[x]+", ");
} else {
System.out.println(arr[x]+"]");
}
}
}
}
//```这个要去掉【//】然后让这行变为 【```】这样
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/QQ%E6%88%AA%E5%9B%BE20150516154859.png)
> 从上面三张图可以看出,内循环结束一次,最值出现在头角标上
>
>
>
> 选择排序只需要将第二个for循环中的初始化 y 改一改
####冒泡排序
> 相邻的两个元素进行比较,如果符合条件就换位
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331080055.png)
冒泡排序只需要将第二个for循环中的条件 y 改一改
####选择排序与冒泡排序的异同
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331083419.png)
改进
> 从图中还不难看出,换位置的代码是重复使用的,此时可以使用函数来封装成一个功能
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331084324.png)
***最快的排序方法***
**希尔排序(三层循环+位运算)**
**其他排序性能低的原因是:**
>
> 每一次符合条件都会,在数组当中,对数组内部的元素进行位置的置换,而堆内存中换位置,比较消耗资源
**找寻方案:**
>
> 问题就来了,我们能不能说,当两个数需要需要换位置的时候,先不置换他们的位置,我先把他们需要置换位置的的角标以及元素在栈内存中定义两个变量,临时记录下来,当全都比较(此时没有换位置)完了以后,我取最终需要换位置的值就可以了
**就是把堆内存中频繁换位置转移到栈内存中**
---
###4.查找
####普通的根据数值找位置
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331091408.png)
####折半查找
可以提高效率,但是必须保证该数组是有序的数组
#####折半的第一种方式
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331150457.png)
#####折半的第二种方式
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331151229.png)
> 折半到最大值max都小于min的时候,说明没有这个数,返回 -1 作为标志
#####折半的练习
**有一个有序的数组,想要将一个元素 插入到该数组中,还要保证该数组是有序的,如何获取该元素在数组中的位置**
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331200511.png)
######该练习的分析
1. ![列表内容](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331200822.png)
2. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331200933.png)
3. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201206.png)
4. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201302.png)
5. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201513.png)
6. ![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150331201801.png)
---
#二维数组
##格式①
> int[][] arr = new int[3][2];
- 定义了名称为arr的二维数组
- 二维数组中有3个一维数组
- 每一个一维数组中有2个元素
- 一维数组的名称分别为arr[0]、 arr[1]、 arr[2]
- 给第一个一维数组的1角标位置赋值为78,写法为:arr[0][1] = 78;
-
##格式②
> int[][] arr = new int[3][]
- 二维数组中有3个一维数组
- 每个一维数组的默认初始化值为 null
- 可以对这三个一维数组分别进行初始化
> arr[0] = new int[3];
> arr[1] = new int[1];
> arr[2] = new int[2];
>可以理解为arr[0]、arr[1]、arr[2]相当于就是变量
**格式①与格式②中等号左边的等价方式还有 int arr[][]、int []arr[]**
##静态初始化方式
> int[][] arr = {{3, 5, 6},{1, 4, 2, 7},{4}};
##示例
###代码
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150402185807.png)
###解析
![这里写图片描述](http://7xj4du.com1.z0.glb.clouddn.com/cnblog-javaseQQ%E6%88%AA%E5%9B%BE20150402193920.png)
> 其中的 arrp[1][1] 和 arr[2][2]不再该二维数组中,因为越界了
原文地址:http://blog.csdn.net/hi0_o/article/details/46671591