`
student_lp
  • 浏览: 431762 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中数组与集合

阅读更多

在java编程的过程中,我们不能确定某一类型的对象到底会需要多少,为了解决这个问题,java提供了容纳对象的多种方式。其中内建的类型是数组;此外还提供了“集合类”,利用这些集合类,我们就可以容纳并操作自己的对象。

一、数组

      如何区分数组和其他集合类呢?其实有两种方式可以区分开:效率和类型。在java中,数组是一个简单的先行序列,它使得元素的访问速度非常快,但付出的代价是--创建一个数组对象时,他的大小是固定的,而且不可在那个数组对象的“存在时间”内发生改变(也就是只能容纳一种类型的对象)。

      有关数组越界问题?在java中,无论使用的是数组还是集合,都会进行范围检查---若超过边界,就会获得一个RuntimeException错误。

      数组的初始化,我们在创建一个数组后,自动进行了初始化,初始化值为null。而对应基本类型的数组,会自动初始化为零(数值类型),null(字符类型)或者FALSE(布尔类型)。

二、集合

1、早期集合类型

     在早期java提供了四种类型的“集合类”:Vector(适量)、BitSet(位集)、Stack(堆栈)以及Hashtable(散列表)。在使用这些java集合时会发现一个缺点,就是:将一个对象置入一个集合时会丢失类型信息。之所以发生这种情况,是由于当初编写集合时,那个集合的程序员根本不知道用户到底想把什么类型的置入到集合中。为了解决这个问题,集合实际容纳的类型为object。这些早期类型已经不太常用,所以这里不再细讲。下面我们主要了解一下新集合。

2、新集合

     1) 新的集合库考虑了“容纳自己对象”的问题,并将其分割成两个明确的概念:

     ①集合(Collection):一组单独的元素,通常应用了某种规则。在这里,List(列表)区分元素的顺序,且允许出现重复的值;Set(集)不区分元素的顺序,不允许出现重复的值;

     ②映射(Map):一系列“键--值”对。不允许有重复的键,每个键最多对应一个值。

     Collection和Map可以通过多种形式实现,下面列出的是一个可以帮助大家立即的集合示意图:


总的说来,Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下:

                  Collection<--List<--Vector
                  Collection<--List<--ArrayList
                  Collection<--List<--LinkedList
                  Collection<--Set<--HashSet
                  Collection<--Set<--HashSet<--LinkedHashSet
                  Collection<--Set<--SortedSet<--TreeSet

2)list常用的衍生类

Vector : 基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能不受Array的限制。性能也就不可能超越Array。所以,在可能的情况下,我们要多运用Array。另外很重要的一点就是Vector:sychronized(线程安全)的,这个也是Vector和ArrayList的唯一的区别。

ArrayList:同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。

LinkedList:LinkedList不同于前面两种List,它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。

总结:1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对;

2. 所有的List中可以有相同的元素,例如ArrayLIst中可以有 [ tom,koo,too,koo ];

3. 所有的List中可以有null元素,例如[ tom,null,1 ];

4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。

3)set常用的衍生类

HashSet:HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看HashSet的add(Object  obj)方法的实现就可以一目了然了。
    public boolean add(Object obj)
    {
        return map.put(obj, PRESENT) == null;
    }

这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。

LinkedHashSet:HashSet的一个子类,一个链表。

TreeSet:SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。

总结:1. Set实现的基础是Map(HashMap);

2.  Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象

3)list和set却别

     虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。

4)映射

HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。并且Hashtable是同步的

HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个),即null value和null key。HashMap是非同步的。

WeakHashMap:WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

TreeMap: 实现这样一个映象,对象是按键升序排列的。

5)同步性

①Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并 不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带 来的不必要的性能开销。

②Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

6)常见的对比

①Vector和ArrayList:参见5)同步性①

②arraylist和linkedlist:ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构;对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针;对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据;

③HashMap与TreeMap:TreeMap是有序的,而HashMap是无序存储的;在Map 中插入、删除和定位元素,HashMap 的效率要更高一些;

④hashtable与hashmap:参见5)同步性②

三、Collections和Arrays类的使用

1、Collections定义了多种集合操作的方法,实现对集合元素排序,取极值,批是拷贝,集合结构转换,循环移位以及匹配检查等功能

          相关方法:
           sort(List<T> list)  根据元素的自然顺序 对指定列表按升序进行排序。
           reverse(List<?> list)  反转指定列表中元素的顺序。
           shuffle(List<?> list)  使用默认随机源对指定列表进行置换。
           copy(List<? super T> dest, List<? extends T> src) 将所有元素从一个列表复制到另一个列表。
           list(Enumeration<T> e) 返回一个数组列表,它按返回顺序包含指定枚举返回的元素
           frequency(Collection<?> c, Object o) 返回指定 collection 中等于指定对象的元素数
           max(Collection<? extends T> coll)  根据指定比较器产生的顺序,返回给定 collection 的最大元素
           rotate(List<?> list, int distance) 根据指定的距离轮换指定列表中的元素。
      在Collections中还有一个非常重要的作用,就是synchronizedXXX(new XXX)。 Collections类为集合类们提供的同步控制方法


2、Arrays类定义了多种数组操作方法,实现了对数组元素 排序,填充,转换为列表或字符串形式、增强的检索和深度比较等功能

              asList()返回一个受指定数组支持的固定大小的列表
              sort()对指定的 byte 型数组按数字升序进行排序
              binarySearch(int[] a, int key) 使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。
              toString(Object[] a)  返回指定数组内容的字符串表示形式。
  • 大小: 57.2 KB
  • 大小: 9.8 KB
分享到:
评论

相关推荐

    Java中数组与集合的相互转换实现解析

    Java中数组与集合的相互转换实现解析 Java中数组和集合是两种不同的数据结构,数组是一种固定长度的数据结构,而集合是一种可变长度的数据结构。它们之间的转换是非常重要的,在实际开发中经常会遇到这种情况。...

    java实验数组和集合

    本实验中我们学习了 Java 语言中的数组和集合操作,掌握了 Java 中的数组声明、初始化、索引访问、遍历等操作,并使用冒泡排序算法将数组元素排序。同时,我们还学习了 Java 中的输入输出操作和异常处理。

    java删除数组或是集合中重复的数据

    java删除数组或是集合中重复的数据

    Java对象、数组、集合转换为Json(Json转化为Java对象、数组、集合)

    这是本人写的一个基于JSON的完整项目,实现了Java对象、数组、集合转换为Json(Json转化为Java对象、数组、集合)。这是一个完整的项目,下载解压后直接导入MyEclipse/Eclipse中,运行com.demo.JSONDemo类即可看到效果...

    数组和集合

    数据类型 数组和集合 图形界面 输入输出流 线程池 网络编程

    Java 集合与数组

    Java 集合与数组是 Java 编程语言中两个非常重要的概念。集合和数组都是用于存储和管理数据的数据结构,但它们有着不同的特点和使用场景。 集合 集合是一系列对象的聚集,实际上是用一个对象代表一组对象,在集合...

    Java数组与集合

    Java中的数组和集合是两种重要的数据结构,它们在存储和管理数据方面发挥着关键作用。数组是最基础的数据结构,而集合则提供了更高级、更灵活的处理方式。 数组在Java中是一个固定大小的序列,用来存储同一类型的...

    Java程序设计 3 数组与集合 简图.ppt

    Java程序设计 3 数组与集合 简图 Java程序设计是Java编程语言的基础,数组和集合是Java程序设计中两个非常重要的概念。本节课我们将对Java程序设计中的数组和集合进行详细的讲解。 数组 数组是一种基本的数据结构...

    5-Java数组与方法

    在Java编程语言中,数组是一种特殊的数据结构,用于存储同类型元素的集合。它们提供了一种方式来组织和管理大量数据,使得我们可以高效地访问和操作这些数据。本章将深入探讨数组的基本概念、定义以及如何在实际编程...

    Java中数组的各种应用

    在Java中,数组可以看作是同类型元素的有序集合。例如,你可以创建一个整型数组来存储一系列的整数。数组的定义通常包含类型和长度两部分。下面是一个示例: ```java int[] numbers; // 声明一个整型数组 numbers =...

    Educoder题目:Java入门 - 数组进阶答案解析.md

    Educoder题目:Java入门 - 数组进阶答案解析

    java中的数组和集合.docx

    java中的数组和集合

    培训-Java基础-数组&集合.ppt

    培训-Java基础-数组&集合.ppt 培训用的ppt 主要讲了java数组和集合 供需要的朋友使用

    java中的数组和集合共2页.pdf.zip

    java中的数组和集合共2页.pdf.zip

    Java程序设计 3 数组与集合.pptx

    Java程序设计之数组与集合 Java程序设计第三章:数组与集合 数组是一组具有相同类型的有序数据的集合。数组中的一个数据成员称为数组元素。数组生成后,数组长度不可改变。 arrays的定义与初始化 * 声明:int ...

    两个数组之间新增集合,公共集合,减少的集合

    这只是一个简单的工具类java中处理两个数组之间元素的情况,具体的情况可以分为:两个数组之间新增集合,公共集合,减少的集合

    Java基础教程:数组和集合

    在本文中,我们将详细介绍 Java 中的数组和集合,包括它们的定义、初始化、访问和常见操作。 数组(Array) 数组是一种用于存储相同类型数据的容器,它可以存储基本数据类型和对象。在 Java 中,数组的长度是固定...

    json转对象数组与对象数组转json --Java

    json转对象数组与数组转json--java--

    java数组 遍历方法集合

    用迭代器遍历用for循环遍历用增强的for循环遍历

Global site tag (gtag.js) - Google Analytics