[关闭]
@MRsunhuimin 2019-07-25T11:44:37.000000Z 字数 4142 阅读 210

java (2019.07.24)

java基础

作者:孙慧敏

0. Collection接口

Collection接口: List接口 + Set接口
(Collection 接口存储一组不唯一,无序的对象)

List接口:ArrayList集合类 + LinkedList集合类
(List 接口存储一组不唯一,有序(插入顺序)的对象)

Set接口:HashSet集合类 + TreeSet集合类
(Set 接口存储一组唯一,无序的对象) 

Map接口:HashMap集合类 + TreeMap集合类
(Map接口存储一组键值对象,提供key到value的映射) 
  1. 典型用法如下:
  2. Iterator it = collection.iterator(); //获得一个迭代子
  3. while(it.hasNext()) {
  4. Object obj = it.next(); //得到下一个元素
  5. }

1. List接口

1.1 List接口特点

1.List的长度可变。 

2.List集合像一个数组,是有序的。保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

3.可以插入多个null元素

4.ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高

5.LinkedList采用链表存储方式,插入、删除元素时效率比较高

6.List可以通过index知道元素的位置,它允许元素的重复。ArrayList, LinkedList,  Vector可以实现List接口。

2. Set接口

2.1 Set接口特点

1.无序容器,你无法保证每个元素的存储顺序

2.TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。

3.只允许一个 null 元素

4.Set集合是无序的,元素不允许重复。HashSet, LinkedHashSet,TreeSet 可以实现Set接口。

2.2 如何遍历Set集合?

方法1:通过迭代器Iterator实现遍历 

获取Iterator :Collection 接口的iterator()方法

Iterator的方法:
    boolean hasNext(): 判断是否存在另一个可访问的元素

    Object next(): 返回要访问的下一个元素

方法2:增强型for循环

3. Map接口

3.1 Map接口特点

1. Map不是collection的子接口或者实现类。Map是一个接口。

2. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。

3. Map(interface):使用键值对(key-value),值(value)可以重复,键(key)不可以重复。HashMap, LinkedHashMap, HashTable, TreeMap可以实现Map接口。

4. HashMap对象的key、value值均可为null。

5. (HahTable对象的key、value值均不可为null。且两者的的key值均不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。)

6.HashMap和HashTable的区别和联系
    6.1 HashMap是非线性安全,HashTable是线性安全的

    6.2 HashMap的键和值都允许为null,HashTable则不行

    6.3 因为线程安全问题,HashMap的效率较高

    6.4 HashMap不是同步的,HashTable是同步的。因此,HashMap更适合于单线程环境,HashTable更适合于多线程环境。

    6.5 一般现在不建议用HashTable,一是HashTable是遗留类,内部实现很多没优化和冗余,二是即使在多线程环境下,现在也有ConcurrentHashMap替代。

遍历Map集合方法

方法1:通过迭代器Iterator实现遍历 
方法2:增强型for循环
方法3:键值对

4. 泛型

如何解决以下强制类型转换时容易出现的异常问题

1.List的get(int index)方法获取元素
2.Map的get(Object key)方法获取元素
3.Iterator的next()方法获取元素

通过泛型

JDK5.0使用泛型改写了集合框架中的所有接口和类

将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。

泛型的本质是参数化类型。

泛型集合可以约束集合内的元素类型 

典型泛型集合ArrayList<E>、HashMap<K,V>                             <E>、<K,V>表示该泛型集合中的元素类型

泛型集合中的数据不再转换为Object

除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样

5. Collections算法类

Java集合框架将针对不同数据结构算法的实现都保存在工具类中

Collections类定义了一系列用于操作集合的静态方法

Collections类常用方法

Collections和Collection不同,前者是集合的操作类,后者是集合接口

Collections提供的常用静态方法
    sort():排序
    binarySearch():查找
    max()\min():查找最大\最小值

Collections排序

Collections类可以对集合进行排序、查找和替换操作

实现一个类的对象之间比较大小,该类要实现Comparable接口

重写compareTo()方法

6. 总结

1.Collection 、List 、Set 、Map接口的联系和区别

Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。Map接口并不是Collection接口的子接口,但是它仍然被看作是Collection框架的一部分

list,map,set的区别

list,map,set的区别 (首先假定小猪都是同一个细胞克隆出来的) 
    List = 排成一长队的小猪
    Set = 一群小猪贴上号,然后赶到一个猪圈里
    Map = 放在一个个,有房间号的屋子里面的一群小猪 


Hashset 它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。 
LinkedHashSet定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。

7.例题

    编写java程序,创建学员studen提那家一些学员对象,对象类,并添加姓名,年龄,性别等字段,创建3个arraylist<T>,指定T为student类,每个arraylist<T>中添加一些学员对象,再创建Hashmap<K,V>对象,以年及名称为键,指定为string类型,指定value类型为arraylist<student>,值为存放学员的arraylist<T>对象,然后从Hashmap<K,V>对象中获取某个班级的学院信息并输出。
  1. package com.java_high.utility_class_test;
  2. /*
  3. * Studentl类,
  4. */
  5. public class Student {
  6. private String name;
  7. private String sex;
  8. private int age;
  9. public Student(String name,String sex,int age) {
  10. this.name = name;
  11. this.sex = sex;
  12. this.age = age;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public String getSex() {
  21. return sex;
  22. }
  23. public void setSex(String sex) {
  24. this.sex = sex;
  25. }
  26. public int getAge() {
  27. return age;
  28. }
  29. public void setAge(int age) {
  30. this.age = age;
  31. }
  32. }
  1. package com.java_high.utility_class_test;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.Scanner;
  5. /*
  6. * 主程序
  7. * 暂时只给了一个ArrayList赋值
  8. *
  9. */
  10. public class Demo {
  11. public static void main(String[] args) {
  12. /*
  13. * 创建3个ArrayList集合,指定类型为student类
  14. */
  15. ArrayList<Student> list1 = new ArrayList<Student>();
  16. ArrayList<Student> list2 = new ArrayList<Student>();
  17. ArrayList<Student> list3 = new ArrayList<Student>();
  18. Student st1 = new Student("张三丰", "男",7);
  19. Student st2 = new Student("杨过","男",9);
  20. Student st3 = new Student("郭靖","女",8);
  21. list1.add(st1);
  22. list1.add(st2);
  23. list1.add(st3);
  24. /*
  25. * HashMap集合
  26. */
  27. HashMap<String,ArrayList<Student>> map = new HashMap<String,ArrayList<Student>>();
  28. map.put("三年级一班", list1);
  29. map.put("四年级一班", list2);
  30. map.put("五年级一班", list3);
  31. System.out.println("输入班级名称:");
  32. Scanner sc = new Scanner(System.in);
  33. String grade = sc.next();
  34. /*
  35. * 将输入的字符串和HashMap集合的key值进行比较
  36. * 定义一个ArrayList集合来接收key对应的value值
  37. * 使用增强for循环进行输出
  38. */
  39. if(map.containsKey(grade)) {
  40. System.out.println(grade+"学生列表:");
  41. ArrayList<Student> list = map.get(grade);
  42. for(Student re:list) {
  43. System.out.println(re.getName()+" "+re.getSex()+" "+re.getAge());
  44. }
  45. }
  46. }
  47. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注