JAVA语言基础系列教程之集合基础,数组和第一类对象
小标 2019-01-09 来源 : 阅读 977 评论 0

摘要:本文主要向大家介绍了JAVA语言基础系列教程之集合基础,数组和第一类对象,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言基础系列教程之集合基础,数组和第一类对象,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

数组和第一类对象


无论使用的数组属于什么类型,数组标识符实际都是指向真实对象的一个句柄。那些对象本身是在内存


“堆”里创建的。堆对象既可“隐式”创建(即默认产生),亦可“显式”创建(即明确指定,用一个 new


表达式)。堆对象的一部分(实际是我们能访问的唯一字段或方法)是只读的length(长度)成员,它告诉


我们那个数组对象里最多能容纳多少元素。对于数组对象,“ []”语法是我们能采用的唯一另类访问方法。


对象数组和基本数据类型数组在使用方法上几乎是完全一致的。唯一的差别在于对象数组容纳的是句柄,而基本数据类型数组容纳的是具体的数值


public class ArraySize {

    public static void main(String[] args) {

        // Arrays of objects:

        Weeble[] a; // Null handle

        Weeble[] b = new Weeble[5]; // Null handles

        Weeble[] c = new Weeble[4];

        for (int i = 0; i < c.length; i++)

            c[i] = new Weeble();

        Weeble[] d = { new Weeble(), new Weeble(), new Weeble() };

        // Compile error: variable a not initialized:

        // !System.out.println("a.length=" + a.length);

        System.out.println("b.length = " + b.length);

        // The handles inside the array are

        // automatically initialized to null:

        for (int i = 0; i < b.length; i++)

            System.out.println("b[" + i + "]=" + b[i]);

        System.out.println("c.length = " + c.length);

        System.out.println("d.length = " + d.length);

        a = d;

        System.out.println("a.length = " + a.length);

        // Java 1.1 initialization syntax:

        a = new Weeble[] { new Weeble(), new Weeble() };

        System.out.println("a.length = " + a.length);

        // Arrays of primitives:

        int[] e; // Null handle

        int[] f = new int[5];

        int[] g = new int[4];

        for (int i = 0; i < g.length; i++)

            g[i] = i * i;

        int[] h = { 11, 47, 93 };

        // Compile error: variable e not initialized:

        // !System.out.println("e.length=" + e.length);

        System.out.println("f.length = " + f.length);

        // The primitives inside the array are

        // automatically initialized to zero:

        for (int i = 0; i < f.length; i++)

            System.out.println("f[" + i + "]=" + f[i]);

        System.out.println("g.length = " + g.length);

        System.out.println("h.length = " + h.length);

        e = h;

        System.out.println("e.length = " + e.length);

        // Java 1.1 initialization syntax:

        e = new int[] { 1, 2 };

        System.out.println("e.length = " + e.length);

    }

}

   



 

输出如下:


 

b.length = 5


 

b[0]=null


 

b[1]=null


 

b[2]=null


 

b[3]=null


 

b[4]=null


 

c.length = 4


 

d.length = 3


 

a.length = 3


 

a.length = 2


 

f.length = 5


 

f[0]=0


 

f[1]=0


 

f[2]=0


 

f[3]=0


 

f[4]=0


 

g.length = 4


 

h.length = 3


 

e.length = 3


 

e.length = 2



其中,数组 a 只是初始化成一个 null 句柄。此时,编译器会禁止我们对这个句柄作任何实际操作,除非已正


确地初始化了它。数组 b 被初始化成指向由 Weeble 句柄构成的一个数组,但那个数组里实际并未放置任何


Weeble 对象。然而,我们仍然可以查询那个数组的大小,因为 b 指向的是一个合法对象。


换言之,我们只知道数组对象的大小或容量,不知其实际容纳了多少个元素。


尽管如此,由于数组对象在创建之初会自动初始化成 null,所以可检查它是否为 null,判断一个特定的数组“空位”是否容纳一个对象。类似地,由基本数据类型构成的数组会自动初始化成零(针对数值类型)、 null(字符类型)或者false(布尔类型)


数组 c 显示出我们首先创建一个数组对象,再将 Weeble 对象赋给那个数组的所有“空位”。数组 d 揭示出


“集合初始化”语法,从而创建数组对象(用 new 命令明确进行,类似于数组 c),然后用 Weeble 对象进行


初始化,全部工作在一条语句里完成。


下面这个表达式:


a = d;

   


向我们展示了如何取得同一个数组对象连接的句柄,然后将其赋给另一个数组对象,向我们展示了如何取得同一个数组对象连接的句柄,然后将其赋给另一个数组对象


