集合框架(JCF Java Collection Framework)
集合--把批量的数据集中并合并在一起,进行统一性的操作
数组--集合中的一种,最简单原始的一种
数组的特点:
1.数组的元素只能存放统一性数据类型 <多态解决了>
2.数组的长度一旦确定不能更改 <封装解决了>
3.数组的元素存储在连续的空间中 <待解决>
集合框架包含三个部分:接口、实现类、算法
集合框架的接口:
两种
1----collection (接口)有 List、Set、Queue接口(队列)
List有序集合(也称为序列)。 是线性,元素可重复
Set的元素不可重复
2-----跟Map(接口)
Map对应键值对,一个元素包含两个对象,键对象不可重复
List(接口)
list也叫(线性接口),线性有序结合,集合中的元素按照放置的顺序进行计算
list实现类:Arraylist,底层依旧采用数组实现
如aad(Object o)/remove /重载方法 /get(index) /size()
含义 | 作用 |
---|---|
remove(index) | 移除元素 |
remove(Object o ) | 删除掉第一次出现该元素 |
size | 查询长度,用循环遍历该元素 |
iterrator | 迭代器遍历(hasNet()判断迭代器中是否有元素,在迭代的时候用Net()抓捕元素) |
add(Object o) | 添加 |
contain(Object o) | 查询是否有某个元素,返回布尔值 |
set(index,element) | 将某个下标的位置的元素修改 |
add(index,element | 插入某个下标的位置 |
indxeOf()/lastLndxe() | 得到第一个/最后一个索引 |
subList(fromIndex,toIdxe) | 截取索引的元素生产新的list |
isEmpty | 判断list是否为空,返回布尔值 |
toString | 转化为字符串 |
List list = new ArrayList(); list.add(111); //添加 list.add("你好"); list.add(true); System.out.println(list.get(2)); list.remove(2); //移除 System.out.println(list.size());//查询长度 Iterator iterator = list.iterator(); while (iterator.hasNext()){ //遍历每一个元素 Object o = iterator.next(); //遍历的同时赋值给o System.out.println(o); }
泛型
由于list集合中保存的是Object的类型,当我们使用的时候,容易造成类型转换出错,然后泛型就出现了
泛型;指定放某一个类型的元素,避免出现类型转换异常。
List<元素类型> 变量名 = new ArrayList<元素类型>; //只能添加元素类这一种元素,否则编译不通过。
eg: List<String> list = new ArrayList<String> ()// 只能放Sting类型的数据
List<String> list1 = new ArrayList<String>(); list1.add("11"); list1.add(123);//会报错
Comparator方法
List<Employee> list = new ArrayList<>(); list.add(new Employee("张三", 1000, 20)); list.add(new Employee("李四", 10000, 21)); list.add(new Employee("王五", 2000, 30)); list.add(new Employee("赵六", 4000, 25)); list.add(new Employee("我", 100000, 23)); for (Employee e: list){ System.out.println(e); } list.sort(new Comparator<Employee>() { @Override public int compare(Employee o1, Employee o2) { return (int) (o1.getMoney()-o2.getMoney()); } }); System.out.println(); for (Employee e: list){ System.out.println(e); }
Set(接口)
元素不重复
set接口现实类,利用元素的hashCode和equals方法,判断集合中的元素是否重复,如果希望按照元素的属性值去除重复数据,需要重写hashCode和equals方法
方法 | 解释 |
---|---|
add(Object) | 向集合添加元素 |
remove(Object) | 将元素从集合移除 |
size | 集合的长度 |
isEmpty() | 判断是否为空 |
普通for循环不能来遍历SetHash的遍历
Set接口的元素排列方式是无序、不可重复的。
第一种排序方式
使用去重时,要重写hashCode和equals方法,可以快速生成。
第二种排序方法:
需要在类里面使用Comarable接口,然后重写他的方法,修改返回值,大于0 则是从大到小,小于0则是从小到大,0则是去重
Set<Employee> set = new TreeSet<>(); set.add(new Employee("大龙",2600,20)); set.add(new Employee("小龙",2000,28)); set.add(new Employee("张三",2400,21)); set.add(new Employee("李四",2000,20)); set.add(new Employee("李四",2200,23)); set.add(new Employee("大尼",2000,27)); set.add(new Employee("小尼",2100,20)); for (Employee o : set){ System.out.println(o);
第三种方式:
在里面new一个Comparator方法,然后改一下返回值即可,需要在类里面使用Comarable接口,然后重写他的方法,修改返回值,大于0 则是从大到小,小于0则是从小到大,0则是去重
总结:HashSet:按照元素的Hash码排序,速度块
TreeSet:按指定的排序规则对元素进行排序,速度慢。需要由Comparator比较器指定排序规则。当Comparator比较器的compare方法,返回0时,表示元素重复。
Map(映射) key- Value,键值对形式
Map(接口)不是Collection的子接口,Map接口实现类中,一个元素包含两个对象:键对象跟值对象
演示代码:Map<String, Integer>map; String为键对象,Integer为值对象。
put(key,value) | 解释 |
---|---|
get(Objet o) | 输出值对象 |
containsKey(Objet o) | 查看元素存不存在,是空则返回false,否则true |
remove(Objet o) | 移除某个元素 |
keySet() | 得到键对象集合,返回set集合 Set<String> keySet = map.keySet(); |
values() | 得到值对象集合,返回Collection集合 Collection<Employee> employees = map.values(); |
clear() | 清除所有的键值对 |
Map<String, Employee> map = new HashMap<>(); //put(k,v) 当k不同时是添加,相同是是覆盖/修改 map.put("学生", new Employee("张三", 200, 20)); map.put("学生", new Employee("张三", 2000, 20)); map.put("学生1", new Employee("张三", 2000, 20)); map.put("学生2", new Employee("张三", 2100, 20)); map.put("学生3", new Employee("张三", 2000, 20)); System.out.println(map.get("学生")); // 输出该键对象的值对象 System.out.println(map.containsKey("学生"));//查看是不是为空,是空则返回false,否则true map.remove("学生"); //remove(k) 移除元素 System.out.println(map.containsKey("学生"));
遍历map有两种:
1.用keySet()方法可以得到键对象集合
2.用values()方法可以得到Collection集合
Set<String> keySet = map.keySet(); //得到键对象集合,返回set集合 Collection<Employee> employees = map.values(); //得到值对象集合,返回Collection集合 // map集合的遍历 // 通过键对象进行遍历 for (String v : keySet){ System.out.println(v+"+"+map.get(v)); //可以输出全部键和值对象 } // map集合的遍历 // 通过值对象进行遍历 System.out.println("-----------------------------------"); for (Employee v : employees){ System.out.println(v); //只能输出值对象 }
工具类
1.Arrays工具
可以直接添加到list里面去,不用add一个个加,节省时间。
List<String> list = Arrays.asList("你好", "我好", "他好"); //直接添加到list里面去,不用add一个个加 List<com.Project.HomeWork.Employee> list1 = Arrays.asList( new Employee("小杜", 25, 300), new Employee("小明", 3000, 24), new Employee("小圈", 300, 24), new Employee("小伟", 1000, 24));
2.Collection工具
1----- reverse(List)集合元素倒序排列,没有返回值,直接用Collections.reverse(list); 只能在List集合用
2----- shufflle(List):随机排列元素
llections.shuffle(list);只能在List集合用,没有返回值,直接用