文章目录
第一章 集合框架和泛型
1、集合框架
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中
- Collection 接口存储一组不唯一,无序的对象 ( Collection下包含List接口、Set接口)
- List 接口存储一组不唯一,有序(插入顺序)的对象
- Set 接口存储一组唯一,无序的对象
- Map 接口存储一组键值对象,提供key到value的映射
1.List接口的实现类
List接口下包含ArrayList类、LinkedList类
- ArrayList 实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
- LinkedList 采用链表存储方式,插入、删除元素时效率比较高
ArrayList集合类:
- 确定存储方式:
- ArrayList类是List接口的一个具体实现类
- ArrayList对象实现了可变大小的数组
- 随机访问和遍历元素时,它提供更好的性能
- 确定存储对象:
- 创建类型
- 包含属性
- 具体实现
ArrayList常用方法:
方法名 | 说明 |
---|---|
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
System.out.println("********add(int index,Object o)指定的索引位置添加元素*************");
arrayList.add(0,"a");
arrayList.add(1,"b");
System.out.println(arrayList);
System.out.println("********add(Object o)列表的末尾顺序添加元素,起始索引位置从0开始*************");
arrayList.add("c");
System.out.println(arrayList);
System.out.println("********size()返回列表中的元素个数*************");
int num = arrayList.size();
System.out.println("列表中元素个数为:"+num);
System.out.println("********get(int index)返回指定索引位置处的元素*************");
String str = arrayList.get(1).toString();
System.out.println(str);
System.out.println("********contains(Object o)判断列表中是否存在指定元素*************");
boolean bool = arrayList.contains("c");
System.out.println(bool);
System.out.println("********remove(Object o)从列表中删除元素*************");
arrayList.remove("c");
System.out.println(arrayList);
System.out.println("********remove(int index)从列表中删除指定位置元素*************");
arrayList.remove(0);
System.out.println(arrayList);
System.out.println("********clean()清空集合*************");
arrayList.clear();
System.out.println("清空后集合长度为:"+arrayList.size());
System.out.println("********isEmpty()判断集合是否为空*************");
System.out.println("集合是否为空:"+arrayList.isEmpty());
}
运行结果:
********add(int index,Object o)指定的索引位置添加元素*************
[a, b]
********add(Object o)列表的末尾顺序添加元素,起始索引位置从0开始*************
[a, b, c]
********size()返回列表中的元素个数*************
列表中元素个数为:3
********get(int index)返回指定索引位置处的元素*************
b
********contains(Object o)判断列表中是否存在指定元素*************
true
********remove(Object o)从列表中删除元素*************
[a, b]
********remove(int index)从列表中删除指定位置元素*************
[b]
********clean()清空集合*************
清空后集合长度为:0
********isEmpty()判断集合是否为空*************
集合是否为空:true
LinkedList集合类:
- 确定存储方式
- LinkedList类是List接口的一个具体实现类
- LinkedList 类用于创建链表数据结构
- 插入或者删除元素时,它提供更好的性能
- 具体实现
LinkedList常用方法:
方法名 | 说明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("a");
linkedList.add("b");
linkedList.add("c");
System.out.println(linkedList);
System.out.println("********addFirst(Object o)在列表的首部添加元素*********");
linkedList.addFirst("x");
System.out.println(linkedList);
System.out.println("********addLast(Object o)在列表的末尾添加元素*********");
linkedList.addLast("e");
System.out.println(linkedList);
System.out.println("********getFirst()返回列表中的第一个元素*********");
System.out.println("列表中第一个元素为:"+linkedList.getFirst());
System.out.println("********getLast()返回列表中的最后一个元素*********");
System.out.println("列表中第一个元素为:"+linkedList.getLast());
System.out.println("********removeFirst()删除并返回列表中的第一个元素*********");
System.out.println("删除的元素是:"+linkedList.removeFirst());
System.out.println("删除后列表元素为:"+linkedList);
System.out.println("********removeLast()删除并返回列表中的最后一个元素*********");
System.out.println("删除的元素是:"+linkedList.removeLast());
System.out.println("删除后列表元素为:"+linkedList);
}
运行结果:
[a, b, c]
********addFirst(Object o)在列表的首部添加元素*********
[x, a, b, c]
********addLast(Object o)在列表的末尾添加元素*********
[x, a, b, c, e]
********getFirst()返回列表中的第一个元素*********
列表中第一个元素为:x
********getLast()返回列表中的最后一个元素*********
列表中第一个元素为:e
********removeFirst()删除并返回列表中的第一个元素*********
删除的元素是:x
删除后列表元素为:[a, b, c, e]
********removeLast()删除并返回列表中的最后一个元素*********
删除的元素是:e
删除后列表元素为:[a, b, c]
**ArrayList:**内部使用数组实现,遍历查询效率高
**LinkedList:**内部使用双向链表实现,增删改效率高
2.Set接口
- Set接口存储一组唯一,无序的对象
- HashSet是Set接口常用的实现类
- Set中存放对象的引用
- Set接口不存在下标和get()方法
Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String("JAVA");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());
Set接口如何判断加入对象是否已经存在:
采用对象的equals()方法比较两个对象是否相等
boolean bool = s1.equals(s2);
System.out.println(bool);
运行结果:
2
true
迭代器:
Collection 接口的iterator()方法创建 Iterator 对象
如何遍历Set集合:
-
通过迭代器Iterator实现遍历
- 获取Iterator :Collection 接口的iterator()通过迭代器Iterator实现遍历方法
//使用迭代器 Iterator it = set.iterator(); //循环迭代器 while (it.hasNext()) { String next = it.next(); System.out.println(next);//获取元素 }
-
Iterator对象方法:
boolean hasNext(): 判断是否存在另一个可访问的元素
Object next(): 返回要访问的下一个元素
-
增强型for循环
for(Object object:set){
System.out.println(object);
}
- 使用collection中的toArray()方法遍历
Object[] arr = set.toArray();
for (int i = 0; i < arr.length; i++) {
String s = (String) arr[i];
System.out.println(s);
}
- 使用collection中的toArray( T[ ] t)方法遍历
Object[] arr1 = new String[set.size()];
arr1 = set.toArray(arr1);
for (int i = 0; i < arr1.length; i++) {
System.out.println("----" + arr1[i]);
}
3.Map接口
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作,最常用的实现类是HashMap
Map接口常用方法:
方法名 | 说明 |
---|---|
Object put(Object key, Object val) | 以“键-值”对的方式进行存储 |
Object get(Object key) | 根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove(Object key) | 删除由指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet() | 返回键的集合 |
Collection values() | 返回值的集合 |
boolean containsKey(Object key) | 如果存在由指定的键映射的“键-值对”,返回true |
public static void main(String[] args) {
Map map = new Map();
System.out.println("******put(Object key, Object val)以“键-值”对的方式进行存储**********");
map.put("姓名","张三");
map.put("年龄",18);
System.out.println(map);
System.out.println("******get(Object key)根据键返回相关联的值**********");
System.out.println(map.get("姓名"));
System.out.println(map.get("年龄"));
System.out.println("******remove(Object key)删除由指定的键映射的“键-值对”**********");
map.remove("年龄");
System.out.println("删除后:"+map);
System.out.println("******size()返回元素个数**********");
System.out.println("map内的元素个数:"+map.size());
System.out.println("添加一组元素...");
map.put("性别","男");
System.out.println(map);
System.out.println("map内的元素个数:"+map.size());
System.out.println("******keySet()返回键的集合**********");
System.out.println(map.keySet());
System.out.println("******values()返回值的集合**********");
System.out.println(map.values());
System.out.println("******containsKey(Object key)是否存在由指定的键映射的“键-值对”**********");
System.out.println(map.containsKey("姓名"));
}
运行结果:
******put(Object key, Object val)以“键-值”对的方式进行存储**********
{姓名=张三, 年龄=18}
******get(Object key)根据键返回相关联的值**********
张三
18
******remove(Object key)删除由指定的键映射的“键-值对”**********
删除后:{姓名=张三}
******size()返回元素个数**********
map内的元素个数:1
添加一组元素...
{姓名=张三, 性别=男}
map内的元素个数:2
******keySet()返回键的集合**********
[姓名, 性别]
******values()返回值的集合**********
[张三, 男]
******containsKey(Object key)是否存在由指定的键映射的“键-值对”**********
true
遍历Map集合:
- 通过迭代器Iterator实现遍历
//通过迭代器Iterator实现遍历
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Maps.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Maps.Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
}
- 增强型for循环
//增强型for循环
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
- 键值对
//键值对
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
注意:
不能直接拿map的key值作为迭代器进行遍历
每一个键值对也就是一个Entry
Map.Entry() 返回的是当前Map的item,但是这个方法只在遍历的时候有用
map.entrySet()方法,返回的是当前Map的 item Set集合
Map.Entry中提供了getKey()和getValue()方法,这两个方法的作用很明显一个获得key一个获得value
2、泛型集合
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性、本质是参数化类型。
泛型集合可以约束集合内的元素类型
典型泛型集合 ArrayList<E>、HashMap<K,V>
-
<E>、<K,V>
表示该泛型集合中的元素类型 -
泛型集合中的数据不再转换为Object
把数据类型作为参数进行传递
传递的数据类型必须是引用数据类型
3、Collections算法类
Collections类定义了一系列用于操作集合的静态方法
1.Collections类常用方法
-
Collections和Collection不同,前者是集合的操作类,后者是集合接口
-
Collections提供的常用静态方法:
sort():排序
max()\min():查找最大\最小值
2.Collections排序
- Collections类可以对集合进行排序、查找和替换操作
- 实现一个类的对象之间比较大小,该类要实现Comparable接口:重写compareTo()方法