Java_数组定义及常用方法

来源:互联网 发布:淘宝店铺怎么加客服 编辑:程序博客网 时间:2024/06/05 08:43

Java_数组定义及常用方法


摘要:


       从数组的一些简单介绍、到定义、声明、初始化、以及常用的方法、细微的区别、但是没有讲多维数组、多维数组本质是一维数组的延伸、以后有时间补充、有补充或者误导的地方望不吝指正、不胜感激!

 

一:数组的简介


       Java中的数组、是一种简单的线性数据存储结构、他用牺牲自动扩展大小来换取与集合相比的唯一优势——查询效率的提升。他本身是一种引用类型的数据、所以我们要使用数组就要首先声明、初始化他、而他的初始化的完成也就意味着此数组的大小将不再改变、而且具有初始值。当存储的是java原始基础类型时、默认值是不同基础类型值的默认值、当是引用类型时、如果我们没有指定具体的对象、则他的默认值是null。从数组的内部组成来看、觉得java中没有多维数组!所谓的多维数组其实就是一维数组的延伸、只是数组的值存放的是另一个数组的引用、依次深入、我们可以扩展到任意维度的数组、注意:数组的扩展的过程中只能存放相同类型或者子类型的数组!

        Java中的数组长度不变!存储的数据类型唯一!有时候我们会有种错觉觉得这两者都是不成立的、本质是因为java中继承的存在、我们定义的父类型的数组、他的数组元素也同样可以存放子类对象、这样就造成了数组存放对象可变的假象。当我们将数组的引用从一个对象改变到子类的对象的时候、感觉数组的长度变化、其实变的是引用指向的对象的长度、原来引用指向的对象长度没有变化、只是此对象被遗弃了而已、      

       对此只要记住一点:java中的数组时引用类型、当声明初始化一个对象时、数组的引用存放在栈内、实际对象存放在堆内存中、而我们平常所指的长度、类型都是具体对象的长度、类型!

        此外、Arrays是一个操作java数组的类、提供了一些非常实用的用于操作数组的类、还有就是java数组与集合比较相似。后面会有两者间的相互转换的方法。

二:简单归纳:


    java中有两种数据类型:

            a)引用类型

            b)基础类型


    其中基础类型又有两种:

            b1)数值类型

            b2)及布尔类型。


  数组——也为java的一个数据类型、归类为引用类型。本文意图说清楚两点:

            1、数组的声明以及初始化。

            2、常用的数组方法。


  补充一点:对于我们常说的二维数组、多维数组其实是一维数组的延伸、这里暂时只围绕一维数组。

 

三:数组的声明及初始化


           1、数组的声明:


            作为一种引用类型、就如我们平常使用引用类型的时候声明一样、一般有两种写法:


a) type[] arrayName;exp: String[] strArray;b) typearrayName[];exp: String strArray[];

             第二种源于C的写法、由于很容易造成混淆、所以现在基本不使用这种声明方式了。

            2、数组的初始化:


             数组的初始化有两种:

            a)  静态初始化——数组大小由系统分配、我们只为数组每个位置上赋值

 

String[] strArray1 = {"a", "b", "c", "d", "e"};String[] strArray2 = new String[]{"a", "b", "c", "d", "e"};//在 new String[]中不能指定String数组的大小!
           

           b)动态初始化——只指定数值的大小、初始化工作由系统为我们完成(即为数组的每个位置赋初始值)


String[] strArray3 = new String[5];//此时String数组的每个位置上的值都由系统来初始化、使用默认的值""//我们能做的是动态的为strArray3每个位置上的值进行修改for (int i = 0; i < strArray1.length; i++) {//这里仅用原始的方法进行赋值。strArray3[i] = strArray1[i];}


四:数组的常用方法

 

