[置顶] Java集合类的使用
2016-02-17 10:31
603 查看
Java集合类的使用
集合类按接口分为以下两类:Collection接口和Map接口
Collection接口的特点
List集合代表一个有序集合,允许集合中存在相同的元素,允许多个null 元素.Set集合不允许包含相同的元素, 并且最多包含一个null 元素。
Queue模拟队列的数据结构,关注元素被处理时的顺序, 队列通常以FIFO(先进先出),
不过优先级队列和 LIFO 队列或堆栈例外。
实现Collection接口的一些常用类
ArrayList可以将它理解成一个可增长的数组,它提供快速迭代和快速随机访问的能力。LinkedList 中的元素之间是双链接的,当需要快速插入和删除时LinkedList成为List中的不二选择。
Vector是ArrayList的线程安全版本,性能比ArrayList要低,现在已经很少使用。
HashSet当不希望集合中有重复值,并且不关心元素之间的顺序时可以使用此类。
LinkedHashset 当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。
TreeSet当不希望集合中有重复值,并且希望按照元素的自然顺序进行排序时可以采用此类。
(自然顺序意思是某种和插入顺序无关,而是和元素本身的内容和特质有关的排序方式,
譬如“abc”排在“abd”前面。)
Map接口的特点
Map关注元素的Key:Value映射关系,以Key标识唯一性,相同的Key会覆盖掉之前的Value。实现Map接口的一些常用类
HashMap当需要键值对表示,又不关心顺序时可采用HashMap。Hashtable注意Hashtable中的t是小写的,它是HashMap的线程安全版本,现在已经很少使用。
LinkedHashMap 当需要键值对,并且关心插入顺序时可采用它。
TreeMap当需要键值对,并关心元素的自然排序时可采用它。
##.在声明集合变量时,不应该使用具体的类,用合适的接口
ArrayList users = newArrayList();改成
Listusers = new ArrayList();
##. 关于线程安全
ArrayList,LinkedList类不是线程安全的, 如果想共享在多线程下使用,这最好在创建时用以下方式创建,以防止意外对列表进行不同步的访问:
List list= Collections.synchronizedList(new ArrayList(...));
List list= Collections.synchronizedList(new LinkedList(...));
HashMap,LinkedHashMap类不是线程安全的, 如果想共享在多线程下使用,
这最好在创建时用以下方式创建,以防止意外对列表进行不同步的访问:
Map m =Collections.synchronizedMap(new HashMap(...));
Map m =Collections.synchronizedMap(new LinkedHashMap(...));
关于ConcurrentHashMap,这个类与Hashtable一样是线程安全的,但性能比Hashtable要好很多,
但需注意此类与Hashtable 相似,但与HashMap 不同,它不允许将null 用作键或值,
还有不要频繁调用ConcurrentHashMap.size()方法,这个方法要遍历Map才能得出结果,性能不好。
##. 后进先出集合类Stack,Deque
##.基本数据类型的的自动装箱
我们知道集合中存放的是对象,而不能是基本数据类型,在Java5之后可以使用自动装箱功能,更方便的使用集合类
List<Integer> list = newArrayList<Integer>();
list.add(new Integer(42));
list.add(43);
##.Map的迭代取值
Map<String,String> map = newHashMap<String, String>();for(Map.Entry<String, String>entry : map.entrySet()){
entry.getKey();
entry.getValue();
}
##.将Map对象加上“写保护”
Map<String,String> map = newHashMap<String, String>();//这个操作将使unmodMap 对象不支持对元素的变更操作,否则报UnsupportedOperationException
Map<String,String> unmodMap =Collections.unmodifiableMap(map);
##.不要过度类型强制转换,向上转型是安全的,向下转则有可能会报错
如将一个对象强制转换为ArrayList,但是实际上List就可以啦。过度强制转会导致ClassCastException错误,而且也会给测试带来麻烦。
printUsers((ArrayList)getUsers());
改成
printUsers((List)getUsers());
##. ArrayList的排序
List<String> list =new ArrayList<String>();list.add("abc");
list.add("def");
list.add("tony");
list.add("amy");
list.add("leon");
Collections.sort(list); // 元素的自然顺序
Collections.sort(list, new Comparator(){ //自定义Comparator排序
public int compare(Object o1, Object o2){
if(o1.equals(o2)){
return 0;
}
return 1;
}});
##.数组和List之间的转换
数组转LISTString[] array = {"a","b","c"};
List<String> list =Arrays.asList(array);
LIST转数组
array = (String[])list.toArray();
array = list.toArray(new String[0]);
##.几种遍历LIST的方法
List<String> list = newArrayList<String>();list.add("rose");
list.add("tony");
list.add("adson");
// 第一种ForEach遍历LIST,其实这是编译器帮你做的Iterator操作
for(String s : list){//注意: list不能为null,否则NPE
System.out.println(s);
}
// 第二种Iterator遍历LIST
Iterator<String> iter =list.iterator();
while(iter.hasNext()){
String s = iter.next();
System.out.println(s);
}
// 第三种通过元素下标遍历
for(int i=0; i<list.size(); i++){
String s = list.get(i);
System.out.println(s);
}
相关文章推荐
- 深入分析JavaWeb 18 -- JavaWeb的两种常用开发模式
- Java 环境变量
- Java NIO:浅析I/O模型
- java实现top K排序
- sublime3配置java编译环境
- 全面解析Java注解
- 使用 eclipse 生成项目文档
- Spring + Kafka 客户端实现
- 字母 日期或时间元素 表示 示例 (java)
- Java api 入门教程 之 JAVA的文件操作
- 详解Java设计模式编程中的策略模式
- Eclipse调试技巧
- Java文件操作
- 手机连接不上eclipse或者adb启动不了
- 同步本地时间与服务器时间的解决方案
- servlet弹出提示框并跳转页面
- spring mvc 的@PathVariable对应中文乱码解决办法
- 基于Spring的Web缓存
- 深入分析JavaWeb 17 -- JavaBean组件
- Java内存分配全面浅析