相对于数组(Array)来说,集合长度可变,更加适合现代开发要求。可以存储任何类型的数据,也可以结合泛型来存储具体的类对象,集合类通常存在于java.util包中
集合分为两大体系
- Collection体系
- Map体系
Collection和Map分别是两个体系的顶层接口
集合作为参数
集合作为参数的时候是引用传递
Collection体系
主要有三个子接口
- List(列表)
- Set(集)
- Queue(队列)
List和Set中的元素有序可重复,Set中的元素不可重复。
List实现类
- ArrayList
- LinkedList
Set实现类
- HashSet(无序)
- TreeSet(有序)
Queue实现类
- 数组
- 链表
List
集合是有序的,可以对每个元素的插入位置进行精确的控制,可以通过索引来访问元素,遍历数组。
实现类中ArrayList底层通过数组来实现,通过元素增加来动态扩容。LinkList底层通过链表来实现,随着元素的不断增加不断向链表的后端增加节点。
ArrayList
- 实现了List,得到了List集合框架的基础功能
- 实现RandomAccess,获得了快速随机访问元素的功能。RandomAcess是一个标记接口,没有任何方法
- 实现了Cloneable,得到了clone()方法,可以实现克隆功能
- 实现了Serializable,可以被序列化,通过序列化去传输,典型的应用就是Hessian协议
LinkedList
- 实现了List,得到了List集合框架的基础功能
- 实现了Cloneable,得到了clone()方法,可以实现克隆功能
- 实现了Serializable,可以被序列化,通过序列化去传输,典型的应用就是Hessian协议
- 实现了Deque,Deque是一个双向队列,既可以先入先出,又可以先入后出。及可以头部添加元素,也可以尾部添加元素
List常用方法
public static void main(String[] args) {
// 初始化ArrayList
List<String> list= new ArrayList<>();
System.out.println("List内容:"+list.toString());
System.out.println("List长度:"+list.size());
// 添加内容
list.add("good");
list.add("123");
list.add(2,"hello");//不可以向三号位置添加,会报错溢出
System.out.println("List内容:"+list.toString());
System.out.println("List长度:"+list.size());
// 修改内容
list.set(1,"xiugai");
System.out.println("List内容:"+list.toString());
System.out.println("List长度:"+list.size());
// 获取List内容
String a=list.get(1);
System.out.println("a:"+a);
// 迭代器遍历集合(ArrayList遍历器为Iterator,LinkedList为ListItr
Iterator<String> iterator =list.iterator();
while (iterator.hasNext()){
String next=iterator.next();
System.out.println("next:"+next);
// for循环迭代集合:
for(String str:list){
System.out.println("str:"+str);
// 判断功能:
boolean isEmpty = list.isEmpty();
boolean isContain = list.contains("my");
// 把集合转换成数组:
String[] strArray =list.toArray(new String[]{});
}
}
}
结果:
List内容:[]
List长度:0
List内容:[good, 123, hello]
List长度:3
List内容:[good, xiugai, hello]
List长度:3
a:xiugai
next:good
str:good
str:xiugai
str:hello
next:xiugai
str:good
str:xiugai
str:hello
next:hello
str:good
str:xiugai
str:hello
List排序
List<String> b= new ArrayList<String>();
Collections.addAll(b,"z x c v b".split(" "));
System.out.println(b);
Collections.sort(b);
System.out.println(b);
Collections.sort(b, new Comparator<String>() {
@Override
//return<0交换,>=0不交换
public int compare(String o1, String o2) {
if (o1.compareTo(o2) > 0) {
return -1;
}else {
return 1;
}
}
});
System.out.println(b);
输出结果
[z, x, c, v, b]
[b, c, v, x, z]
[z, x, v, c, b]
Map体系
以键值对(key,value)形式存在,Key必须唯一。
可以分为三类
- 通用Map,用于应用程序中管理映射,通常在java.util程序包中实现
- 专用Map,不需要亲自创建,可以通过其他类对其进行访问
- 帮助我们实现自己Map类的抽象类
类型区别
HashMap
import java.util.Map来使用
根据键(key)的HashCode值存储数据,根据键获取它的值,有很快的访问速度。
只允许一个记录的键为Null,多条会覆盖,允许多条记录的值为Null
HashMap的key和value必须使用包装类或者实体类
TreeMap
把保存的记录根据键(key)排序,默认是升序,可以改变排序方式。不允许key为Null
Hashtable
key和value都不可以为Null.允许线程同步,即任意时刻只有一个线程写,所以写入比较慢
LinkedHashMap
保存插入顺序,先得到的记录是先插入的。循序kye和value为Null
//初始化
Map<String,String> map =new HashMap<String,String>();
//插入元素
map.put("key1","value1");
//获取元素
map.get("key1")
//去除元素
map.remove("key1")
//清空map
map.clear();
hashmap.put问题
Map<String,Object> map = new HashMap<String, Object>();
map.put("first","2");
System.out.println(map);
map.put("first","1");
System.out.println(map);
map.put("first","3");
System.out.println(map);
//有同名的输出最后一个
System.out.println(map.get("first"));
输出结果
{first=2}
{first=1}
{first=3}
3
map.entry<k,v>
学习自
//非entryset方法
Set keys = map.keySet( );
if(keys != null) {
Iterator iterator = keys.iterator( );
while(iterator.hasNext( )) {
Object key = iterator.next( );
Object value = map.get(key);
//map.entrySet返回一个Set,Set的每一项为一个数据结构,包含key和value
Set entries = map.entrySet( );
if(entries != null) {
Iterator iterator = entries.iterator( );
while(iterator.hasNext( )) {
Map.Entry entry =iterator.next( );
Object key = entry.getKey( );
Object value = entry.getValue();
for (Map.Entry<Object, Object> entry : map.entrySet()) {
int value = entry.getValue();
String key = entry.getKey();
}
Iterator 迭代器
学习自
迭代器是一种设计模式,用来遍历数据结构中的全部内容
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。