Java每日笔记013 集合

Java第13讲

1、集合

	集合是一个存放任意数量对象的引用的容器(多个对象放在另一个对象中,此对象可称为一个集合对象)
	注意:如果集合对象创建时不指定泛型,则在当前集合中可以存放任意类型的对象。
	包括:Collection List Set	Map
	
	List:接口的实现类有ArrayList
		ArrayList:数组结构(底层利用数组实现),以下标形式获取指定位置元素。
			优缺点:查询方便,插入和移除不便,可以重复添加同一个对象。
			场景:一次插入多次查询
			注意:ArrayList创建对象时,默认预留10个元素的位置(初始化数组的长度为10),每次扩容50%。	
	
		LinkedList:链表结构
			优缺点:插入和移除方便(快速),查询不便。
			场景:频繁插入和移除	
	方法:
		get(int index)过去指定位置的元素(核心:通过数组下标获取元素)
		
		add(int index,object element)指定位置去获取。
		romove()参数:位置/对象,如果参数为位置,则移除当前位置的元素,并提供当前位置元素为返回值,如果参数为对象,则移除当前集合第一个匹配的元素。

2、集合中的方法:

	size()表示获取元素当中的个数。
	add()向集合中的默认位置添加一个元素,参数为Object类型的子类。

3、泛型:

定义:泛指一种类型。
		是一种约束:在创建对象时指定,则使用时只能使用此种类型或其子类
		写法:在类名称后面添加<大写字母>,一般来说,类的泛型默认为T,接口的泛型默认为E。
		注意:泛型可以有多个,中间使用逗号(“,”)间隔。	
		注意:使用forEach遍历集合时,当前集合必须指定泛型。

Collection 、List 、Set 、Map接口的联系和区别

Collection:Java.util下的一个接口,是各种集合结构的父接口,List和Set是继承自它的子接口,Collecting是最基本的集合接口,Java SDK中不提供直接继承自Collection的类,而是提供继承自它子接口的类,如List和Set。所用的Collection类都支持一个Iterator()方法来遍历。

List:List接口是有序的,会精确的将元素插入到指定的位置(允许有相同元素)。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素。
ArrayList:List接口实现类,实现可变大小的数组,允许所有的元素,底层用数组实现,可以随机访问(访问效率高,插入和删除效率低),不是同步的,也就是没有同步方法,线程不安全。
LinkedList:List接口实现类,允许null元素,通常在首部或者尾部操作,所以常被使用做堆栈(Stack)、队列(Queue)和双向队列(Deque),底层用链表实现,插入删除效率高,访问效率低,不是同步的,也就是没有同步方法,线程不安全。
Vector:List接口实现类,类似于ArrayList,底层用数组实现,但Vector是同步的,线程安全(Stack继承自Vector)。

Set:是一种不包含重复元素的Collection接口,只关心元素是否属于Set(不允许有相同元素),而不关心它的顺序。
HashSet:Set接口实现类,不能有重复元素,底层使用HashMap实现,是为快速查找设计的Set,存入HashSet的对象必须定义HashCode()。
LinkedListSet:继承自HashSet,具有HashSet的查询速度,底层使用链表实现(维护元素的插入次序),于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
TreeSet:Set接口实现类,保存次序的Set,底层使用树结构实现,使用它可以从Set中提取有序的序列。

Map:是键值对映射集合,且为一一映射,键不能重复,值可以,所以是用键来索引值(即此接口实现Key到Value的映射,一个Map中不能包含相同的Key,但可以包含相同的Value,每个Key只能映射一个Value)。
HashTable:Map接口实现类,实现了一个Key-Value的哈希表,不能存储null值,每一个非null元素都可以作为Key或者Value,是同步的,也是线程安全的。
HashMap:可以存储null值,不是同步的,也不是线程安全的

ArrayList和LinkedList的异同之处及各自的应用场合

ArrayList和LinkedList都继承自传统的list,所以他们都有一些List的特性,但是什么时候使用哪种数据结构成为了很多初学者选择的难题,在这里简单介绍一下两者之间的区别:

ArrayList它是由数组后推得到的;而LindedLsit是由常规的双向链表实现的,每个元素都包含了数据和指向前后元素的句柄。正是由于这个原因,假如想在一个列表中进行大量的插入和删除操作,那么LindedList无疑是最恰当的选择,如果是想频繁的遍历链表,那么ArrayList的速度要快上很多。所以根据具体使用场合,选择恰当的数据结构能大大提高程序的效率。

遍历集合的方法

遍历集合的方法总结
遍历List方法一:普通for循环


for(int i=0;i<list.size();i++){//list为集合的对象名
    String temp = (String)list.get(i);
    System.out.println(temp);
}
遍历List方法二:增强for循环(使用泛型!)


for (String temp : list) {
System.out.println(temp);
}
遍历List方法三:使用Iterator迭代器(1)


for(Iterator iter= list.iterator();iter.hasNext();){
    String temp = (String)iter.next();
    System.out.println(temp);
}
遍历List方法四:使用Iterator迭代器(2)


Iterator  iter =list.iterator();
while(iter.hasNext()){
    Object  obj =  iter.next();
    iter.remove();//如果要遍历时,删除集合中的元素,建议使用这种方式!
    System.out.println(obj);
}
遍历Set方法一:增强for循环


for(String temp:set){
System.out.println(temp);
}
遍历Set方法二:使用Iterator迭代器


for(Iterator iter = set.iterator();iter.hasNext();){
    String temp = (String)iter.next();
    System.out.println(temp);
}
遍历Map方法一:根据key获取value


Map<Integer, Man> maps = new HashMap<Integer, Man>();
Set<Integer>  keySet =  maps.keySet();
for(Integer id : keySet){
System.out.println(maps.get(id).name);
}
遍历Map方法二:使用entrySet

Set<Entry<Integer, Man>>  ss = maps.entrySet();
for (Iterator iterator = ss.iterator(); iterator.hasNext();) {
    Entry e = (Entry) iterator.next(); 
    System.out.println(e.getKey()+"--"+e.getValue());

泛型集合用法及好处

	泛型好处:

泛型简单易用

类型安全 泛型的主要目标是实现java的类型安全。 泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一个高的程度上验证这个类型

消除了强制类型转换 使得代码可读性好,减少了很多出错的机会

Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

泛型的实现原理
泛型的实现是靠类型擦除技术 类型擦除是在编译期完成的 也就是在编译期 编译器会将泛型的类型参数都擦除成它的限定类型,如果没有则擦除为object类型之后在获取的时候再强制类型转换为对应的类型。 在运行期间并没有泛型的任何信息,因此也没有优化。

泛型不考虑继承
List 类型 是否 可以 赋值为 List类型 ?
答案是不可以的
虽然说在赋值之后 String类型可以当做 Object类型使用 但是还是会出现问题
假设如下代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值