第九章 容器

泛型

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

发布了55 篇原创文章 · 获赞 1 · 访问量 958

猜你喜欢

转载自blog.csdn.net/weixin_43556527/article/details/103543438