package com.chy.array.usefulMethods;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.HashSet;import java.util.Set;import com.chy.array.bean.Student;@SuppressWarnings("all")public class ArrayUseFulMethoed {private static int[] intArray = {1, 2, 3, 4, 5};private static String[] strArray = {"a", "b", "c", "d", "e"};/** * 填充元素、比较大小、复制元素 */public static void testFillArray(){//注意字符串和对象的不同Student[] student1 = new Student[4];Student[] student2 = new Student[4];System.out.println(Arrays.equals(student1, student2));//trueArrays.fill(student1, 0, 4, new Student(1,"chy"));Arrays.fill(student2, new Student(1,"chy"));System.out.println(Arrays.equals(student1, student2));//falseString[] str1 = new String[4];String[] str2 = new String[]{"a", "a", "a", "a"};String[] str3 = {new String("a"), new String("a"), new String("a"), new String("a")};Arrays.fill(str1, "a");System.out.println(Arrays.equals(str1, str2));//trueSystem.out.println(Arrays.equals(str2, str3));//trueString[] str4 = Arrays.copyOf(str1, 2);//是将传入的数组拷贝len个元素到新的数组、相当于复制本身的一部分或者全部形成一个全新的数组System.out.println(str4.length + "=======" + Arrays.toString(str4));//2=======[a, a]String[] str5 = new String[8];System.arraycopy(str4, 0, str5, 6, 2);//是将str4从下标0开的2个元素拷贝到从下标6开始放置的数组str5中System.out.println(str5.length + "=======" + Arrays.toString(str5));// 8=======[null, null, null, null, null, null, a, a]}/** * 以字符串的形式输出指定数组的“模样” */public static void printOriginalArray(){String intArrayToString = Arrays.toString(intArray);System.out.println(intArrayToString);//result: [1, 2, 3, 4, 5]}/** * 将数组转化成List集合 * 注意:不能直接将int[]转化为集合、因为asList()方法的参数必须是对象。应该先把int[]转化为Integer[]。 * 对于其他primitive类型的数组也是如此,必须先转换成相应的wrapper类型数组。 */public static void convetArrayToList(){Integer[] integerArray = new Integer[intArray.length];for (int i = 0; i < integerArray.length; i++) {integerArray[i] = intArray[i];}ArrayList<Integer> integerList1 = new ArrayList<Integer>(Arrays.asList(integerArray));/* * 不能写成下面: * ArrayList<Integer> integerList2 = (ArrayList<Integer>)Arrays.asList(integerArray); * 返回的是List<T>、强转可以通过编译、但是不能正常使用。 */for(int i : integerList1){System.out.print(i);}//result:12345System.out.println();}/** * 将List集合转换成数组 */public static void convetListToArray(){ArrayList<String> strList = new ArrayList<String>(Arrays.asList(strArray));String[] strArrayFromList = new String[strList.size()];strList.toArray(strArrayFromList);System.out.println(Arrays.toString(strArrayFromList));//result:[a, b, c, d, e]/* * 注意:不能写成这样:String[] strArrayFromList = (String[])strList.toArray(strArrayFromList);会抛出ClassCastException。 *  List.toArray()与List.toArray(T[] t)的区别在于: *  List.toArray()返回的是一个Object[]、不能强转成String[]、强转的话可以通过编译、但是不能进行String[]的操作 *  而List.toArray(T[] t)会将list的值转换成T类型的数组。 */}/** * 将数组转换成Set集合 */public static void convertArrayToSet(){Set<String> set = new HashSet<String>(Arrays.asList(strArray));//Set具有无序性、所以输出结构不一定是原来数组元素存放顺序System.out.println(set);//result: [d, e, b, c, a]}/** * 判断某个数组中是否包含一个元素、思路:将数组转换成list使用list的contains方法 */public static void isContainObject(){ArrayList<String> strList = new ArrayList<String>(Arrays.asList(strArray));System.out.println(strList.contains("a"));//result: true//另一种实现Arrays.sort(strArray);if(Arrays.binarySearch(strArray, "c") >= 0){System.out.println(true);}else{System.out.println(false);}}/** * 将两个相同类型的数组连接起来  */public static void connTwoSameArray(){int[] intArray2 = new int[]{6, 7, 8, 9, 10};}/** * 将数组中数据排序 */public static void sortArray(){String[] str = {"c", "a" ,"d" ,"z" };Arrays.sort(str);System.out.println(Arrays.toString(str));//反序、Arrays.sort(str, Collections.reverseOrder());System.out.println(Arrays.toString(str));}public static void main(String[] args) {/*printOriginalArray();convetArrayToList();convetListToArray();isContainObject();convertArrayToSet();sortArray();*/testFillArray();}}

2 0