JAVA容器
容器的概念:容器指的是用于存放多个对象的类,这些类能够对对象进行存储、检索、管理等操作。
可以把容器类比于背包,对象类比于书,书包是用来装书的,用书包携带书也更加的方便。
容器的接口是Collection,实现类为Collections。
List 列表
1.ArrayList,LinkedList与数组的区别:
List包含 ArrayList 和 LinkedList,Java中数组是不可变长的,而ArrayList可以被认为是可变长的数组。ArrayList是线性结构,优点是随机存取,存储密度大;LinkedList是链式结构,优点是插入删除更加方便。一般在Java业务开发中,查询操作使用的更多,ArrayList的使用更加广泛。
由于ArrayList和LinkedList都基于List接口实现,所以它们的方法是一致的。
2.List的常用方法
//创建一个列表
List list = new ArrayList();
//列表中增加元素
list.add(x);
//列表中删除元素
list.remove(x);
//获得list的长度
list.size();
//获取第i个位置上的元素,得到的元素类型是Object,需进行向下转型,强转
//以list中元素类型为String举例,自定义类型同样可以使用
String ss = (String) list.get(i);
//判断x是否在列表中
if(list.contains(x))
sout(1);
else
sout(0);
//对列表进行排序
list.sort();
3.遍历列表
(1)索引方法
for(i=0;i<list.size();i++)
sout(list.get(i));
(2) iterator方法
Iterator it = list.Iterator();
while(it.hasNext())
{
sout(it.next());
}
(3)增强for
for(String s:list)
sout(s);
4.列表的泛型
泛型:使用泛型,你可以创建可重用的组件,这些组件能够处理多种数据类型,同时还能保证类型安全。泛型用<>表示,中间可以放各种的类
List<String> lst = new ArrayList<String>(); //其中第二个尖括号中的String可以省略
//在使用泛型的时候,强制转换即可取消,通过get方法直接拿到String类或自定义类
String ss = lst.get(i);
//假设定义了Singer类
public class Singer{
}
List<Singer> lst = new ArrayList<Singer>(); //其中第二个尖括号中的Singer可以省略
//在使用泛型的时候,强制转换即可取消,通过get方法直接拿到自定义类
Singer ss = lst.get(i);
Set 集合
1.HashSet,TreeSet的区别
集合的特点是集合中的元素均不重复。
-
HashSet
:平均情况下,插入和删除操作的时间复杂度为 O(1),但在哈希冲突严重时,性能会有所下降。HashSet得到的集合是无序的。 -
TreeSet
:插入和删除操作的时间复杂度为 O(logn),因为需要维护红黑树的平衡。TreeSet得到的集合是升序的。
2.Set中常用方法
//创建一个集合
Set set = new HashSet();
//集合中添加元素
set.add(x);
//集合中删除元素
set.remove(x);
//集合的长度
set.size();
//集合中包含某元素
set.contains(x);
3.集合的遍历
(1) 迭代器
Set set = new HashSet();
set.add(1);
set.add(2);
set.add(3);
Iterator it = set.Iterator();
while(it.hasNext())
{
Integer i = (Integer)it.next(); //注意集合中的元素都是对象,而不是基本数据类型
sout(i);
}
(2) 增强for
for(Integer x:set)
sout(x);
4.集合的泛型
集合同样可以使用泛型,来规定集合中元素的类型是什么。
Set<String> set = new HashSet<String>();
//假设添加了多个字符串元素
Iterator it = set.Iterator();
while(it.hasNext())
{
String ss = it.next(); //无需强转换,向下转型
sout(ss);
}
Map 映射
1.HashMap和TreeMap
映射中存储的是键值对 key==value,或者说是key:value,类似于python中的字典类型数据。这种键值对类型可以很方便的让我们通过key来找到对应的value,比如家中电话本就常用这种格式,通过姓名,找到对应的电话号码。
-
HashSet
:平均情况下,插入和删除操作的时间复杂度为 O(1),但在哈希冲突严重时,性能会有所下降。HashSet得到的集合是无序的。 -
TreeSet
:插入和删除操作的时间复杂度为 O(logn),因为需要维护红黑树的平衡。TreeSet得到的集合是按key升序排列的。
2.Map中的常用方法
//创建一个Map
Map map = new HashMap();
//向map中添加元素
map.put(key,value); //注意有两个参数,第一个参数是键,第二个参数是值,它们是一一对应的
//map删除某个键值对
map.remove(key);
map.remove(key,value);
//map的长度
map.size();
//通过key,获得对应的value
map.get(key);
//获得由map中的key组成的集合
map.keySet();
3.Map的遍历方法
(1)通过迭代器和集合来遍历
Map map = new HashMap();
map.put("小王","10086");
map.put("小红","12345");
map.put("小绿","114514");
Set set = map.keySet();//通过键集合辅助遍历map
Iterator it = set.Iterator();
while(it.hasNext())
{
String key = (String)it.next();
sout(key + ":" + map.get(key)); //打印键值对
}
(2) 通过迭代器和Entry来遍历
Entry是实体,即Map中真正存储的对象,它就是由key和value组成的键值对。Map.Entry是Map接口中的内部类
Map map = new HashMap();
map.put("小王","10086");
map.put("小红","12345");
map.put("小绿","114514");
Set set = map.entrySet();
Iterator it = set.Iterator();
while(it.hasNext())
{
Map.Entry entry = (Map.Entry) it.next();
sout(entry.getKey());
sout(entry.getValue());
}
4.映射的泛型
映射同样可以使用泛型,来规定键值对分别是什么类型
Map<String,Integer> map = new HashMap<String,Integer>();
//假设添加了多个字符串元素
map.put("小红",10);
map.put("小白",23);
map.put("小绿",14);
//当键值对不满足对应数据类型时会报错
map.put("小龙","12"); // 此句话会报错
Set set = map.keySet();//通过键集合辅助遍历map
Iterator it = set.Iterator();
while(it.hasNext())
{
String key = it.next(); //无需强转
sout(key + ":" + map.get(key)); //打印键值对
}
Stack 栈 和 Queue 队列
栈和队列都可以看成是受限的列表结构,栈满足后入先出的特性,而队列则满足先入先出的特性
Stack 常用方法
//创建一个字符串栈
Stack<String> stack = new Stack<String>();
//压栈
stack.push(x);
//出栈
x = stack.pop();
//查看栈顶元素
String x = stack.peek(); //栈顶元素不会出栈
//判断栈是否为空
stack.isEmpty()
Queue常用方法
Queue包含 LinkedList,ArrayDeque和 PriorityQueue三种
//创建一个字符串队列
Queue<String> q = new Linkedlist<String>();
//入队
q.offer(x);
//出队
q.poll(x);
//获取队头元素
String x = q.peek();
//判断队列是否为空
q.isEmpty()
Collections类的方法
-
Collections.max(list)
获得列表的最大值 -
Collections.min(list)
获得列表的最大值 -
Collections.sort(list)
对列表进行排序 -
Collections.shuffle
打乱列表