开发者

Java从入门到起飞之数组使用详解

目录
  • 1. 数组的概述
    • 1.1 为什么需要数组
    • 1.2 数组的概念
    • 1.3 数组的分类
  • 2. 一维数组的使用
    • 2.1 一维数组的声明
    • 2.2 一维数组的初始化
      • 2.2.1 静态初始化
      • 2.2.2 动态初始化
    • 2.3 一维数组的使用
      • 2.3.1 数组的长度
      • 2.3.2 数组元素的引用
    • 2.4 一维数组的遍历
      • 2.5 数组元素的默认值
      • 3. 多维数组的使用
        • 3.1 概述
          • 3.2 声明与初始化
            • 3.2.1 声明
            • 3.2.2 静态初始化
            • 3.2.3 动态初始化
          • 3.3 数组的长度和角标
            • 3.4 二维数组的遍历
            • 4. Arrays工具类的使用
              • 总结 

                1. 数组的概述

                1.1 为什么需要数组

                需求分析1:

                需要统计某公司50个员工的工资情况,例如计算平均工资、找到最高工资等。用之前知识,首先需要声明50个变量来分别记录每位员工的工资,这样会很麻烦。因此我们可以将所有的数据全部存储到一个容器中统一管理,并使用容器进行计算。

                容器的概念:

                • 生活中的容器:水杯(装水等液体),衣柜(装衣服等物品),集装箱(装货物等)。
                • 程序中的容器:将多个数据存储到一起,每个数据称为该容器的元素。

                1.2 数组的概念

                • 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

                • 数组中的概念

                  • 数组名
                  • 下标(或索引)
                  • 元素
                  • 数组的长度

                Java从入门到起飞之数组使用详解

                数组的特点:

                • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
                • 创建数组对象会在内存中开辟一整块连续的空间。占据的空间的大小,取决于数组的长度和数组中元素的类型。
                • 数组中的元素在内存中是依次紧密排列的,有序的。
                • 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定,就不能修改。
                • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
                • 数组名中引用的是这块连续空间的首地址。

                1.3 数组的分类

                1、按照元素类型分:

                • 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
                • 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)(在面向对象部分讲解)

                2、按照维度分:

                • 一维数组:存储一组数据
                • 二维数组:存储多组数据,相当于二维表,一行代表一组数据,只是这里的二维表每一行长度不要求一样。

                Java从入门到起飞之数组使用详解

                2. 一维数组的使用

                2.1 一维数组的声明

                格式:

                //推荐
                元素的数据类型[] 一维数组的名称;
                
                //不推荐
                元素的数据类型  一维数组名[];
                

                举例:

                int[] arr;
                int arr1[];
                double[] arr2;
                String[] arr3;  //引用类型变量数组
                

                数组的声明,需要明确:

                (1)数组的维度:在Java中数组的符号是[],[]表示一维,[][]表示二维。

                (2)数组的元素类型:即创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的Java的数据类型。例如:int、String、Student等。

                (3)数组名:就是代表某个数组的标识符,数组名其实也是变量名,按照变量的命名规范来命名。数组名是个引用数据类型的变量,因为它代表一组数据。

                举例:

                public class ArrayTest1 {
                    public static void main(String[] args) {
                        //比如,要存储一个小组的成绩
                        int[] scores;
                        int grades[];
                //        System.out.println(scores);//未初始化不能使用
                
                        //比如,要存储一组字母
                        char[] letters;
                
                        //比如,要存储一组姓名
                        String[] names;
                
                        //比如,要存储一组价格
                        double[] prices;
                
                    }
                }
                

                注意:Java语言中声明数组时不能指定其长度(数组中元素的个数)。 例如: int a[5]; //非法

                2.2 一维数组的初始化

                2.2.1 静态初始化

                • 如果数组变量的初始化和数组元素的赋值操作同时进行,那就称为静态初始化。

                • 静态初始化,本质是用静态数据(编译时已知)为数组初始化。此时数组的长度由静态数据的个数决定。

                • 一维数组声明和静态初始化格式1:

                  数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,...};
                  
                  或
                      
                  数据类型[] 数组名;
                  数组名 = new 数据类型[]{元素1,元素2,元素3,...};
                  
                  • new:关键字,创建数组使用的关键字。因为数组本身是引用数据类型,所以要用new创建数组实体。

                例如,定义存储1,2,3,4,5整数的数组容器。

                int[] arr = new int[]{1,2,3,4,5};//正确
                //或
                int[] arr;
                arr = new int[]{1,2,3,4,5};//正确
                
                • 一维数组声明和静态初始化格式2:
                数据类型[] 数组名 = {元素1,元素2,元素3...};//必须在一个语句中完成,不能分成两个语句写
                

                例如,定义存储1,2,3,4,5整数的数组容器

                int[] arr = {1,2,3,4,5};//正确
                
                int[] arr;
                arr = {1,2,3,4,5};//错误
                

                举例:

                public class ArrayTest2 {
                    public static void main(String[] args) {
                        int[] arr = {1,2,3,4,5};//右边不需要写new int[]
                
                        int[] nums;
                        nums = new int[]{10,20,30,40}; //声明和初始化在两个语句完成,就不能使用new int[]
                
                        char[] word = {'h','e','l','l','o'};
                
                        String[] heros = {"袁隆平","邓稼先","钱学森"};
                
                        System.out.println("arr数组:" + arr);//arr数组:[I@1b6d3586
                        System.out.println("nums数组:" + nums);//nums数组:[I@4554617c
                        System.out.println("word数组:" + word);//word数组:[C@74a14482
                        System.out.println("heros数组:" + heros);//heros数组:[Ljava.lang.String;@1540e19d
                    }
                }
                

                2.2.2 动态初始化

                数组变量的初始化和数组元素的赋值操作分开进行,即为动态初始化。

                动态初始化中,只确定了元素的个数(即数组的长度),而元素值此时只是默认值,还并未真正赋自己期望的值。真正期望的数据需要后续单独一个一个赋值。

                格式:

                数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];
                
                或
                
                数组存储的数据类型[] 数组名字;
                数组名字 = new 数组存储的数据类型[长度];
                
                • [长度]:数组的长度,表示数组容器中可以最多存储多少个元素。

                • **注意:数组有定长特性,长度一旦指定,不可更改。**和水杯道理相同,买了一个2升的水杯,总容量就是2升是固定的。

                举例1:正确写法

                int[] arr = new int[5];
                
                int[] arr;
                arr = new int[5];
                
                

                举例2:错误写法

                int[] arr = new int[5]{1,2,3,4,5};//错误的,后面有{}指定元素列表,就不python需要在[]中指定元素个数了。
                

                2.3 一维数组的使用

                2.3.1 数组的长度

                • 数组的元素总个数,即数组的长度
                • 每个数组都有一个属性length指明它的长度,例如:arr.length 指明数组arr的长度(即元素个数)
                • 每个数组都具有长度,而且一旦初始化,其长度就是确定,且是不可变的。

                2.3.2 数组元素的引用

                如何表示数组中的一个元素?

                每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index)或下标,可以通过数组的索引/下标访问到数组中的元素。

                数组名[索引/下标]
                

                数组的下标范围?

                Java中数组的下标从[0]开始,下标范围是[0, 数组的长度-1],即[0, 数组名.length-1]

                数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*iphp];

                举例

                public class ArrayTest3 {
                    public static void main(String[] args) {
                        int[] arr = {1,2,3,4,5};
                
                        System.out.println("arr数组的长度:" + arr.length);
                        System.out.println("arr数组的第1个元素:" + arr[0]);//下标从0开始
                        System.out.println("arr数组的第2个元素:" + arr[1]);
                        System.out.println("arr数组的第3个元素:" + arr[2]);
                        System.out.println("arr数组的第4个元素:" + arr[3]);
                        System.out.println("arr数组的第5个元素:" + arr[4]);
                
                        //修改第1个元素的值
                        //此处arr[0]相当于一个int类型的变量
                        arr[0] = 100;
                        System.out.println("arr数组的第1个元素:" + arr[0]);
                    }
                }
                

                2.4 一维数组的遍历

                将数组中的每个元素分别获取出来,就是遍历。for循环与数组的遍历是绝配。

                举例1

                public class ArrayTest4 {
                    public static void main(String[] args) {
                        int[] arr = new int[]{1,2,3,4,5};
                        //打印数组的属性,输出结果是5
                        System.out.println("数组的长度:" + arr.length);
                
                        //遍历输出数组中的元素
                        System.out.println("数组的元素有:");
                        for(int i=0; i<arr.length; i++){
                            System.out.println(arr[i]);
                        }
                    }
                }
                

                举例2

                public class ArrayTest5 {
                    public static void main(String[] args) {
                        int[] arr = new int[5];
                
                        System.out.println("arr数组的长度:" + arr.length);
                        System.out.print("存储数据到arr数组之前:[");
                        for (int i = 0; i < arr.length; i++) {
                            if(i==0){
                                System.out.print(arr[i]);
                            }else{
                                System.out.print("," + arr[i]);
                            }
                        }
                        System.out.println("]");
                
                        //初始化
                 		/* 
                 		arr[0] = 2;
                        arr[1] = 4;
                        arr[2] = 6;
                        arr[3] = 8;
                        arr[4] = 10;
                        */
                
                        for (int i = 0; i < arr.length; i++) {
                            arr[i] = (i+1) * 2;
                        }
                
                        System.out.print("存储数据到arr数组之后:[");
                        for (int i = 0; i < arr.length; i++) {
                            if(i==0){
                                System.out.print(arr[i]);
                            }else{
                                System.out.print("," + arr[i]);
                            }
                        }
                        System.out.println("]");
                    }
                }
                

                2.5 数组元素的默认值

                数组是引用类型,当我们使用动态初始化方式创建数组时,元素值只是默认值。例如:

                public class ArrayTest6 {
                	public static编程客栈 void main(String argv[]){
                		int a[]= new int[5]; 
                		System.out.println(a[3]); //a[3]的默认值为0
                	}
                } 
                

                对于基本数据类型而言,默认初始化值各有不同。

                对于引用数据类型而言,默认初始化值为null(注意与0不同!)

                Java从入门到起飞之数组使用详解

                public class ArrayTest7 {
                    public static void main(String[] args) {
                        //存储26个字母
                        char[] letters = new char[26];
                        System.out.println("letters数组的长度:" + letters.length);
                        System.out.print("存储字母到letters数组之前:[");
                        for (int i = 0; i < letters.length; i++) {
                            if(i==0){
                                System.out.print(letters[i]);
                            }else{
                                System.out.print("," + letters[i]);
                            }
                        }
                        System.out.println("]");
                
                       //存储5个姓名
                        String[] names = new String[5];
                        System.out.println("names数组的长度:" + names.length);
                        System.out.print("存储姓名到names数组之前:[");
                        for (int i = 0; i < names.length; i++) {
                            if(i==0){
                                System.out.print(names[i]);
                            }else{
                                System.out.print("," + names[i]);
                            }
                        }
                        System.out.printlnhttp://www.devze.com("]");
                    }
                }
                

                3. 多维数组的使用

                3.1 概述

                • Java 语言里提供了支持多维数组的语法。

                • 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像Excel中的表格、围棋棋盘一样。

                • 应用举例1:

                  某公司2022年全年各个月份的销售额进行登记。按月份存储,可以使用一维数组。如下:

                  int[] monthData = new int[]{23,43,22,34,55,65,44,67,45,78,67,66};
                  

                  如果改写为按季度为单位存储怎么办呢?

                  int[][] quarterData = new int[][]{{23,43,22},{34,55,65},{44,67,45},{78,67,66}};
                  
                  • 应用举例2:

                高一年级三个班级均由多个学生姓名构成一个个数组。如下:

                String[] class1 = new String[]{"段誉","令狐冲","任我行"};
                
                String[] class2 = new String[]{"张三丰","周芷若"};
                
                String[] class3 = new String[]{"赵敏","张无忌","韦小宝","杨过"};

                蓝框的几个元素,可以使用一维数组来存储。但现在发现每个元素下还有下拉框,其内部还有元素,那就需要使用二维数组来存储:

                • 使用说明

                  Java从入门到起飞之数组使用详解

                • 对于二维数组的理解,可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
                • 其实,从数组底层的运行机制来看,其实没有多维数组。

                3.2 声明与初始化

                3.2.1 声明

                二维数组声明的语法格式:

                //推荐
                元素的数据类型[][] 二维数组的名称;
                
                //不推荐
                元素的数据类型  二维数组名[][];
                //不推荐
                元素的数据类型[]  二维数组名[];
                

                例如:

                public class Test20TwoDimensionalArrayDefine {
                    public static void main(String[] args) {
                        //存储多组成绩
                        int[][] grades;
                
                        //存储多组姓名
                        String[][] names;
                    }
                }
                

                面试:

                int[] x, y[];
                //x是一维数组,y是二维数组
                

                3.2.2 静态初始化

                格式:

                int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
                

                定义一个名称为arr的二维数组,二维数组中有三个一维数组

                • 每一个一维数组中具体元素也都已初始化
                  • 第一个一维数组 arr[0] = {3,8,2};
                  • 第二个一维数组 arr[1] = {2,7};
                  • 第三个一维数组 arr[2] = {9,0,1,6};
                • 第三个一维数组的长度表示方式:arr[2].length;
                • 注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
                • 举例1:
                int[][] arr = {{1,2,3},{4,5,6},{7,8,9,10}};//声明与初始化必须在一句完成
                
                int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};
                
                int[][] arr;
                arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};
                
                arr = new int[3][3]{{1,2,3},{4,5,6},{7,8,9,10}};//错误,静态初始化右边new 数据类型[][]中不能写数字
                
                • 举例2:
                public class TwoDimensionalArrayInitialize {
                    public static void main(String[] args) {
                        //存储多组成绩
                        int[][] grades = {
                                    {89,75,99,100},
                                    {88,96,78,63,100,86},
                                    {56,63,58},
                                    {99,66,77,88}
                                };
                
                        //存储多组姓名
                        String[][] names = {
                            {"张三","李四", "王五", "赵六"},
                            {"刘备","关羽","张飞","诸葛亮","赵云","马超"},
                            {"曹丕","曹植","曹冲"},
                            {"孙权","周瑜","鲁肃","黄盖"}
                        };
                    }
                }
                

                3.2.3 动态初始化

                如果二维数组的每一个数据,甚至是每一行的列数,需要后期单独确定,那么就只能使用动态初始化方式了。动态初始化方式分为两种格式:

                格式1:规则二维表:每一行的列数是相同的

                //(1)确定行数和列数
                元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];
                	//其中,m:表示这个二维数组有多少个一维数组。或者说一共二维表有几行
                	//其中,n:表示每一个一维数组的元素有多少个。或者说每一行共有一个单元格
                
                //此时创建完数组,行数、列数确定,而且元素也都有默认值
                
                //(2)再为元素赋新值
                二维数组名[行下标][列下标] = 值;
                

                举例:

                int[][] arr = new int[3][2];
                
                • 定义了名称为arr的二维数组

                • 二维数组中有3个一维数组

                • 每一个一维数组中有2个元素

                • 一维数组的名称分别为arr[0], arr[1], arr[2]

                • 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;

                格式2:不规则:每一行的列数不一样

                //(1)先确定总行数
                元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][];
                
                //此时只是确定了总行数,每一行里面现在是null
                
                //(2)再确定每一行的列数,创建每一行的一维数组
                二维数组名[行下标] = new 元素的数据类型[该行的总列数];
                
                //此时已经new完的行的元素就有默认值了,没有new的行还是null
                
                //(3)再为元素赋值
                二维数组名[行下标][列下标] = 值;
                

                举例:

                int[][] arr = new int[3][];
                
                • 二维数组中有3个一维数组。
                • 每个一维数组都是默认初始化值null (注意:区别于格式1)
                • 可以对这个三个一维数组分别进行初始化:arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
                • 注:int[][]arr = new int[][3]; //非法

                练习:

                /*
                 1
                 2 2
                 3 3 3
                 4 4 4 4
                 5 5 5 5 5
                 */
                public class Test25DifferentElementCount {
                    public static void main(String[] args){
                        //1、声明一个二维数组,并且确定行数
                        //因为每一行的列数不同,这里无法直接确定列数
                        int[][]  arr = new int[5][];
                
                        //2、确定每一行的列数
                        for(int i=0; i<arr.length; i++){
                			/*
                			arr[0] 的列数是1
                			arr[1] 的列数是2
                			arr[2] 的列数是3
                			arr[3] 的列数是4
                			arr[4] 的列数是5
                			*/
                            arr[i] = new int[i+1];
                        }
                
                        //3、确定元素的值
                        for(int i=0; i<arr.length; i++){
                            for(int j=0; j<arr[i].length; j++){
                                arr[i][j] = i+1;
                            }
                        }
                
                        //4、遍历显示
                        for(int i=0; i<arr.length; i++){
                            for(int j=0; j<arr[i].length; j++){
                                System.out.print(arr[i][j] + " ");
                            }
                            System.out.println();
                        }
                
                    }
                }
                

                3.3 数组的长度和角标

                • 二维数组的长度/行数:二维数组名.length
                • 二维数组的某一行:二维数组名[行下标],此时相当于获取其中一组数据。它本质上是一个一维数组。行下标的范围:[0, 二维数组名.length-1]。此时把二维数组看成一维数组的话,元素是行对象。
                • 某一行的列数:二维数组名[行下标].length,因为二维数组的每一行是一个一维数组。
                • 某一个元素:二维数组名[行下标][列下标],即先确定行/组,再确定列。
                public class Test22TwoDimensionalArrayUse {
                    public static void main(String[] args){
                        //存储3个小组的学员的成绩,分开存储,使用二维数组。
                		/*
                		int[][] scores1;
                		int scores2[][];
                		int[] scores3[];*/
                
                        int[][] scores = {
                                {85,96,85,75},
                                {99,96,74,72,75},
                                {52,42,56,75}
                        };
                
                        System.out.println(scores);//[[I@15db9742
                        System.out.println("一共有" + scores.length +"组成绩.");
                
                        //[[:代表二维数组,I代表元素类型是int
                        System.out.println(scores[0]);//[I@6d06d69c
                        //[:代表一维数组,I代表元素类型是int
                        System.out.println(scores[1]);//[I@7852e922
                        System.out.println(scores[2]);//[I@4e25154f
                        //System.out.println(scores[3]);//ArrayIndexOutOfBoundsException: 3
                
                        System.out.println("第1组有" + scores[0].length +"个学员.");
                        System.out.println("第2组有" + scores[1].length +"个学员.");
                        System.out.println("第3组有" + scores[2].length +"个学员.");
                
                        System.out.println("第1组的每一个学员成绩如下:");
                        //第一行的元素
                 js       System.out.println(scores[0][0]);//85
                        System.out.println(scores[0][1]);//96
                        System.out.println(scores[0][2]);//85
                        System.out.println(scores[0][3]);//75
                        //System.out.println(scores[0][4]);//java.lang.ArrayIndexOutOfBoundsException: 4
                    }
                }
                

                3.4 二维数组的遍历

                • 格式:
                for(int i=0; i<二维数组名.length; i++){ //二维数组对象.length
                    for(int j=0; j<二维数组名[i].length; j++){//二维数组行对象.length
                        System.out.print(二维数组名[i][j]);
                    }
                    System.out.println();
                }
                
                • 举例:
                public class Test23TwoDimensionalArrayIterate {
                    public static void main(String[] args) {
                        //存储3个小组的学员的成绩,分开存储,使用二维数组。
                        int[][] scores = {
                                {85,96,85,75},
                                {99,96,74,72,75},
                                {52,42,56,75}
                        };
                
                        System.out.println("一共有" + scores.length +"组成绩.");
                        for (int i = 0; i < scores.length; i++) {
                            System.out.print("第" + (i+1) +"组有" + scores[i].length + "个学员,成绩如下:");
                            for (int j = 0; j < scores[i].length; j++) {
                                System.out.print(scores[i][j]+"\t");
                            }
                            System.out.println();
                        }
                    }
                }
                

                4. Arrays工具类的使用

                java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。 比如:

                • 数组元素拼接
                  • static String toString(int[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 ", "(逗号加空格)分隔。形式为:[元素1,元素2,元素3。。。]
                  • static String toString(Object[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 ", "(逗号加空格)分隔。元素将自动调用自己从Object继承的toString方法将对象转为字符串进行拼接,如果没有重写,则返回类型@hash值,如果重写则按重写返回的字符串进行拼接。
                • 数组排序
                  • static void sort(int[] a) :将a数组按照从小到大进行排序
                  • static void sort(int[] a, int fromIndex, int toIndex) :将a数组的[fromIndex, toIndex)部分按照升序排列
                  • static void sort(Object[] a) :根据元素的自然顺序对指定对象数组按升序进行排序。
                  • static void sort(T[] a, Comparator<? super T> c) :根据指定比较器产生的顺序对指定对象数组进行排序。
                • 数组元素的二分查找
                  • static int binarySearch(int[] a, int key) 、static int binarySearch(Object[] a, Object key) :要求数组有序,在数组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数。
                • 数组的复制
                  • static int[] copyOf(int[] original, int newLength) :根据original原数组复制一个长度为newLength的新数组,并返回新数组
                  • static T[] copyOf(T[] original,int newLength):根据original原数组复制一个长度为newLength的新数组,并返回新数组
                  • static int[] copyOfRange(int[] original, int from, int to) :复制original原数组的[from,to)构成新数组,并返回新数组
                  • static T[] copyOfRange(T[] original,int from,int to):复制original原数组的[from,to)构成新数组,并返回新数组
                • 比较两个数组是否相等
                  • static boolean equals(int[] a, int[] a2) :比较两个数组的长度、元素是否完全相同
                  • static boolean equals(Object[] a,Object[] a2):比较两个数组的长度、元素是否完全相同
                • 填充数组
                  • static void fill(int[] a, int val) :用val值填充整个a数组
                  • static void fill(Object[] a,Object val):用val对象填充整个a数组
                  • static void fill(int[] a, int fromIndex, int toIndex, int val):将a数组[fromIndex,toIndex)部分填充为val值
                  • static void fill(Object[] a, int fromIndex, int toIndex, Object val) :将a数组[fromIndex,toIndex)部分填充为val对象

                举例:java.util.Arrays类的sort()方法提供了数组元素排序功能:

                import java.util.Arrays;
                public class SortTest {
                	public static void main(String[] args) {
                		int[] arr = {3, 2, 5, 1, 6};
                        System.out.println("排序前" + Arrays.toString(arr));
                        Arrays.sort(arr);
                        System.out.println("排序后" + Arrays.toString(arr));
                	}
                }
                

                总结 

                到此这篇关于Java从入门到起飞之数组使用的文章就介绍到这了,更多相关Java数组详解内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

                0

                上一篇:

                下一篇:

                精彩评论

                暂无评论...
                验证码 换一张
                取 消

                最新开发

                开发排行榜