黑马程序员——JAVA笔记之集合框架(泛型、Map等)
来源:互联网 发布:企业网盘源码 编辑:程序博客网 时间:2024/06/11 09:44
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
集合框架(泛型、Map等)
面向对象语言对事物的体现都是以对象的形式,所有未来方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只等存储对象。
集合只用于存储对象,集合长度是可变的,集合可以存储不同里如此的对象。
集合中存储的都是地址。
一、Collection
Collection 是层次结构 中的根接口。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
Collection
|–List:元素是有序的,元素可以重复。因为该集合体系有索引。
|–Set:元素是无序,元素不可以重复。、
创建一个集合容器。使用Collection接口的子类。ArrayList
ArrayList al = new ArrayList();
1.添加元素;al.add(“java01”); addAll(collection);
2.打印源集合;System.out.println(al);
3.删除元素;al.remove(“java01”;) al.removeAll(collection);
清空集合;al.clear()
4.判断元素;al.contains(“java01”)//java01是否存在。
al.isEmpty();//集合是否为空
5.获取。集合长度;al.size();
返回迭代的迭代器 Iterator it=al.iterator();hasNext()返回真假判断下一个元素有没有;is.next()下一个元素的值。
…
While(it.hasNext()){System.out.println(is.next())}
…
6.获取交集。al1.retainAll(al2);//al1中只会保留al2中相同的元素
7.集合变数组。al.toArray();
迭代器
在集合内部定义的内部类,方便直接访问集合内容。每个用钱的数据结构不同,所以取出的方法也不同,但是有共性内容判断和取出,那么可以将写共性抽取。把共性的东西取出来成接口就是Iterator,这是内部类都符合的规则,可以通过对外提供的方法iterator();来取出元素。
二、List集合
List:元素是有序的,元素可以重复。因为该集合体系有索引。
特有方法: 凡是可以操作角标的方法都是该体系特有的方法。
添加 add(index,element); addAll(index,Collection);
删除 remove(index);
修改set(index,element);//修改这个远程set(“java02”)在当前角标修改成java02
获取元素get(index):
subList(from,to);
listIterator();
获取位置 int indexOf(obj):获取指定元素的位置。
列表迭代器:ListIterator listIterator();
List集合特有的迭代器。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。(并发修改异常)
所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
|–List:
|–ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|–LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|–Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。(淘汰)
Enumeration
*枚举就是Vector特有的取出方式。发现枚举和迭代器很像。其实枚举和迭代是一样的。因为枚举的名称以及方法的名称都过长。所以被迭代器取代了。枚举郁郁而终了。
注:此接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。
LinkedList
LinkedList:特有方法:
addFirst(); addLast();添加到头,添加到尾
getFirst(); getLast();获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast();获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst(); offerLast(); 在此列表的开头(结尾)插入指定的元素。
peekFirst(); peekLast();获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst(); pollLast();获取元素,但是元素被删除。如果集合中没有元素,会返回null。
堆栈:先进后出 如同一个杯子。
队列:先进先出 First in First out (FIFO) 如同一个水管。
三、Set
Set集合的功能和Collection是一致的。
–Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
|–HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|–TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。 保证元素唯一性的依据:compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。这种方式也成为元素的自然顺序,或者叫做默认顺序。
记住,排序时,当主要条件相同时,一定判断一下次要条件。因为返回0的话,会认为元素相等。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
TreeSet
当元素自身不具备比较性,或者具备的比较性不是所需要的。这时需要让容器自身具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
TreeSet集合排序有两种方式,Comparable和Comparator区别:
1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
第二种方式较为灵活。
四、泛型
泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
1).好处:
1.将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,安全。
2,避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,
只要见到<>就要定义泛型。
其实<> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
ArrayList al= new ArrayList();
Iterator it= al.iterator();
2).什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。
现在定义泛型来完成扩展。
class Utils<QQ>{ private QQ q; public void setObject(QQ q){ this.q=q;}public QQ getObject(){return q;}}class GenericDemo{ public static void main(String[] args){ Utils<Worker> u=new Utils<Worker>(); u.setObject(new Student()); Worker w=u.getObject();}}
3). 泛型定义方法上
泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
4).泛型限定:
? 通配符。也可以理解为占位符。
泛型的限定;
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限
五、Map
Collection一次存一个元素;Map一次存一对元素。
Collection是单列集合;Map是双列集合。
Map中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。
public interface Map
Map<String,String> map = new HashMap<String,String>();map.put("02","zhangsan2");Set<String> keySet = map.keySet();//有了Set集合。就可以获取其迭代器。Iterator<String> it = keySet.iterator();while(it.hasNext()){ String key = it.next(); //有了键可以通过map集合的get方法获取其对应的值。 String value = map.get(key); System.out.println("key:"+key+",value:"+value);}
Set<Map.Entry<k,v>> entrySet:映射关系set视图Map<String,String> map = new HashMap<String,String>();map.put("02","zhangsan2");Set<Map.Entry<String,String>> entrySet = map.entrySet();Iterator<Map.Entry<String,String>> it = entrySet.iterator();while(it.hasNext()){ Map.Entry<String,String> me = it.next(); String key = me.getKey(); String value = me.getValue(); System.out.println(key+":"+value);}
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。
为什么要定义在map内部呢?entry是访问键值关系的入口,是map的入口,访问的是map中的键值对。
代码练习:
package text2;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;/** * "sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。 * 希望打印结果:a(1)c(2)..... * @author Administrator * */public class MapTest { public static void main(String[] args){ String s = charCount("sadweoithkaa;ajdfoiwenv"); System.out.println(s); } public static String charCount(String str){ char[] chs = str.toCharArray(); TreeMap<Character, Integer> tMap = new TreeMap<Character, Integer>(); int count = 0; for (int i = 0; i < chs.length; i++) { if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z')) continue; Integer value = tMap.get(chs[i]); if (value!=null) { count = value; } count++; tMap.put(chs[i], count);;//直接往集合中存储字符和数字,为什么可以,因为自动装箱。 count=0; } StringBuilder sBuilder = new StringBuilder(); Set<Map.Entry<Character, Integer>> set = tMap.entrySet(); Iterator<Map.Entry<Character, Integer>> iterator = set.iterator(); while (iterator.hasNext()) { Map.Entry<Character, Integer> mEntry = iterator.next(); Character ch = mEntry.getKey(); Integer value = mEntry.getValue(); sBuilder.append(ch+"("+value+")"); } return sBuilder.toString(); }}
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
- 黑马程序员——JAVA笔记之集合框架(泛型、Map等)
- 黑马程序员java之集合框架Map
- 黑马程序员-java集合笔记之map
- 黑马程序员—Java学习笔记之集合框架(一)
- 黑马程序员—Java学习笔记之集合框架(二)
- 黑马程序员———集合框架之Map接口
- 黑马程序员——集合框架之Map
- 黑马程序员——java基础知识之泛型、集合(Map、工具类等)
- 黑马程序员——【Java】集合框架——Map
- Java集合框架之Map集合学习和笔记——黑马训练营
- 黑马程序员——Java集合框架—Map
- 黑马程序员—Java集合框架(Map、HashMap、TreeMap)
- 黑马程序员——JAVA笔记——集合框架3——map
- 黑马程序员——Java要点笔记——集合框架(Map)
- 黑马程序员——集合框架Map
- 黑马程序员——java基础之集合框架(Collection 和 Map)
- 黑马程序员——Java基础_集合框架之Map
- 黑马程序员——Java集合框架(一)之迭代器、Collection层次结构等
- Reverse Bits
- 今日无事2015314
- Sicily 1737. Funny Game
- Sicily 1736. Electric Power Grid
- Sicily 1734. Convex hull again
- 黑马程序员——JAVA笔记之集合框架(泛型、Map等)
- 【VB.NET2010】VB.NET的AES加密
- MFC滚动条测试
- 第一篇文章
- ZZMobtoms lh3x MR7
- Intent选择系统资源(图片,媒体等)的两种方式
- CentOS 6.5 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
- 黑马程序员——Java之数组
- 【转载】linux route 实现(C 语言实现标准route指令)