Java中的容器

来源:互联网 发布:剑雨江湖仙器进阶数据 编辑:程序博客网 时间:2024/06/03 20:26

容器在程序中具有最重要的角色,具有存储数据和传递数据的功能,对容器赋值正是对内存中一个地址单元赋值。我们通过容器可以对存储的或是传递的数据进行操作。这也是Java面向对象思想的一种体现,就如生活中的我们的用一些袋子、包裹去存储打包物品,满足我们对物品操作,下面笔者就谈谈Java中的一些容器。

1,变量

变量就如同我们生活中的小袋子,把我们输入的字符串或数值装起来,用的时候再取出来。变量可以保存临时数据,变量还可以在函数中或者过程中传递参数(在函数过程中要处理的数据对象)。


2,数组:数组是在内存开辟的一块连续区域

数组也是一种容器,可以存放同一种数据类型(可存基本数据类型也可以存引用数据类型)。数组中元素都有索引,索引从0开始到数组的长度-1结束,数组的元素都是有序存放的。通过索引可以对数组中的数据一般可以进行增删、查找、赋值操作,在使用数组前必须指定数组数组容量,例如创建一个整形数组:int [] arr = new int [4];需要指定其空间大小为4,一旦数组容量确定,容量大小就不可以改变了,我们可以通过数组名.length来获得数组的容量(长度)。在存放数据时需要指定存放的位置即数据索引,如给数组arr[0] = 12;在数组的0角标位置上存放一个int数值12。下图为数组在内存中图解

给你介绍数组中两个常用方法:

1)二分查找法:static void binarySearch(int [] a,int key);

2)static void sort(int [] arr); 对int类型数组排序的方法




3.StringBuffer(StringBuilder)

存储字符的容器(字符串缓冲区对象内部有一个char类型的数组,只是这个数组属于可变数组)StringBuffer属于线程安全的缓冲区对象,StringBuilder属于线程不安全的缓冲区对象。通过这两个容器可以对字符串数据进行

增:append。。

删:delete。。

修改setcharAt(int index, char ch)

插入insert。。

查找indexOf等操作


4.集合

相对于前面的容器的局限:变量存储数据时,存储多个数据,就会书写比较麻烦;数组只能存储同一种类型的数据,当数组容量确定后,无法再添加新值。集合也是一种容器,相对于数组来说:集合大小可以改变,集合中可以存放任意引用类型的数据,集合中元素除了可以使用角标访问以外还可以使用其他方式访问。

4.1集合框架介绍

集合是用来存储数据的。但是,在存储数据时,会存在不同的存储需求,例:存储的数据不能有重复值,存储的数据会按照某种规则自动排序。针对不同的存储需求,java就提供不同的集合对象,而这些集合对象却具有共性的功能:存储功能、获取功能等。java对于共性的功能会向上抽取,经过不断的向上抽象,最终形成了java中的集合框架体系(简称:集合框架)



我们再看看集合类中完整关系图:


4.2Collection接口:

通过查阅API:

1、  Collection集合,属于集合框架的顶层接口

2、  在Collection集合下具有两个子接口:Set、List

 

Collection集合中的常用方法:

  添加方法:boolean add(Object  obj)   

            向集合中存储指定obj对象元素。存储成功则返回true

  删除方法:boolean  remove(Object obj)

            从集合中删除指定的obj元素。 如果obj存在则删除成功并返回true

 

  修改方法:Collection集合中没有修改集合中元素的功能

          

  查询方法:在Collection集合中没有直接可以从集合中获取元素的功能,当需要从Collection集合中获取元素,需要通过遍历集合的方式获取集合中存储的元素

           遍历Collection集合: Iterator  iterator() 

 

  其它方法:

    void clear()     清空集合中存储的所有元素(删除全部数据)

boolean contanis(Object obj) 判断集合中是否包含指定的obj元素

boolean isEmpty()  判断是集合中是否有存储的元素(没有存储元素则返回true)

int size()  获取集合中所存储元素的个数(集合的大小)

Object[] toArray()  把集合对象转为数组

 

|---------------Collection接口

|---------List接口:有序、可以存储重复元素、可以通过角标来操作集合(添、删、改)  

