java基础之数组与集合

数组:
数组保存的是一组有顺序的、具有相同类型的数据。在一个数组中,所有数据元素的数 据类型都是相同的。可以通过数组下标来访问数组,数据元素根据下标的顺序,在内存中按 顺序存放。本节的主要内容是介绍数组的基础知识。
数组的定义:
一维数组的定义分为三种;
1.规定大小,再依次赋值。如:
int[] array=new int[10];array[0]=0;.....;array[9]=9;
2.不规定下标,直接赋值。
a)int [] array=new int[]{1,2,3,4,5,6,7,8,9}
b)int [] array={1,2,3,4,5,6,7,8,9}
注意:在 Java 中,数组的下标是从 0 开始的,而不是从 1 开始。这意味着最后一个索引 号不是数组的长度,而是比数组的长度小 1。如果定义的数组大小是10,而你要取下标是10的数组值,就会报数组下标越界的一个错误。

二维数组的定义:
1.定义相同列个数的二维数组
数据类型 数组名 [][]=new 数据类型 [行的个数][列的个数];
2.定义不同列数的二维数组
1)数据类型 数组名 [][]={{第一行的初值},{第二行的初值},。。,{第N行的初值}}
2)定义每行的不同列数的二维数组
数据类型 数组名 [][]=new 数据类型 [行的个数][];
数组名[数组行下标]=new 数据类型 [列的个数]

数组复制
System.arraycopy(需要复制的数组1,数组下标,需要复制到数组2,开始,结束); 如
int [ ] array1={1,2,3,4,5,6,7,8,9};
int [ ] array2={10,20,30,40,50,60,70,80,90};
System.arraycopy(array1,0,array2,2,5);
结果:
1 2 3 4 5 6 7 8 9
10 20 1 2 3 4 5 80 90



集合:
java基础之数组与集合
在Java中有一套设计优良的接口和类组成了Java集合框架,使程序员操作成批的数据或对象元素极为方便。所有的Java集合都在java.util包中。
        在编写程序的过程中,使用到集合类,要根据不同的需求,来决定使用哪种集合类,比如,要经常遍历集合内元素,就要使用List,如果要保证集合中不存在重复的数据,就要用Set;如果要通过某一键来查找某一值,就要使用Map。
Collection接口是List、Set、Queue的父级接口。
Set接口有两个常用的实现类:HashSet和TreeSet。List接口的常用接口有ArrayList和Vector接口。
Map接口有两个常用的实现类:Hashtable和HashMap。
 1)、列表  List接口(继承于Collection接口)及其实现类 
   List接口及其实现类是容量可变的列表,可按索引访问集合中的元素。 
   特点:集合中的元素有序、可重复; 
   列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
   实现类: 
   ArrayList  实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步,它是以Array方式实现的List,允许快速随机存取。 
   LinkedList实现一个链表,提供最佳顺序存取,适合插入和移除元素。由这个类定义的链表也可以像栈或队列一样被使用。提供最佳顺序存取适合插入和移除元素。 

2)、集 Set接口(继承于Collection接口)及其实现类 
    特点:集合中的元素不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
    对Set中成员的访问和操作是通过Set中对象的引用进行的,所以集中不能有重复对象
    Set也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。
    实现类: 
    HashSet 能够快速定位一个元素,要注意的是:存入HashSet中的对象必须实现HashCode()方法; 
    TreeSet 将放入其中的元素按序存放。 

3)、映射 Map接口及其实现类 
    Map是一个单独的接口,不继承于Collection。Map是一种把键对象和值对象进行关联的容器。 
    特点:key不允许重复。 
    映射与集或列表有明显区别,映射中每个项都是成对的,Map是把键对象和值对象进行关联的容器。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的,也就是说Map中的键对象不允许重复,这是为了保证查询结果的一致性。
关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。
    实现类: 
    HashMap 实现一个键到值映射的哈希表,通过键取得值对象,没有顺序,通过get(key)来获取value,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个); 
    HashTable 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。
      当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。Hashtable的使用不被推荐,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。
    Properties 一般是把属性文件读入流中后,以键-值对的形式进行保存,以方便读取其中的数据。 

4)、Iterator接口 
    Iterator接口位于java.util包中,它是一个对集合进行迭代的迭代器。 
    集合容器(如:List、Set、Map等)本身提供了处理元素置入和取出的方式,但是单一选取元素的方法很受限制。所以我们要用Iterator去选取容器中的元素,它将容器转换成一个序列。 
Iterator iter=Object.iterator();        
while(iter.hasNext()){   } 


集合的常见笔试题(题目很多,可以百度)
1.Collection、Set和List的区别? 
    Collection对象之间没有指定的顺序,允许有重复元素和多个null元素对象;它是Set和List接口的父类,是一种最通用型的集合接口; 
    Set各个元素对象之间没有指定的顺序,不允许有重复元素,最多允许有一个null元素对象; 
    List各个元素对象之间有指定的顺序,允许重复元素和多个null元素对象;

2.Java集合框架是什么?说出一些集合框架的优点?
每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:
(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
(3)通过使用JDK附带的集合类,可以降低代码维护成本。
(4)复用性和可操作性。
3.集合框架中的泛型有什么优点?
Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。
4.Java集合框架的基础接口有哪些?
Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。
Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。
List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。
Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。
一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。
5.为何Map接口不继承Collection接口?
尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。
如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。
6.Iterator是什么?
Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。
7.为何没有像Iterator.add()这样的方法,向集合中添加元素?
语义不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,ListIterator没有提供一个add操作,它要确保迭代的顺序。
8.遍历一个List有哪些不同的方式?
使用迭代器更加线程安全,因为它可以确保,在当前遍历的集合元素被更改的时候,它会抛出ConcurrentModificationException。
9.Collections类是什么?
Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。它包含操作集合的多态算法,返回一个由指定集合支持的新集合和其它一些内容。这个类包含集合框架算法的方法,比如折半搜索、排序、混编和逆序等。
10、LinkedList与ArrayList有什么差别
两者都实现的是List接口。不同之处在于:
(1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。
(2)、get訪问List内部随意元素时。ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要依照顺序从列表的一端開始检查,直到还有一端
(3)、对于新增和删除操作LinkedList要强于ArrayList。由于ArrayList要移动数据
11.List与Map的差别
List是存储单列数据的集合,Map是存储key和value这样双列数据的集合,List中存储的数据是有顺序的,而且同意反复。
Map其中存储的数据是没有顺序的,它
存储的key是不能反复的,value是能够反复的。
List继承Collection接口,Map不是。Map没有父类
12、HashMap存储机制
当程序试图将一个 key-value 对放入 HashMap 中时,程序首先根据该 key 的hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但 key 不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部
13、Map,List与Set的区别
Set(集)
List(列表)
Map(映射)
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象
List的特征是其元素以线性方式存储,集合中可以存放重复对象。 
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。