# JAVA之旅(三)——數組,堆棧內存結構,靜態初始化,遍歷,最值,選擇/冒泡排序,二維數組,面向對象思想
* * *
> 我們繼續JAVA之旅
## 一.數組
### 1.概念
> 數組就是同一種類型數據的集合,就是一個容器
* 數組的好處:可以自動給數組中的元素從0開始編號,方便操作這些元素
> 數組的格式
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 格式:元素類型 [] 數組名 = new 元素類型[元素個數]
* 定義一個可以存儲3個整數的容器
*/
int[] x = new int[3];
}
}
~~~
### 2.內存結構
> JAVA程序在運行時,需要在內存中分配空間,為了提高效率,有對空間進行不同區域的劃分,因為每一片區域都有特定的處理數據方式和內存內存管理方式
* 堆內存:用于存儲局部變量,當數據使用完,所占空間會自動釋放
* 棧內存
* 數組和對象,通過new建立的實例都放在堆內存中
* 每一個實體都有內存地址值
* 實體中的變量都有默認的初始值
* 實體不再被使用,會在不確定的時間被垃圾回收器回收
* 方法區
* 本地方法,寄存器
> 數組還有另外一種格式
~~~
int [] arr = new int[]{3,6,8,74,99,12};
int [] arr1 = {3,6,8,74,99,12};
~~~
> 我們把他叫做靜態初始化
### 3.遍歷
> 數組的操作,我們先看一個最簡單的,直接循環
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 數組操作
*/
int [] arr = {3,6,8,74,99,12};
for (int i = 0; i < arr.length; i++) {
System.out.println("遍歷"+arr[i]);
}
}
}
~~~
> 得到的結果

> 我們再來寫個小例子
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 數組操作
*/
int[] arr = { 3, 6, 8, 74, 99, 12 };
printArray(arr);
}
/**
* 定義一個方法打印數組中的元素用逗號隔開
*/
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
}
~~~
> 我們的運行結果

> 現在我們有一個需求就是不要最后面的逗號,我們該怎么去做?其實就是判斷
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 數組操作
*/
int[] arr = { 3, 6, 8, 74, 99, 12 };
printArray(arr);
}
/**
* 定義一個方法打印數組中的元素用逗號隔開
*/
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
// 最后一個
if ((array.length - 1) - i == 0) {
System.out.print(array[i]);
} else {
System.out.print(array[i] + ",");
}
}
}
}
~~~
> 只要我的長度-1 再減去你的循環數是0,說明是最后一個,那就不加逗號,輸出的結果
### 4.獲取最值
> 獲取最值就是最大值,最小值之類的,我們一個個來獲取
#### -1.最大/最小值
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 獲取數組中的最大值和最小值
*/
int[] arr = { 3, 6, 8, 74, 99, 12 };
// 最大值
int max = arr[0];
// 最小值
int min = arr[0];
/**
* 思路,定義一個變量對數組的元素進行比較,大于/小于 就記錄
*/
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
System.out.println("最大值:" + max);
for (int i = 0; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
System.out.println("最小值:" + min);
}
}
~~~
> 輸出的結果‘

### 五.排序
> 這個就比較有意思了
#### -1.選擇排序
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 選擇排序
*/
int[] arr = { 3, 6, 8, 74, 99, 12 };
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
// 打印
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
~~~
> 拿著每一個元素都比較一遍,然后從大到小排列

> 我們再來一個更好用的
#### -2.冒泡排序
> 這個比較邏輯就更加效率了,相鄰的兩個元素進行比較,換位置
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 冒泡排序
*/
int[] arr = { 3, 6, 8, 74, 99, 12 };
for (int i = 0; i < arr.length - 1; i++) {
// 每一次比較的元素-1,避免角標越界
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] < arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
// 輸出
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
~~~
> 這樣我們也可以輸出

