java学习笔记 --- 数组
一、Java的内存分配
A:栈内存: 存储局部变量,只要是在方法中定义的变量都是局部变量。一旦变量的生命周期结束该变量就被释放。
B:堆内存: 存储所有new出来的,及实体(对象),每一个实体都有一个首地址值,每一个变量都有默认初始化值,不同类型的不一样。
当实体不在使用时,就会被垃圾回收机制处理。
C:方法区(面向对象部分详细讲解)
D:本地方法区(系统相关)
E:寄存器(CPU使用)
二、数组
(1)定义:存储同一种数据类型的多个元素的容器。
(2)特点:每一个元素都有编号,从0开始,最大编号是长度-1。
编号的专业叫法:索引
(3)定义格式
A:数据类型[] 数组名;(推荐使用)
B:数据类型 数组名[];(知道就好,一般不用)
(4)数组的初始化
A:动态初始化
只给长度,系统给出默认值
举例:int[] arr = new int[3];
B:静态初始化
给出值,系统决定长度
举例:int[] arr = new int[]{1,2,3};
简化版:int[] arr = {1,2,3};
三、数组的常用方法
public class Dome1 {
public static void main(String[] args) {
//使用输入值初始化数组
int[] arr = new int[10];
//调用想要的方法
}
//使用输入值对数组初始化
public static void chu(int[]arr){
Scanner sc = new Scanner(System.in);
System.out.println("请输入数组值:");
for(int x =0;x<arr.length;x++){
arr[x] = sc.nextInt();
}
}
//使用随机数初始化数组
public static void rando(int[] arr){
for(int x=0;x<arr.length;x++){
arr[x] = (int) (Math.random()*100);
}
}
//数组的遍历 方式1
public static void printArray(int[] arr){
for(int x=0;x<arr.length;x++){
System.out.println(arr[x]);
}
}
//遍历方式2
public static void printArray2(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.print(arr[x]+"]");
}
}
System.out.println();
}
//对数组中的所有元素求和
public static int sum( int arr[]){
int sum = 0;
for(int x=0;x<arr.length;x++){
sum +=arr[x];
}
return sum;
}
//找出最大元素级下标
public static int max(int[] arr){
int max = arr[0];
int indexOfMax = 0;
for(int x=0;x<arr.length;x++){
if(arr[x]>max){
max= arr[x];
indexOfMax = x;
}else{
max = max;
indexOfMax = 0;
}
}
return max;
}
//找出元素最小值及下标
public static int min(int[]arr){
int min = arr[0];
int indexOfMin = 0;
for(int x=0;x<arr.length;x++){
if(arr[x]<min){
min = arr[x];
indexOfMin=x;
}else{
min = min;
}
}
return min;
}
//随意打乱元素
public static void rodm(int[] arr){
for(int x=0;x<arr.length;x++){
int index = (int) Math.random()*arr.length;
//交换下标
int temp = arr[x];
arr[x] = arr[index];
arr[index] = temp;
}
}
//移动元素
public static void shift(int[] arr){
int temp = arr[0];
for(int x=1;x<arr.length;x++){
arr[x-1] = arr[x];
}
arr[arr.length-1] = temp;
}
//增强for 遍历数组
public static void bin(int[]arr){
for (int i : arr) {
System.out.println(arr[i]);
}
}
}
四、数组的排序方法
public class Dome3 {
public static void main(String[] args) {
}
//选择排序
public static void selectionSort(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 bubbleSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=0; y<arr.length-1-x; y++)
{
if(arr[y]>arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
}
说明:
1、选择排序
选择排序是排序中的一种。算法原则(从小到大排序):先用数组中第一个空间值和数组中剩余的其他空间值一一做比较,在比较的过程有任何值比第一个空间值小,就用第一个空间值和当前这个空间值换位置,直到所有值和第一个空间值全部比较完。第一个空间中就放着最小值。接着在使用数组第二个空间值和数组中剩下空间中值做比较,比较方式和前一次相同。以此类推,比较完成。
规律:第一个空间和剩余空间比一圈,第二个空间在和剩余空间比一圈,以此类推,到倒数第二个空间值和最后一个空间值比完,整个数组有有序了。正好符合了外循环循环一次,内循环执行一圈。即外循环控制每次到底使用那个空间值和剩余空间比较,内循环提供剩余空间。
图解:

2、冒泡排序
冒泡排序算法原理:这种算法和生活中常见的水中气泡的浮沉类似。
数组冒泡算法(从小到大):
第一轮:数字第一个空间值和第二个空间值比较,把较大的值存在第二个空间中,接着第二个空间值和第三个空间值作比较,较大的值存在第三个空间中,以此类推直到倒数第二个空间和倒数第一个空间比较,把较大值存放在最后一个空间中。
第二轮:由于最后一个空间已经是最大值了,那么第二轮算法和第一轮一样,只是最后一次比较是倒数第三个空间和倒数第二个空间比较。把较大的值存在倒数第二个空间中。
以此类推。
图解:

五、数组的查找方法
public class Dome2 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6 };
System.out.println(binarySearch(arr, 6));
}
// 线性查找,根据需要找的数,找到在数组中的下标
public static int linearSearch(int[] arr, int k) {
for (int x = 0; x < arr.length; x++) {
if (k == arr[x]) {
return x;
}
}
return -1;
}
//二分法查找,数组必须有序
public static int binarySearch(int[] arr, int k){
int low = 0;
int high = arr.length-1;
while(high>=low){
int mid = (low+high)/2;
if(k<arr[mid]){
high = mid-1;
}else if(k == arr[mid]){
return mid;
}else{
low = mid+1;
}
}
return -1;
}
}
说明:
1、一半查找
从组中第一个空间开始查找,每取出一个空间值和待查找的数值做比较,若相等,就返回当前角标,若数组遍历结束,没有找到相等的值,则返回-1.
2、二分法查找
折半查找,必须保证数组已经是有序的。
思路:
1,通过角标先获取中间角标上元素。
2,让该元素和要找的数据比较。
3,如果要找的数大了,缩小范围,要找的范围应该是 中间的角标+1---尾角标。
如果要找的数小了,要找的范围 头角标---中间角标-1;
4,不断如此重复,就可以找到元素对应的角标。
六、arrays类
| 序号 | 方法和说明 |
|---|---|
| 1 | public static int binarySearch(Object[] a, Object key) 用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。 |
| 2 |
public static boolean equals(long[] a, long[] a2) 如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
| 3 |
public static void fill(int[] a, int val) 将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
| 4 |
public static void sort(Object[] a) 对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
java学习笔记 --- 数组的更多相关文章
- JAVA学习笔记--数组初始化
JAVA中,数组只是相同类型的.用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.数组通过方括号下标操作符[]来定义和使用,要定义一个数组只需在类型名后面加上一个方括号即可,如: int[] ...
- JAVA学习笔记-数组的三种初始化方式
package Study; public class TestArray02 { public static void main(String[] args){//声明 int[] a; int ...
- Java菜鸟学习笔记--数组篇(三):二维数组
定义 //1.二维数组的定义 //2.二维数组的内存空间 //3.不规则数组 package me.array; public class Array2Demo{ public static void ...
- Java学习笔记之---方法和数组
Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第八周《Java学习笔记》
20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...
随机推荐
- oracle_权限
Oracle 权限 权限允许用户访问属于其它用户的对象或执行程序,ORACLE系统提供三种权限:Object 对象级.System 系统级.Role 角色级.这些权限可以授予给用户.特殊用户publi ...
- testNG实现test失败后重复执行,
test失败自动执行大大提高测试结果的准确性, 1.修改testNG源码实现test失败自动执行, 首先获取testng的源码, 获取源代码,构建过程: $ git clone git://githu ...
- ICMP(网际控制报文协议)
为了更有效的提高ip数据报的成功转发和交付的效率,在网际层使用了icmp网际控制报文协议,这个协议允许主机和路由器提供差错和异常情况的报告,icmp不是高层协议,而是网际层的协议,加在ip数据报中一起 ...
- Spark源码分析之Spark Shell(上)
终于开始看Spark源码了,先从最常用的spark-shell脚本开始吧.不要觉得一个启动脚本有什么东东,其实里面还是有很多知识点的.另外,从启动脚本入手,是寻找代码入口最简单的方法,很多开源框架,其 ...
- Android 7.0 PopupWindow 的兼容问题
Android7.0 PopupWindow的兼容问题 Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文 ...
- Web前端浏览器兼容问题
所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的 ...
- cin的返回值
例: int main() { int a,b; while(cin >> a >> b) cout << a+b << endl; } 首先,cin是 ...
- 开源OSS.Social微信项目进阶介绍
在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,主要在讲述解决思路和过程,没有详细实现和使用介绍.本着不能马虎的态度,这篇文章我来给大家分解一下项目结构,使 ...
- 【转】44款Java 网络爬虫开源软件
原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...
- 每天一个linux命令(48)--ln命令
ln是Linux中又一个非常重要的命令,它的功能是为某个文件在另外一个位置建立一个同步的链接,当我们需要在不同的目录,用到相同的文件时,我们不需要在每个需要的目录下都放一个相同的文件,我们只要在某个固 ...