1.基本数据类型集合


集合类只能容纳对象句柄。但对一个数组,却既可令其直接容纳基本类型的数据,亦可容纳指向对象的句


柄。利用象 Integer、 Double 之类的“ 封装器”类,可将基本数据类型的值置入一个集合里。


无论将基本类型的数据置入数组,还是将其封装进入位于集合的一个类内,都涉及到执行效率的问题。显


然,若能创建和访问一个基本数据类型数组,那么比起访问一个封装数据的集合,前者的效率会高出许多。


数组的返回


假定我们现在想写一个方法,同时不希望它仅仅返回一样东西,而是想返回一系列东西。此时,象C 和 C++这样的语言会使问题复杂化,因为我们不能返回一个数组,只能返回指向数组的一个指针。这样就非常麻烦,因为很难控制数组的“存在时间”,它很容易造成内存“漏洞”的出现。


Java 采用的是类似的方法,但我们能“返回一个数组”。当然,此时返回的实际仍是指向数组的指针。但在Java 里,我们永远不必担心那个数组的是否可用—— 只要需要,它就会自动存在。而且垃圾收集器会在我们完成后自动将其清除


public class IceCream {

    static String[] flav = { "Chocolate", "Strawberry", "Vanilla Fudge Swirl",

            "Mint Chip", "Mocha Almond Fudge", "Rum Raisin", "Praline Cream",

            "Mud Pie" };

 

    static String[] flavorSet(int n) {

        // Force it to be positive & within bounds:

        n = Math.abs(n) % (flav.length + 1);

        String[] results = new String[n];

        int[] picks = new int[n];

        for(int i = 0; i < picks.length; i++)

        picks[i] = -1;

        for(int i = 0; i < picks.length; i++) {

        retry:

        while(true) {

            int t =(int)(Math.random() * flav.length);

            for(int j = 0; j < i; j++)213

            if(picks[j] == t) continue retry;

            picks[i] = t;

            results[i] = flav[t];

            break;

            }

        }

        return results;

    }

 

    public static void main(String[] args) {

        for (int i = 0; i < 20; i++) {

            System.out.println("flavorSet(" + i + ") = ");

            String[] fl = flavorSet(flav.length);

            for (int j = 0; j < fl.length; j++)

                System.out.println("\t" + fl[j]);

        }

    }

}

   


flavorSet()方法创建了一个名为 results 的 String 数组。该数组的大小为 n—— 具体数值取决于我们传递给方法的自变量。随后,它从数组 flav 里随机挑选一些“香料”( Flavor),并将它们置入 results 里,并最终返回 results。返回数组与返回其他任何对象没什么区别—— 最终返回的都是一个句柄。


另一方面,注意当 flavorSet()随机挑选香料的时候,它需要保证以前出现过的一次随机选择不会再次出现。为达到这个目的,它使用了一个无限 while 循环,不断地作出随机选择,直到发现未在 picks 数组里出现过的一个元素为止(当然,也可以进行字串比较,检查随机选择是否在 results 数组里出现过,但字串比较的效率比较低)。若成功,就添加这个元素,并中断循环( break),再查找下一个( i 值会递增)。但假若 t 是一个已在 picks 里出现过的数组,就用标签式的 continue 往回跳两级,强制选择一个新 t。 用一个调试程序可以很清楚地看到这个过程。


集合


为容纳一组对象,最适宜的选择应当是数组。而且假如容纳的是一系列基本数据类型,更是必须采用数组。


缺点:类型未知


使用 Java 集合的“缺点”是在将对象置入一个集合时丢失了类型信息。之所以会发生这种情况,是由于当初编写集合时,那个集合的程序员根本不知道用户到底想把什么类型置入集合。若指示某个集合只允许特定的类型,会妨碍它成为一个“常规用途”的工具,为用户带来麻烦。为解决这个问题,集合实际容纳的是类型为 Object 的一些对象的句柄。


当然,也要注意集合并不包括基本数据类型,因为它们并不是从“任何东西”继承来的。


Java 不允许人们滥用置入集合的对象。假如将一条狗扔进一个猫的集合,那么仍会将集合内的所有东西都看作猫,所以在使用那条狗时会得到一个“违例”错误。在同样的意义上,假若试图将一条狗的句柄“造型”到一只猫,那么运行期间仍会得到一个“违例”错误


class Cat {

    private int catNumber;

 

    Cat(int i) {

        catNumber = i;

    }

 

    void print() {

        System.out.println("Cat #" + catNumber);

    }

}

 

class Dog {

    private int <code    

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程