## 二.二維數組
> 說完了數組,我們又來了一個二維數組,數組中的數組,其實就是一個裝數組類型的數組,這樣說就比較清晰了
>
> 格式
* int [] [] arr = new int [3] [2] ;
* int [] [] arr = new int [ ] [2] ;
> 這是個小知識點,我們簡單說一下
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
/**
* 二維數組的和
*/
int[][] arr = { { 4, 6, 8 }, { 99, 22, 88 }, { 74, 36, 1 } };
int num = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
num = num + arr[i][j];
}
}
System.out.println("num:" + num);
}
}
~~~
> 輸出的結果

> 我們來個小練習
>
> (選擇題)int [] x,y [] ; //x是一維 y是二維
* a.x[0] = y; //error
* b.y[0]= x; //yes
* c.y[0][0] = x; //error
* d.x[0][0] = y; // error
* e.y[0][0] = x[0]; //yes
* f.x=y //error
## 三.面向對象
> 這篇博文其實到這里本該結束的,為了埋個伏筆,我再加點面向對象的思想,我們先理解一下面向對象的思想
* 面向對象是相對于面向過程而已
* 面向對象和面向過程都是一種思想
* 面向過程?
* 強調的是功能行為
* 面向對象?
* 講功能封裝進對象,強調具備了功能的對象
* 面向對象是基于面向過程的
> 這么說可能有點籠統,我們舉個例子來說明
>
> 還記得那個故事嗎,把大象放進冰箱里,這里分幾步?
* 第一步:打開冰箱門
* 第二步:把大象放進去
* 第三步:關閉冰箱門
> 這個行為藝術,叫做過程,這個行為過程,我很強調過程,不管是大象還是小象,無所謂,打開,放進去,關上,這就是面向過程
>
> 而面向對象?
> 只需要我們封裝這個冰箱,那么那就有打開,存儲,和關閉的功能,那么我們作用的就是冰箱這個對象了,我們直接面向他
>
> 這樣說,是不是有點空洞?我下篇博客會繼續深入,生動的把這個思想給描繪出來,盡情期待!
## 有興趣的可以加群555974449!
版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
- 0-發現
- AndroidInterview-Q-A
- Android能讓你少走彎路的干貨整理
- LearningNotes
- temp
- temp11
- 部分地址
- 0-待辦任務
- 待補充列表
- 0-未分類
- AndroidView事件分發與滑動沖突處理
- Spannable
- 事件分發機制詳解
- 1-Java
- 1-Java-01基礎
- 未歸檔
- 你應該知道的JDK知識
- 集合框架
- 1-Java-04合集
- Java之旅0
- Java之旅
- JAVA之旅01
- JAVA之旅02
- JAVA之旅03
- JAVA之旅04
- JAVA之旅05
- JAVA之旅06
- JAVA之旅07
- JAVA之旅08
- JAVA之旅09
- java之旅1
- JAVA之旅10
- JAVA之旅11
- JAVA之旅12
- JAVA之旅13
- JAVA之旅14
- JAVA之旅15
- JAVA之旅16
- JAVA之旅17
- JAVA之旅18
- JAVA之旅19
- java之旅2
- JAVA之旅20
- JAVA之旅21
- JAVA之旅22
- JAVA之旅23
- JAVA之旅24
- JAVA之旅25
- JAVA之旅26
- JAVA之旅27
- JAVA之旅28
- JAVA之旅29
- java之旅3
- JAVA之旅30
- JAVA之旅31
- JAVA之旅32
- JAVA之旅33
- JAVA之旅34
- JAVA之旅35
- 1-Java-05辨析
- HashMapArrayMap
- Java8新特性
- Java8接口默認方法
- 圖解HashMap(1)
- 圖解HashMap(2)
- 2-Android
- 2-Android-1-基礎
- View繪制流程
- 事件分發
- AndroidView的事件分發機制和滑動沖突解決
- 自定義View基礎
- 1-安卓自定義View基礎-坐標系
- 2-安卓自定義View基礎-角度弧度
- 3-安卓自定義View基礎-顏色
- 自定義View進階
- 1-安卓自定義View進階-分類和流程
- 10-安卓自定義View進階-Matrix詳解
- 11-安卓自定義View進階-MatrixCamera
- 12-安卓自定義View進階-事件分發機制原理
- 13-安卓自定義View進階-事件分發機制詳解
- 14-安卓自定義View進階-MotionEvent詳解
- 15-安卓自定義View進階-特殊形狀控件事件處理方案
- 16-安卓自定義View進階-多點觸控詳解
- 17-安卓自定義View進階-手勢檢測GestureDetector
- 2-安卓自定義View進階-繪制基本圖形
- 3-安卓自定義View進階-畫布操作
- 4-安卓自定義View進階-圖片文字
- 5-安卓自定義View進階-Path基本操作
- 6-安卓自定義View進階-貝塞爾曲線
- 7-安卓自定義View進階-Path完結篇偽
- 8-安卓自定義View進階-Path玩出花樣PathMeasure
- 9-安卓自定義View進階-Matrix原理
- 通用類介紹
- Application
- 2-Android-2-使用
- 2-Android-02控件
- ViewGroup
- ConstraintLayout
- CoordinatorLayout
- 2-Android-03三方使用
- Dagger2
- Dagger2圖文完全教程
- Dagger2最清晰的使用教程
- Dagger2讓你愛不釋手-終結篇
- Dagger2讓你愛不釋手-重點概念講解、融合篇
- dagger2讓你愛不釋手:基礎依賴注入框架篇
- 閱讀筆記
- Glide
- Google推薦的圖片加載庫Glide:最新版使用指南(含新特性)
- rxjava
- 這可能是最好的RxJava2.x入門教程完結版
- 這可能是最好的RxJava2.x入門教程(一)
- 這可能是最好的RxJava2.x入門教程(三)
- 這可能是最好的RxJava2.x入門教程(二)
- 這可能是最好的RxJava2.x入門教程(五)
- 這可能是最好的RxJava2.x入門教程(四)
- 2-Android-3-優化
- 優化概況
- 各種優化
- Android端秒開優化
- apk大小優化
- 內存分析
- 混淆
- 2-Android-4-工具
- adb命令
- 一鍵分析Android的BugReport
- 版本控制
- git
- git章節簡述
- 2-Android-5-源碼
- HandlerThread 源碼分析
- IntentService的使用和源碼分析
- 2-Android-9-辨析
- LRU算法
- 什么是Bitmap
- 常見圖片壓縮方式
- 3-Kotlin
- Kotlin使用筆記1-草稿
- Kotlin使用筆記2
- kotlin特性草稿
- Kotlin草稿-Delegation
- Kotlin草稿-Field
- Kotlin草稿-object
- 4-JavaScript
- 5-Python
- 6-Other
- Git
- Gradle
- Android中ProGuard配置和總結
- gradle使用筆記
- Nexus私服搭建
- 編譯提速最佳實踐
- 7-設計模式與架構
- 組件化
- 組件化探索(OKR)
- 1-參考列表
- 2-1-組件化概述
- 2-2-gradle配置
- 2-3-代碼編寫
- 2-4-常見問題
- 2-9-值得一讀
- 8-數據結構與算法
- 0臨時文件
- 漢諾塔
- 8-數據-1數據結構
- HashMap
- HashMap、Hashtable、HashSet 和 ConcurrentHashMap 的比較
- 遲到一年HashMap解讀
- 8-數據-2算法
- 1個就夠了
- Java常用排序算法(必須掌握的8大排序算法)
- 常用排序算法總結(性能+代碼)
- 必須知道的八大種排序算法(java實現)
- 9-職業
- 閱讀
- 書單
- 面試
- 面試-01-java
- Java面試題全集駱昊(上)
- Java面試題全集駱昊(下)
- Java面試題全集駱昊(中)
- 面試-02-android
- 40道Android面試題
- 面試-03-開源源碼
- Android圖片加載框架最全解析(二),從源碼的角度理解Glide的執行流程
- 面試-07-設計模式
- 面試-08-算法
- 面試-09-其他
- SUMMARY
- 版權說明
- temp111