文章目录
- 泛型
- List Set Map Array/Hash/Tree Vector Iterator 定义
- List 接口的实现类有ArrayList/LinkedList/Vector
- 9.5.3 Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet。
- Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。
- 容器 相关方法 几乎通用 类比C 不过参数范围扩张到对象(类))
- 9.3.1 List特点和常用方法: List是有序、可重复的容器。
- 9.3.2 ArrayList底层是用数组实现的存储。
- 9.3.3 LinkedList特点和底层实现
- 9.3.4 Vector向量
- 9.4.4 TreeMap的使用
- 9.5.3 TreeSet的使用和底层实现 ->TreeSet中不能放入null元素。
- 使用Iterator迭代器遍历容器元素(List/Set/Map)
- 9.7 遍历集合的方法总结
- 9.8 Collections工具类
- 课后部分 习题
泛型
class MyCollection<E> {// E:表示泛型;
Object[] objs = new Object[5];
public E get(int index) {// E:表示泛型;
return (E) objs[index];
}
public void set(E e, int index) {// E:表示泛型;
objs[index] = e;
}
}
public class TestGenerics {
public static void main(String[] args) {
// 这里的”String”就是实际传入的数据类型;
MyCollection<String> mc = new MyCollection<String>();
mc.set("aaa", 0);
mc.set("bbb", 1);
String str = mc.get(1); //加了泛型,直接返回String类型,不用强制转换;
System.out.println(str);
}
}
List Set Map Array/Hash/Tree Vector Iterator 定义
List<String> list = new ArrayList<String>();
List<String> list = new Vector();
Set<Man> mans = new HashSet<Man>();
Map<Integer, Man> maps = new HashMap<Integer, Man>();
Iterator<Man> iterator = mans.iterator();
List 接口的实现类有ArrayList/LinkedList/Vector
9.5.3 Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet。
Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。
容器 相关方法 几乎通用 类比C 不过参数范围扩张到对象(类))
9.3.1 List特点和常用方法: List是有序、可重复的容器。
9.3.2 ArrayList底层是用数组实现的存储。
特点:查询效率高,增删效率低,线程不安全。我们一般使用它。
9.3.3 LinkedList特点和底层实现
LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
9.3.4 Vector向量
9.4.4 TreeMap的使用
9.5.3 TreeSet的使用和底层实现 ->TreeSet中不能放入null元素。
public class Test {
public static void main(String[] args) {
User u1 = new User(1001, "高淇", 18);
User u2 = new User(2001, "高希希", 5);
Set<User> set = new TreeSet<User>();
set.add(u1);
set.add(u2);
}
}
class User implements Comparable<User> {
int id;
String uname;
int age;
public User(int id, String uname, int age) {
this.id = id;
this.uname = uname;
this.age = age;
}
/**
* 返回0 表示 this == obj 返回正数表示 this > obj 返回负数表示 this < obj
*/
@Override
public int compareTo(User o) {
if (this.id > o.id) {
return 1;
} else if (this.id < o.id) {
return -1;
} else {
return 0;
}
}
}
使用Iterator迭代器遍历容器元素(List/Set/Map)
迭代器遍历List
public class Test {
public static void main(String[] args) {
List<String> aList = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
aList.add("a" + i);
}
System.out.println(aList);
for (Iterator<String> iter = aList.iterator(); iter.hasNext();) {
String temp = iter.next();
System.out.print(temp + "\t");
if (temp.endsWith("3")) {// 删除3结尾的字符串
iter.remove();
}
}
System.out.println();
System.out.println(aList);
}
}
迭代器遍历Set
public class Test {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
for (int i = 0; i < 5; i++) {
set.add("a" + i);
}
System.out.println(set);
for (Iterator<String> iter = set.iterator(); iter.hasNext();) {
String temp = iter.next();
System.out.print(temp + "\t");
}
System.out.println();
System.out.println(set);
}
}
迭代器遍历Map(1)
也可以通过map的keySet()、valueSet()获得key和value的集合,从而遍历它们
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("A", "高淇");
map.put("B", "高小七");
Set<Entry<String, String>> ss = map.entrySet();
for (Iterator<Entry<String, String>> iterator = ss.iterator(); iterator.hasNext();) {
Entry<String, String> e = iterator.next();
System.out.println(e.getKey() + "--" + e.getValue());
}
}
}
迭代器遍历Map(2)
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("A", "高淇");
map.put("B", "高小七");
Set<String> ss = map.keySet();
for (Iterator<String> iterator = ss.iterator(); iterator.hasNext();) {
String key = iterator.next();
System.out.println(key + "--" + map.get(key));
}
}
}
9.7 遍历集合的方法总结
示例9-15】遍历List方法一:普通for循环
for(int i=0;i<list.size();i++){//list为集合的对象名
String temp = (String)list.get(i);
System.out.println(temp);
}
【示例9-16】遍历List方法二:增强for循环(使用泛型!)
for (String temp : list) {
System.out.println(temp);
}
【示例9-17】遍历List方法三:使用Iterator迭代器(1)
for(Iterator iter= list.iterator();iter.hasNext();){
String temp = (String)iter.next();
System.out.println(temp);
}
【示例9-18】遍历List方法四:使用Iterator迭代器(2)
Iterator iter =list.iterator();
while(iter.hasNext()){
Object obj = iter.next();
iter.remove();//如果要遍历时,删除集合中的元素,建议使用这种方式!
System.out.println(obj);
}
【示例9-19】遍历Set方法一:增强for循环
for(String temp:set){
System.out.println(temp);
}
【示例9-20】遍历Set方法二:使用Iterator迭代器
for(Iterator iter = set.iterator();iter.hasNext();){
String temp = (String)iter.next();
System.out.println(temp);
}
【示例9-21】遍历Map方法一:根据key获取value
Map<Integer, Man> maps = new HashMap<Integer, Man>();
Set<Integer> keySet = maps.keySet();
for(Integer id : keySet){
System.out.println(maps.get(id).name);
}
【示例9-22】遍历Map方法二:使用entrySet
Set<Entry<Integer, Man>> ss = maps.entrySet();
for (Iterator iterator = ss.iterator(); iterator.hasNext();) {
Entry e = (Entry) iterator.next();
System.out.println(e.getKey()+"--"+e.getValue());
9.8 Collections工具类
类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
1. void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。
2. void shuffle(List) //对List容器内的元素进行随机排列。
3. void reverse(List) //对List容器内的元素进行逆续排列 。
4. void fill(List, Object) //用一个特定的对象重写整个List容器。
5. int binarySearch(List, Object)//对于顺序的List容器,采用折半查找的方法查找特定对象。
public class Test {
public static void main(String[] args) {
List<String> aList = new ArrayList<String>();
for (int i = 0; i < 5; i++){
aList.add("a" + i);
}
System.out.println(aList);
Collections.shuffle(aList); // 随机排列
System.out.println(aList);
Collections.reverse(aList); // 逆续
System.out.println(aList);
Collections.sort(aList); // 排序
System.out.println(aList);
System.out.println(Collections.binarySearch(aList, "a2"));
Collections.fill(aList, "hello");
System.out.println(aList);
}
}
课后部分 习题
1. 以下选项中关于Java集合的说法错误的是( )。(选择二项)
A.List接口和Set接口是Collections接口有两个子接口//list ->Link/Array/Vector
B.List接口中存放的元素具有有序,不唯一的特点
C.Set接口中存放的元素具有无序,不唯一的特点//唯一
D.Map接口存放的是映射信息,每个元素都是一个键值对
2. 如下Java代码,输出的运行结果是( )。(选择一项)
public class Test {
public static void main(String[ ] args) {
List<String> list=new ArrayList<String>();
list.add("str1");
list.add(2, "str2");
String s=list.get(1);
System.out.println(s);
}
}
A.运行时出现异常//0,1,2 (1位置没有放值)
B.正确运行,输出str1
C.正确运行,输出str2
D.编译时出现异常
5. 给定如下Java代码,编译运行的结果是( )。(选择一项)
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
String s = “code”;
map.put(s, “1”);
map.put(s, “2”);
System.out.println(map.size());
}
}
A.编译时发生错误
B.运行时引发异常
C.正确运行,输出:1// 键相同会覆盖实际上 s映射值为 2
D.正确运行,输出:2