• 数组


    1、数组声明

    /*
    	数组的声明
    	数组是一种类型,使用[]表示。
    	只要存在一种类型,就会存在对应的数组类型。
    	int ->  int[]
    	String ->  String[]
    	
    	可以这样声明数组类型:
    	int[] a;
    	int a[];
    	推荐使用第一种方式声明数组,因为第一种方式
    	将变量类型与变量名进行有效的分离,而第二种
    	没有。
    
    */
    public class ArrayDec {
    	public static void main(String[] args) {
    		//声明一个int类型的变量
    		int x;
    		//声明数组类型的变量
    		int[] a;
    		//也可以这样来声明数组(不建议)
    		int a[];
    		//int[] a1, a2, a3;	//a1,a2,a3都是数组
    		//int a1[], a2, a3;	//a1是数组,a2,a3是int类型。
    	}
    }
    

      2、数组初始化

    /*
    	数组的初始化
    	数组的每个数据称为数组的元素。
    	数组元素的个数称为数组的长度。
    
    	可以使用三种初始化方式
    	int[] a = {1, 2, 3, 4 ,5};
    	int[] a2 = new int[] {1, 2, 3, 4, 5};
    	int[] a3 = new int[5];
    	三种初始化的区别:
    	第一种初始化方式,只能在声明的同时,进行赋值。
    	第二,三种初始化方式,既可以在声明的同时赋值,
    	也可以在声明之后再赋值。
    
    	数组元素的访问
    	通过数组名 + [下标(索引值)]
    	数组的索引是从0开始的。
    	a[0] = 100;
    
    	数据具有一个属性:length
    	length可以获得数组的长度(元素的个数)。
    
    	数组越界
    	访问数组的元素,如果提供的索引值<0,或者
    	>=数组的长度(length),此时,就会发生
    	数组越界。
    	一旦数组越界,在编译时没有错误,但在运行
    	时会产生异常(ArrayIndexOutOfBoundException)。
    	
    */
    public class ArrayInit {
    	public static void main(String[] args) {
    		int x = 1;
    		int[] a = {1, 2, 3, 4 ,5};
    		int[] a2 = new int[] {1, 2, 3, 4, 5};
    		int[] a3 = new int[5];
    		int y;
    		y = 1;
    		/*
    		错误
    		int[] a;
    		a = {1, 2, 3, 4, 5};
    		正确
    		int[] a2;
    		a2 = new int[] {1, 2, 3, 4, 5};
    		int[] a3;
    		a3 = new int[5];
    		*/
    		//System.out.println(a.length);
    		/*
    		System.out.println(a[0]);
    		System.out.println(a[1]);
    		System.out.println(a[2]);
    		System.out.println(a[3]);
    		System.out.println(a[4]);
    		*/
    		//遍历数组,局限:耦合性
    		for (int i = 0; i < 5; i++) {
    			//System.out.println(a[i]);
    		}
    		//改进:使用length属性	
    		for (int i = 0; i < a.length; i++) {
    			//System.out.println(a[i]);
    		}
    		//数组越界
    		//a[-1] = 3;
    		//a[10] = 3;
    	}
    }
    

      3、变量内存分配情况

    /*
    	变量内存分配情况
    	局部变量分配在栈内存当中,而对象分配在堆内存当中。
    
    	栈内存结构会随着方法的调用而创建,随着方法的结束
    	而销毁。每个方法都有自己的栈内存结构,彼此之间
    	不受干扰。
    	堆内存结构是长期存在的。对象存放在堆内存当中,当
    	没有任何引用指向一个对象时,该对象就会成为垃圾回收
    	器回收的目标,垃圾回收器会在下次启动时将其回收。
    
    	对于基本数据类型,该值直接存放在变量当中,对于引用类型,
    	变量没有存放真正的对象(真正的对象存放在堆内存中),
    	变量存放的是该对象的起始地址。
    
    	引用类型变量不存放对象,而存放对象起始地址的原因:
    	1 栈是一个频繁创建而销毁的结构,意味着栈的空间非常
    	有限(否则浪费资源,降低性能),而对象占用的空间
    	较大。
    	2 栈会随着方法调用结束而销毁,此时栈中所有的变量都将
    	不复存在,如果对象分配在栈内存当中,我们就不能在方法
    	调用结束后继续使用该对象。
    */
    public class Room {
    	public static void main(String[] args) {
    		
    	}
    }
    

      4、增强型for循环

    /*
    	增强型for循环
    	优势:
    	对于操作数组与集合,增强型for循环具有一定的方便性。
    	局限性:
    	1 逆序遍历数组
    	2 访问数组的部分元素
    	3 在循环中改变数组元素的值
    */
    
    public class ForEach {
    	public static void main(String[] args) {
    		int[] x = {1, 2, 3, 4, 5};
    		//传统for循环
    		for (int i = 0; i < x.length; i++) {
    			//System.out.println(x[i]);
    		}
    		//增强for循环
    		//意思:数组x里面的每一个元素会依次赋值给i一次,
    		//然后执行一次循环体。
    		for (int i : x) {
    			//System.out.println(i);
    		}
    		//逆序遍历数组
    		for (int i = x.length -1; i >= 0; i--) {
    			//System.out.println(x[i]);	
    		}
    
    		//访问数组的部分元素
    		for (int i = 2; i < x.length - 1; i++) {
    			
    		}
    
    		//在循环中改变数组元素的值
    		for (int i = 0; i < x.length - 1; i++) {
    			//x[i] = i + 100;
    		}
    
    		for (int i : x) {
    			i = 100;
    		}
    		//不能通过i改变数组元素的值。
    		for (int i : x) {
    			System.out.println(i);
    		}
    	}
    }
    

      5、多维数组

    /*
    	多维数组
    	Java中实际上不存在多维数组,所谓的多维数组,在Java中
    	就是数组的数组。即数组的每一个元素还是数组。
    	int[] x;	=>	每一个元素为int类型。
    	String[] x; =>  每一个元素为String类型。
    	T[] x;		=>	每一个元素为T类型。
    	当T是int[]的一维数组时,
    	=》	(int[])[] =>	int[][]
    	n维数组里面每一个元素是n-1维数组类型。(2 <= n <= 255)
    
    	二维数组初始化的三种方式,与一维数组相同。
    	二维数组三种初始化区别与一维数组是相同的。
    
    	在Java中,多维数组不要求是矩阵数组,即每个低维数组
    	的长度不要求相同。
    
    */
    public class MultiArray {
    	public static void main(String[] args) {
    		//二维数组的初始化
    		int[][] x = {{1, 2}, {3, 4}, {5, 6}};
    		int[][] x2 = new int[][] {
    			{1, 2}, {3, 4}, {5, 6}
    		};
    		int[][] x3 = new int[3][2];
    
    		x[1][0] = 3;
    		//非矩阵数组
    		int[][] y = {{1}, {2, 3}};
    		//可以先分配高维,再分配低维
    		int[][] y2 = new int[2][];
    		y2[0] = new int[3];
    		y2[1] = new int[2];
    
    		//二维数组的遍历
    		for (int i = 0; i < x.length; i++) {
    			for (int j = 0; j < x[i].length; j++) {
    				System.out.println(x[i][j]);
    			}
    		}
    
    		for (int[] i : x) {
    			for (int j : i) {
    				System.out.println(j);
    			}
    		}
    	}
    }
    

      6、对数组进行复制

    /*
    	对数组进行复制
    	System.arraycopy
    	src	源数组
    	srcPos	源数组开始复制的位置
    	dest 目标数组
    	descPos  目标数组开始复制的位置
    	length	复制的长度
    
    	数组的clone方法
    */
    
    public class Copy {
    	public static void main(String[] args) {
    		int[] x = {1, 2, 3, 4, 5};
    		int[] y = new int[x.length];
    		System.arraycopy(x, 0, y, 0, x.length);
    		for (int i : y) {
    			//System.out.print(i + " ");
    		}
    
    		int[] z = x.clone();
    		for (int i : z) {
    			System.out.print(i + " ");
    		}
    	}
    }
    

      7、Arrays类的使用

    /*
    	Arrays类的使用。
    	Arrays中声明了很多对数组操作的方法。
    	Arrays类声明在java.util包中。
    */
    
    import java.util.Arrays;
    
    public class ArraysTest {
    	public static void main(String[] args) {
    		int[] x = {5, 4, 3, 2, 1};
    		//对进组进行排序
    		//Arrays.sort(x);
    		for (int i : x) {
    			//System.out.print(i + " ");
    		}
    		//对数组进行排序(并行排序),在对CPU,多核心
    		//环境下,性能可能会得到提升。
    		//Arrays.parallelSort(x);
    		for (int i : x) {
    			//System.out.print(i + " ");
    		}
    		//对数组的指定区间进行排序
    		//第1个参数为待排序的数组,第2个参数执行开始
    		//区间(包括),第3个参数指定结束区间(不包括)。
    		//Arrays.sort(x, 1, 4);
    		//Arrays.parallelSort(x, 1, 4);
    		for (int i : x) {
    			//System.out.print(i + " ");
    		}
    		//对指定的关键字进行查找。要求数组
    		//元素必须是升序排列的,否则返回的结果是不确定的。
    		//如果找到,会返回数组元素的索引。
    		//如果未找到,返回负值。(-插入点-1)
    		//插入点就是我们要查找关键字放在数组当中的索引。
    		//Arrays.sort(x);
    		//System.out.println(Arrays.binarySearch(x, 4));
    		x = new int[] {1, 3, 5, 7, 9};
    		//System.out.println(Arrays.binarySearch(x, 6));
    		int[] y = new int[] {1, 3, 5, 7, 9, 11};
    		//判断两个数组是否相等(原则:长度相应,对应的元素
    		//也相等),如果相等,返回true,否则返回false。
    		//System.out.println(Arrays.equals(x, y));
    		int[] z = new int[5];
    		//对数组使用指定的值进行填充
    		//Arrays.fill(z, 100);
    		//对数组指定的区间,使用指定的值进行填充。
    		//第1个参数:待填充的数组
    		//第2个参数:填充的开始点(索引),包含。
    		//第3个参数:填充的结束点(索引),不包含
    		//第4个参数:填充的值
    		Arrays.fill(z, 2, 4, 100);
    		for (int i : z) {
    			//System.out.print(i + " ");
    		}
    		//对数组进行复制,返回复制后的数组。
    		//第1个参数:源数组
    		//第2个参数:复制的长度。如果长度小于
    		//源数组的长度,则源数组被截断。如果长度
    		//大于源数组的长度,则多余的元素取默认值。
    		int[] w = {1, 2, 3, 4, 5};
    		//int[] wCopy = Arrays.copyOf(w, w.length);
    		//int[] wCopy = Arrays.copyOf(w, w.length - 2);
    		int[] wCopy = Arrays.copyOf(w, w.length + 2);
    		for (int i : wCopy) {
    			//System.out.print(i + " ");
    		}
    		//对数组指定区间进行复制。返回复制的数组。
    		//参数1:源数组
    		//参数2:开始点,包含
    		//参数3:结束点,不包含。该值可以大于源数组的
    		//长度,此时,多余的元素取默认值。
    		int[] k = new int[]{1, 2, 3, 4, 5};
    		//int[] kCopy = Arrays.copyOfRange(k, 1, 4);
    		int[] kCopy = Arrays.copyOfRange(k, 1, 10);
    		for (int i : kCopy) {
    			//System.out.print(i + " ");
    		}
    		//将数组转换成String。(将数组的每个元素进行拼接,
    		//使用,进行分隔。)
    		String s = Arrays.toString(k);
    		System.out.println(s);
    	}
    }
    

      8、命令行参数

    /*
    	命令行参数
    	我们在java运行程序时,可以在后面传递相应的参数,
    	参数会依次称为args数组的元素。
    	参数使用空格进行分隔,如果参数本身含有空格,
    	那么可以使用""进行引用。
    	如果参数本身还有",可以使用"进行转义。
    */
    
    public class Args {
    	public static void main(String[] args) {
    		//System.out.println(args.length);
    		for (String s : args) {
    			//System.out.println(s);
    		}
    		//int limit = 100;
    		//int limit = (int)args[0];
    		int limit = Integer.parseInt(args[0]);
    		int sum = 0;
    		for (int i = 1; i <= limit; i++) {
    			//sum = sum + i;
    			sum += i;
    		}
    		System.out.println(sum);
    	}
    }
    

      

  • 相关阅读:
    [LintCode] Flatten Nested List Iterator 压平嵌套链表迭代器
    [LintCode] Reverse Pairs 翻转对
    [CareerCup] 17.9 Word Frequency in a Book 书中单词频率
    [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
    [CareerCup] 17.7 English Phrase Describe Integer 英文单词表示数字
    [LeetCode] Reverse Vowels of a String 翻转字符串中的元音字母
    [CareerCup] 17.6 Sort Array 排列数组
    [LeetCode] 344. Reverse String 翻转字符串
    [CareerCup] 17.5 Game of Master Mind 猜字游戏
    [CareerCup] 17.4 Maximum of Two Numbers 两数中的较大值
  • 原文地址:https://www.cnblogs.com/liuwei6/p/6568425.html
Copyright © 2020-2023  润新知