Java–08
第五章 集合
目录
前言
21世纪,走进了信息时代,各种各样的软件层出不穷,但是总离不开程序开发,离不开程序开发语言,Java语言作为人们所熟知的一门语言,对于其有必要进行系统的学习。
集合
1.定义
集合,指一组未知长度数据的统称。在java中,常用数组来存储相同数据类型的定长数据,
但是实际情况中,往往会有大量数据需要进行存储,其数据长度未知,使用数组存储,容易
产生索引越界等异常,故,java中提供长度可变的存储数据的类,集合类;
2.分类
集合根据存储结构不同,分为单列集合与双列集合
2.1 单列集合
单列集合均为Collection的子类,根据元素是否可以重复,分为元素可重复的:
ArrayList,LinkedList,Vector,Stack;以及元素不可重复的HashSet,
TreeSet:
2.1.1 ArrayList
ArrayList是常见的单列集合,也是使用最频繁的集合。其存储结构为顺序结构,读取数据
速度快,但是对数据进行增删操作时间消耗大;
ArrayList list = new ArrayList();//实例化ArrayList对象
list.add(1);//添加元素 object类型
list.add(1, 3);//指定位置添加元素 object类型
list.set(0, "2");//修改指定索引元素
System.out.println(list.size());//获取ArrayList的长度
System.out.println(list.get(1));//获取指定索引的元素
list.remove("2");//移除指定元素
list.remove(0);//移除指定下标的元素
System.out.println(list.contains("2"));//是否包含该元素 返回boolean值
Object[] array = list.toArray();//将ArrayList解析成数组
ArrayList为顺序结构,添加元素时按照顺序进行添加,获取元素时可以通过索引进行获取
,其底层实现使用Object[]进行实现,默认长度为10,当长度大于当前最大容量时,会进
行自动扩容操作,扩容大小为旧长度的3倍;
int newCapacity = oldCapacity + (oldCapacity >> 1);
2.1.2 LinkedList
LinkedList,其存储结构为链式结构,读取数据速度较ArrayList稍慢,但其
进行增删操作快;
LinkedList list=new LinkedList();//实例化LinkedList对象
list.add(1);//添加元素 object类型
list.add(1, 3);//指定位置添加元素 object类型
list.set(0, "2");//修改指定索引元素
System.out.println(list.size());//获取LinkedList的长度
System.out.println(list.get(1));//获取指定索引的元素
list.remove("2");//移除指定元素
list.remove(0);//移除指定下标的元素
System.out.println(list.contains("2"));//是否包含该元素 返回boolean值
2.1.3 Vector
Vector,其存储结构也为顺序结构,与ArrayList类似,但是其为多线程安全
的,ArrayList为多线程不安全的;
Vector v = new Vector<>();//实例化Vector对象
v.add(1);//添加元素 object类型
v.add(1, 3);//指定位置添加元素 object类型
v.set(0, "2");//修改指定索引元素
System.out.println(v.size());//获取Vector的长度
System.out.println(v.get(1));//获取指定索引的元素
v.remove("2");//移除指定元素
v.remove(0);//移除指定下标的元素
System.out.println(v.contains("2"));//是否包含该元素 返回boolean值
System.out.println(v.capacity());//获取容量
2.1.4 Stack
Stack,其继承自Vector,其采用的数据结构为栈,即后进先出
Stack stack=new Stack();//实例化Stack对象
stack.push(1);//压栈
stack.push(2);
stack.push(3);
//3 2 1
int a= (int) stack.pop();//弹栈,返回并移除栈顶元素3
int b= (int) stack.peek();//返回栈顶元素2
while (!stack.empty()){//判断栈是否为空
stack.pop();
}
2.1.5 HashSet
HashSet,无序的Set集合
HashSet set=new HashSet();//实例化HashSet对象
set.add(1);//添加元素
set.add(2);
set.add(3);
System.out.println(set.contains(2));//判断是否包含某元素
set.remove(1);//移除某一元素
//使用迭代器遍历HashSet
Iterator iterator=set.iterator();//获取set的迭代器
while (iterator.hasNext()){//判断是否有下一个元素
System.out.println(iterator.next());//获取下一个元素
}
//其遍历还可以使用foreach进行
HashSet是元素无序,并不可重复的,其底层判断元素是否重复,使用的是equals与Hash
值的方式,即首先进行hash值比较,如果hash值相同,则调用其equals进行比较,二者都
相同,即为同一元素,覆盖原有键的值,其底层实现使用的是hash表的数据结构进行实
现;
2.1.5 TreeSet
TreeSet,有序的Set集合
TreeSet set=new TreeSet();
set.add(1);
set.add(2);
set.add(3);
set.remove(2);
//其遍历可采用与HashSet相同的方式
TreeSet是元素有序,并不可重复的,其底层数据结构为红黑树,其元素必须实现Compa
rable接口
2.2 双列集合
双列集合均为Map的子类,其元素为(键:值)对存储,其中键不可重复,值可以重复,
分为HashMap,TreeMap,HashTable:
2.2.1 HashMap
HashMap,无序的Map集合
HashMap map=new HashMap();//实例化HashMap对象
map.put("name","张三");//放入元素,键:值
map.put("age",18);//
System.out.println(map.get("name"));//获取键对应的值
System.out.println(map.containsKey("name"));//判断是否包含某个键
System.out.println(map.containsValue(18));//判断是否包含某个值
map.remove("age");//根据键移除元素
map.remove("name","张三");//根据键值移除元素
Set set=map.keySet();//获取map的键的集合
HashMap是键无序的,其键判断是否相等与HashSet相等,并且HashSet可看做是只存储
键的一个map集合
2.2.2 TreeMap
TreeMap,键有序的Map集合
TreeMap map = new TreeMap();//实例化TreeMap对象
map.put(1, "1");//添加元素
map.put(3, "3");
map.put(2, "2");
System.out.println(map.get(1));//获取键对应的值
System.out.println(map.containsKey(1));//判断是否包含某个键
System.out.println(map.containsValue("2"));//判断是否包含某个值
map.remove(2);//根据键移除元素
map.remove(1, "1");//根据键值移除元素
Set set = map.keySet();//获取map的键的集合
TreeMap是键无序的,其键要求实现Conparable接口,添加元素时,会根据键的类实现
的Comparable接口进行排序
笔记如有错误,遗漏之处,欢迎指正!