List集合有一个专属的迭代器:ListIterator

  通过角标来添加元素   add(int index,Object obj)

      通过角标来删除元素   remove(intindex)  返回所删除的元素

      通过角标来修改元素   set(intindex, Object obj) 返回修改之前的元素

       通过角标来获取元素   get(intindex)

  |----ArrayList:实现了List接口,底层是可变数组结构

                   查询速度快,增删速度慢

      |---LinkedList:实现了List接口,底层使用链表结构(有头有尾),特有方法都是围绕着头和尾去设计的

                   查询速度慢,增删比较快

          addFirst(Object  obj)  在头角标添加元素

          addLast(Object  obj)  在尾角标添加元素

          removeFirst()  删除头角标元素

          removeLast()  删除尾角标元素

          getFirst()  获取头角标元素

          getLast()  获取尾角标元素

      |----Vector   底层使用数组结构

 

  |-----Set接口:无序、不能存储重复元素,没有角标只能使用迭代器来遍历集合

               Set接口是继承了Collection接口,所以Set集合中的方法都来自于Collection

      |----HashSet:实现了Set接口,底层是哈希表结构,只能使用Iterator来遍历

          |----LinkedHashSet类:底层是哈希+链表结构

      |----TreeSet:实现了Set接口,底层是二叉树结构,在添加元素时会对元素进行排序

                  排序方式有两种:

1,  自然排序(前提:对象必须具备compareTo方法[实现Comparable                  接口])

2,  比较器排序(使用Comparetor进行排序)

 注意:当对象同时具有自然排序和比较器排序,优先比较器排序

 

Map接口:不能直接使用迭代器遍历。

  添加:  put(K key,Vvalue)    key在集合中是唯一的  value可以存储重复元素

        put方法在添加对象时,key就表示键,value就表示值,put存储的是一对键值对

        当存储对象时,会按key的名称先进行查找,没有找到相同的key,就存储value对象,并返回null

        如果存储时有相同的key已经在map集合中存在了,value对象会覆盖之前的对象,并返回之前的对象(旧的value对象)

删除: remove(Object key)

        根据指定的key值去map集合中查找相同的key,如果没有相同的key,不执行删除操作,并返回null

         如果存在相同的key值,就删除相同key值对应value的一对对象(key-value同时删除) ,并返回被删除的value(旧的value对象)

修改: 使用put方法进行修改

获取: get(Object key)

        根据指定的key去集合中查找相同的key,如果有相同的key,就返回查找到的key所对应的value对象,如果没有相同的key,返回null

        size() 获取map集合所存储key-value对的个数

判断: containsKey(Object key)  根据指定的key去map集合判断有没有相同的key存在

         containsValue(Object value) 根据指定的value去map集合判断有没有相同的value

         isEmpty()  判断map集合是否为空

  |-----Hashtable类:数据结构:哈希表;不允许使用null作为key和value,已经被HashMap代替

         |----Properties类:属性集。存储键值都是字符串,可以利用流来对键值进行操作

  |----HashMap类:数据结构:哈希表;允许使用null作为key和value,但是key只能有一个null(key要保证唯一性),value可以存储重复对象

         |----LinkedHashMap类:链表+哈希表。可以保证存取的元素顺序是一致的

  |----TreeMap类:数据结构:二叉树。可以按照存储的key进行排序

 上面给大家罗列了集合的这么多内容体系,想必你一定会感觉到集合功能的强大,或者是集合在Java开发中占据的位置了,下面再给大家介绍集合工具类Collections中更使用的常用的工具:

1)Collections.max(Collection<?extends T>coll ),根据元素自然排序,返回给定的Collection的最大值,当然求最小值min,同样的道理

2)Collections.sort(集合对象),对集合内的元素排序

3)Collections.reverse(集合对象);将集合元素排序反转

注意:通常方法2、3只针对存储有序的集合使用,例如List集合



数组中和集合的转换:

 数组转集合:使用集合工具类Arrays下的asList()方法。如将一个整形数组转为集合

Integer num []{2,3,4,5,6};  

List list = Arrays.asList(num);此时list集合中存储的就是数组中元素。

注意:1)将数组转为集合时一定要将数组类型定义为包装类型,而非基本类型

2)数组转换后的存储数组元素的集合大小就确定了,不能再向里面添加元素


集合转数组:set.toArray(); 把集合set转为数组


1 0
原创粉丝点击