java里的数组和集合的区别是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java里的数组和集合的区别是啥相关的知识,希望对你有一定的参考价值。

参考技术A 数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素。但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的。还有一点,JAVA里面的数组是会做边界检查的,所以当你越界访问时,会抛出RuntimeException,所以不用担心在C或C++因为不做边界检查而出现的问题了,当然边界检查是以牺牲效率为代价的。数组与其它容器类的区别体现在三个方面:效率、类型识别和可以持有primitives。
JAVA里面提供的其他容器还包括List,Set和Map。他们处理对象的时候就好像这些这些对象都没有自己的类型一样,容器将它所含的元素都看成是JAVA中所有类的根类Object类型的,这样我们只需创建一种容器,就能把所有的类型的对象全部放进去。但是当取出的时候,那就需要我们自己进行类型转换了,不过在JAVA Tiger版里面新引入了“泛型”的概念,结合容器类一起使用就可以解决类型转换的问题,关于“泛型”这就不详细讲解了。从上面的角度来看,这种做法很不错,但是就是苦了primitives,如果是常量的话,可以把primitive转换成wrapper类然后放进容器里面,如果是变量的话,那就只能放在你自己的类里了。与其他容器类相比,数组会在编译的时候作类型检查,从而防止你插入错误类型的对象,或者在提取对象的时候把对象的类型给搞错了,JAVA在编译和运行的时候都能阻止你将一个不恰当的消息传给对象。至于效率,数组无疑是要高于其他容器类的,因为有些容器类的实现就是基于数组的,比如ArrayList。不论从类型检查还是效率的角度来考虑,我们首选数组来作为容器都是没错的,但是数组的缺点就是功能太弱了,所以才会有容器类的出现。
要多说几句的就是,java.util包里面有一个Arrays类,它包括了一组可以用于数组的static的工具方法,其中最基本的是四个方法:用来比较两个数组是否相等的equals();用来填充数组的fill();用来对数组进行排序的sort();以及用于在一个已经排序的数组中查找元素的binarySearch()。所有这些方法都对primitives和Object进行了重载。此外还有一个asList()方法,它接受一个数组,然后把它转成一个List容器。JAVA标准类库还提供了一个System.arraycopy()的静态方法,它能以较快的速度拷贝数组,对primitive和Object都进行了重载,但是注意当对Object数组进行拷贝时,进行的是浅拷贝(shallow copy)。

Java集合(上)

基础知识:

什么是集合?

集合是一个容器。把多个对象放入容器中。有一个水杯,你可以选择把水不断往里装,也可以选择装牛奶。但是不能两种不同的东西混合装一个杯子。集合这个容器里装的一定是同一类型的东西。(引用类型,不能是基本类型)

看到这个介绍,我们可能想到数组,数组要求的也是里面必须存放的是一种数据类型的结构。

数组和集合的区别呢?

数组大小是固定的,集合的大小理论上是不限定。

数组里的元素可以是基本类型,也可以是引用类型。集合只能放引用类型。

下图是集合家族的主要成员们(图来自百度)

由图可见,Collection接口Map接口是两个老大。Collection接口下面又生出来了Set接口(无序),List接口(有序),queue接口。Map接口保存的是有映射关系的数据。Map里的子类都有一个共同的特征就是里面数据都是key-value.举例,语文-80,数学-78,科目是不能重复的,分数是可以重复的,所以,Map里的key不能重复,value可重复。需要查分数(value),就通过科目(Key)来取。

具体实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等,主要分为以下三类

从上图可知,Set集合是无序的,只能根据集合里的元素本身访问。

List集合是有序的,可以通过索引访问。

Map集合可通过每个元素的Key访问value.

下面列出了Collection接口下方法

 大概看一眼,这些方法无非就是添加对象,移除对象,判断集合是不是空,清空容器,所以无需记忆。

有方法值的一提的是  当你需要把集合元素转成数组元素时候用Object[]  toArray() ,有个陷阱:注意注释部分,数组不能直接(String[])这样强制将数组变量转换,只有在使用使将元素转换为String,

首先看下List的这两个方法的说明:

 Object[ ] toArray() :返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。

 <T> T[ ]  toArray(T[] a) :返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型

 Collection<String> arr = new ArrayList<String>();

       arr.add("a");

       arr.add("b");

       arr.add("b");//可以添加重复的对象
       // String[] str = (String[])arr.toArray();//error

       Object[] obj = arr.toArray();//第一种方法

       String[] obj1 = arr.toArray(new String[3]);//第二种方法

Db.query()第二个是多个不确定的参数,多个参数可以被作为数组传进来。List集合转数组举例

/**
     * 封装预处理参数解析并执行查询
     * @param sqlId
     * @param param
     * @return
     */
    public <T> List<T> query(String sqlId, Map<String, Object> param){
        LinkedList<Object> paramValue = new LinkedList<Object>();
        String sql = getSqlByBeetl(sqlId, param, paramValue);
        return Db.query(sql, paramValue.toArray());
    }

 

补充下getSqlByBeetl如果要sql里需要Map的话,如下参考:

/**

     * 验证编码是否存在
     * @param operatorid
     * @param type
     * @return boolean
     * 描述:新增角色组时operatorid为空,修改角色组时operatorid传值
     */
    public boolean valiQbgjxwcqkxxno(String qbgjxwcqkxxno, String type){
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("column", Jxwc.column_qbggyzfqkxxno);
        param.put("table", Jxwc.table_name);
        String sql = getSqlByBeetl(Jxwc.sqlId_select, param);
        List<Jxwc> list = Jxwc.dao.find(sql,qbgjxwcqkxxno);
        int size = list.size();
        if("add".equals(type)){
            if(size == 0){
                return true;
            }
        }else{
            if(size <= 1){
                return true;
            }
        }        
        return false;
    }

 

Collection接口是List,Set,Queue接口的父接口,所以Collection图方法都能操作下这三种集合。 

 

以上是关于java里的数组和集合的区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

JAVA里面set,map,list的区别是啥?(尽量详细)

java 里的,vector是啥? 起到啥用,何时才会用到??

Java集合(上)

Java的数据结构你用过哪些?Map与Set的本质区别是啥?

JDK之数据结构---集合

Java里的集合--主要区别