Java集合框架提供了一套性能优良、使用方便的接口和类,包括Collection和Map两大接口,它们都位于 java.util 包中。其中 Collection集合包含两个常用的子集合-----List和Set(1)List集合常用子类ArrayList Vector(2) Set集合常用子类HashSet TreeSet LinkedHashSet
Map集合和Collection集合是属于平行关系,非包含关系。常用子类-----HashMap TreeMap
注意: 以上集合框架所包含的接口和类,都隶属于java.util包中,所以使用时需要导包。
链表 结构是一种由多个节点组成的线性数据结构,并且每个节点包含有数据以及指向下一个节点的引用。
LinkedList是一种集合类,它 采用链表作为的存储结构,便于删除和添加元素,但是按照索引查询元素效率低下。
链表结构的实现类 LinkedList -------链表+哈希表结构的实现类 HashLinkedSet
LinkedList类介绍:(1)采用链表存储方式(2)缺点:遍历和随机访问元素效率低下 (3)优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才可。如果插入删除发生在头尾可以减少查询次数)
TreeSet一种Collection类型的集合类,其中元素唯一,并采用二叉树作为存储结构,元素按照自然顺序排列。
Set集合特点:无序 唯一(不重复)
Set集合子类-----TreeSet 元素有序(自然顺序) 唯一 二叉树结构存储数据
-----HashSet 元素无序 唯一 哈希表结构存储数据
-----LinkedHashSet 元素有序(添加顺序) 唯一 链表结构维护次序
如果希望将自定义类Student的多个对象放入集合TreeSet,实现所有元素按照某个属性的自然顺序排列,则需要Student类实现Comparable接口。
在之前的Java类中可以发现,有很多类都已经实现了此接口,例如:String Integer等等,目的就是为了对象之间的比较,那么对象之间进行比较需要有一个标准儿,此标准就是按照对象某个属性进行比较。
自定义类例如Student类,此类对象作为TreeSet集合元素存在,比较的话需要此类实现该接口,并重写Comparable接口当中的抽象方法------compareTo()方法,指定比较的标准儿。
在Java中 Map 集合的访问时间接近稳定,它是一种键值对映射的数据结构。这个数据结构是通过数组来实现的。
注意:键值对存储结构集合Map Map集合:key – value 映射--》 Key ---- 无序 唯一 (set集合特点)--》Value-----无序 不唯一(Collection集合特点)
8. 迭代器Iterator为集合而生,专门实现集合遍历,该接口有三个方法,分别是hasNext() 、next()、remove()。
集合的遍历方式:
方式一: 直接输出集合对象
方式二: 使用for-each或标准for循环--->扩展:for-each语句的底层原理使用就是iterator迭代器
方式三: 使用迭代器+while循环进行遍历
迭代器--------Iterator作为接口形式存在
此接口只存在三个方法:---1.hasNext() 判断容器/集合中是否有元素---2.next() 获取当前元素--3.remove() 移除元素
1. 以下选项中关于Java集合的说法错误的是( AC )。(选择二项)
A. List接口和Set接口是Collections接口有两个子接口
B. List接口中存放的元素具有有序,不唯一的特点
C. Set接口中存放的元素具有无序,不唯一的特点
D. Map接口存放的是映射信息,每个元素都是一个键值对
选项A:Collection接口,Collections集合工具类,两者本质上不同。此选项错误。
选项B:List集合特点:有序,不唯一(元素可以重复)
选项C:Set集合特点:无序,唯一,此选项错误。
选项D:Map集合特点:键值对,映射关系
2. 如下Java代码,输出的运行结果是( A )。(选择一项)
public class Test {
public static void main(String[ ] args) {
List<String> list=new ArrayList<String>();
list.add("str1");
list.add(2, "str2");
String s=list.get(1);
System.out.println(s);
}
}
A 运行时出现异常
B. 正确运行,输出str1
C. 正确运行,输出str2
D. 编译时出现异常
add(int index,Object obj)方法指的是在指定位置添加元素。执行到list.add("str1");之后,此集合中元素的size是1
但是执行list.add(2, "str2");的时候,向下标为2的位置,添加数据发现:最大的下标值是1,怎么可能在下标值是2的位置添加元素所以这会出现IndexOutOfBoundsException 下标越界异常。
3. 以下Java代码的作用是首先将一个数组的内容存入集合,然后判断集合中是否有指定的元素存在,其中共有( D )处错误。(选择一项)
import java.util.List;
public class Test {
public int getIndexofArray(float[] f){
int rtn=-1;
float objf=3.4; //此处小数后面应该加F或f
List list=null; //此处数组只有声明,没有实例化
for(int i=0;i<f.size( );i++){//此处数组没有size()方法,只有length属性
list.add(f[i]);
}
for(int i=0;i<list.size( );i++){
float tmp=(float)list.get(i);
if(objf==tmp){
rtn=i;
}
}
return rtn;
}
}
A 0
B. 1
C. 2
D. 3
4. 分析如下Java 代码,编译运行后将输出( B )。(选择一项)
public class Test {
public Test() {
}
static void print(List<Integer> al) {
al.add(2);
al = new ArrayList<Integer>();
al.add(3);
al.add(4);
}
public static void main(String[] args) {
List<Integer> al = new ArrayList<Integer>();
al.add(1);
print(al);
System.out.println(al.get(1));
}
}
A 1
B. 2
C. 3
D. 4
1 add(Object obj)添加元素的方法
2 get(int index) 根据索引值获取具体的对象
分析1.main方法中的a1是局部变量,同理print方法中的a1也是局部变量
2局部变量的作用域:只在当前方法或代码块中有效。也就是main方法中的a1,a1.get(1)调用的是此方法中的List集合对象
对于print方法中的a1,它无能为力,鞭长莫及啊!
5. 在Java中,下列集合类型可以存储无序、不重复的数据的是( D )。(选择一项)
A ArrayList
B. LinkedList
C. TreeSet
D. HashSet
ArrayList 有序(添加顺序) 不唯一(允许重复元素存在)------不满足
LinkedList 有序(链表顺序) 不唯一(允许重复元素存在)------不满足
TreeSet 有序(自然顺序) 唯一(不允许重复元素存在)------不满足
HashSet 无序 唯一 -----满足题的要求
6. 以下代码的执行结果是( C )。(选择一项)
Set<String> s=new HashSet<String>();
s.add("abc");
s.add("abc");
s.add("abcd");
s.add("ABC");
System.out.println(s.size());
A. 1
B. 2
C. 3
D. 4
Set集合特点:无序+唯一 如果出现重复元素,则只会在集合中添加一次;发现四个元素有两个是相同的。
7. 给定如下Java代码,编译运行的结果是( C )。(选择一项)
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
String s = "code";
map.put(s, "1");
map.put(s, "2");
System.out.println(map.size());
}
}
A 编译时发生错误
B. 运行时引发异常
C. 正确运行,输出:1
D. 正确运行,输出:2
Map集合特点: key—value键值对 映射关系
Key要求:无序,唯一
Value要求:无序,不唯一
如果发现,键相同----值不同的情况,那么以最后一个键值对为基准--- 添加到集合中,说白了发生了一次覆盖操作。
map.put(s, "1");----------map.put(s, "2");两行代码出现了上述情况,所以这次向集合中添加元素只能添加一个
也就是map.put(s, "2"); 所以,此时集合中元素的个数是1
8. 下面集合类中属于非线程安全,且结构采用了哈希表的是( C )。(选择一项)
A. Vector
B. ArrayList
C. HashMap
D. Hashtable
保留线程安全 ---- Hashtable
----重安全轻效率:key 和 value都不能为null
非线程安全 ---- HashMap
---- 轻安全重效率: key 和value允许为null
运算速度比Hashtable高。
在Java中,LinkedList类与ArrayList类同属于集合框架类,下列( CD )选项中是LinkedList类有而ArrayList类没有的方法。(选择两项)
A add(Object o)
B. add(int index,Object o)
C. getFirst()
D. removeLast()
ArrayList + linkedList + vector 都属于List集合的子类。
List集合中常用的方法:
add(Object obj) 向集合中添加元素
add(int index,Object obj);向集合指定位置添加元素
根据子类实现接口的原则,接口拥有的方法子类也有,所以选项A 选项B排除。
GetFirst() 获取链表的第一个元素
RemoveLast() 删除链表的最后一个元素
以上两个方法,都是LinkedList类有而ArrayList类没有的方法。
三、 判断题
1. 数组和集合中的元素可以是任何数据类型,包括基本类型和引用类型。( × )
数组----可以是任何类型的数组,包括基本数据类型和引用数据类型。
集合----只能存储对象,即使放入的是1,它也是一个对象而不是数字
2. Java集合中的Set接口和List接口都是从Collection接口派生出来的。( √ )
Set集合和List集合,他们二者都是Collection集合常用的子集合。
但是,Map集合和Collection集合没有包含关系,他们是平行关系。
3. Collection 接口存储一组不唯一,有序的对象,它有两个子接口:List和Set。( × )
Collection特点: 元素无序、不唯一
4. Collection是Java集合顶级接口,其中的元素无序,唯一。Java平台不提供这个接口任何直接的实现。( × )
Collection特点: 元素无序、不唯一 发现该题表述有误。
5. List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引来访问List中的无素,这类似于Java的数组。( √ )
add(int index,Object obj)在指定位置添加元素
get(int index) 根据索引值,获取集合中索引值对应的对象。
说明:ArrayList集合的底层,使用的是数组。
6. HashSet采用哈希表存储结构,特点是查询速度快,但是其中元素无序排列。( √ )
此类采取:哈希表存储元素,对元素添加、删除、查询速度非常快。
缺点:元素无序
7. LinkedHashMap是一种有序的HashMap,查询速度快,便于添加删除操作。( √ )
凡是带哈希表存储结构的类,优点:对元素添加、删除、查询速度非常快
8. 基本数据类型的值可以被直接存储在Vector对象中。( × )
不是直接存储,需要通过JVM对基本数据类型进行包装,变成包装类存储到集合中。
9. Dictionary建立了关键字和值的映射,只要提供一个关键字,Dictionary就会返回一个相应的值。( √ )
Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。给出键和值,你就可以将值存储在Dictionary对象中。一旦该值被存储,就可以通过它的键来获取它。所以和Map一样,
public abstract class Dictionary<K,V>extends Object
Dictionary 类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类。每个键和每个值都是一个对象。在任何一个 Dictionary 对象中,每个键至多与一个值相关联。给定一个 Dictionary 和一个键,就可以查找所关联的元素。任何非 null 对象都可以用作键或值。 通常,应该在此类的实现中使用 equals 方法,以决定两个键是否相同。
注:此类已过时。新的实现应该实现 Map 接口,而不是扩展此类。
10. 泛型是JavaSE1.7的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。Java语言引入泛型的好处是安全简单。( × )
泛型是JDK1.6出现的新特性,不是javaSE1.7也就是JDK1.7出现的。
11. Collection是专门操作集合的工具类,提供一系列静态方法实现对各种集合操作。( ×)
Collection是接口类型,存放单值的最大接口;
Collections是操作集合的工具类,就像数组一样,Arrays类是数组工具类。
12. Iterator接口可以遍历任何Collection接口的实现类,可以从一个Collection中使用iterator( )方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。( √ )
任何类型的集合,都可以使用迭代器进行遍历元素。
Collection集合中,存在iterator( )方法,通过此方法可以创建迭代器对象。
在迭代器之前,使用的是枚举迭代器,不过此时它已经过时,不再使用。
13. 采用增强for循环遍历List或者Set,如果List或者Set没有加泛型,也能遍历。( √ )
格式如下:
for(数据类型 变量名称:数组/集合名称){
System.out.println(变量名称);
}
分析:数据类型-----元素是什么类型,此处就是什么类型
变量名称-----不要和其他的变量名称冲突即可。
数组/集合名称-------像 arr 或 list
如果集合框架没有使用泛型限制,那么元素的类型默认使用Object。
14. 在类已经重写equals和hashCode方法的前提下,equals返回true,hashcode一定相等。( √ )
Equals()方法,最原始存在于Object类中,表示对象在内存当中的地址值。
但是在某些情况下,不能满足子类的要求(想比较对象的内容),此时需要重写此方法。
重写此方法时,内部代码有涉及到哈希码的比较。
四、 简答题
1. 集合和数组的比较
答:数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。具体如下:
1 : 数组容量固定且无法动态改变,集合类容量动态改变。
2:数组能存放基本数据类型和引用数据类型的数据,而集合类中只能放引用数据类型的数据。
3:数组无法判断其中实际存有多少元素,length只告诉了array容量;集合可以判断实际存有多少元素,而对总的容量不关心
4:集合有多种数据结构(顺序表、链表、哈希表、树等)、多种特征(是否有序,是否唯一)、不同适用场合(查询快,便于删除、有序),不像数组仅采用顺序表方式
5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
2. 简述List、Set、Collection、Map的区别和联系。
Collection是Java集合顶级接口,存储一组不唯一,无序的对象;
Map集合是存储键值对的集合,特点:key 唯一 value 允许重复
List接口和Set接口是Collections接口有两个子接口;
List 接口存储一组不唯一,有序(插入顺序)的对象;
Set 接口存储一组唯一,无序的对象;
Collection,List,Set的架构关系图:
(1) List:
1) 是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引来访问List中的无素,这类似于Java的数组。
2) 凡是可以操作索引的方法都是List接口特有方法。
(2) Set:
1) 接口存储一组唯一,无序的对象(存入和取出的顺序不一定一致)。
2) 操作数据的方法与List类似,Set接口不存在与索引相关的方法。
3. ArrayList和LinkedList的区别和联系。它们的底层分别是用什么实现的?
答:ArrayLIst、LinkedList两者都实现了List接口,都具有List中元素有序、不唯一的特点。
有序:添加的顺序/插入的顺序
ArrayList实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高;
LinkedList采用链表存储方式。插入、删除元素时效率比较高
4. 每个对象都有一个哈希码吗?哈希码是根据什么生成的?会不会重复?
答:是的。
哈希码的获取:Object类当中的hashcode()方法进行获取。
同一个对象的哈希码,是不会重复的。
5. HashSet采用了哈希表作为存储结构,请说明哈希表的特点和实现原理。
提示:结合Object类的hashCode()和equals()说明其原理
6. Vector和ArrayList的区别和联系。
答:实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用
两者的主要区别如下
• Vector是早期JDK接口,ArrayList是替代Vector的新接口
• Vector线程安全,效率低下;ArrayList重速度轻安全,线程非安全
• 长度需增长时,Vector默认增长一倍,ArrayList增长50%
7. 请你简述HashMap和Hashtable的区别?
答:实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用
两者的主要区别如下
Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口
Hashtable继承Dictionary类,HashMap实现Map接口
Hashtable线程安全,HashMap线程非安全
Hashtable不允许null值,HashMap允许null值
8. 使用泛型有什么好处?
答:泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。Java语言引入泛型的好处是安全简单。
9. Collection和Collections有什么区别?
答:Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。
Java中还有一个Collections类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
面向对象和数组深入:链接:https://pan.baidu.com/s/1edkknsEmus_qiw77w3YNtg 提取码:qlqr