您的位置:首页 > 大数据

大数据预科班15

2017-09-22 22:54 246 查看

大数据预科班15

复习

集合Collection 顶级接口
List--有序;可重复 ArrayList,LinkedList,Vector(线程安全)--stack;
Set--无序;不可重复 HashSet
Collection--操作集合的工具类
Comparator--比较器---{类--Comparable}

Iterator迭代器

用于迭代遍历,挪动指针和标记操作
hasNext()
next()
remove( )//移除正在迭代的元素--作用于原集合
迭代过程中不允许增删元素(list.add(s);list.remove(s);)

Iterator<String> it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

底层

1. 把原集合复制一份
2. 操作并标记
3. 原集合与备份的通过标记做对比,

使用增强for循环,类必须实现Iterable接口

Iterator在迭代中不可增删原集合

增强for循环--jdk1.5特性之一

泛型

参数化类型
顶级接口ParameterizedType--jdk1.5的特性之一
发展历史

1. 早期
元素类型同一位Object
List list = new ArrayList();
list.add(true);
list.add("as");
list.add(12);
Iterator it=list.iterator();

//遍历
while(it.hasNext()){
Object o=it.next();
//instanceOf 判断--强转
}
2. 中期
List list = new ArrayList<T>();
只是建议,没有实质性作用
3. 后期
List list<T> = new ArrayList();
4. 现在--只存储一种类型
List list<T> = new ArrayList();

泛型的擦除

确定为具体的类型--编译期确定
有泛型--编译效率略低--推导【type inference】重新确定为新的类型
前编译中确定==后运行时确定<>diamond自动类型推导

自定义泛型类

泛型定义--符合标识符命名
习惯上--大写字母表示泛型
T type类型
E element元素
K key键
V value值
R result结果

//泛型类
class demo<T>{
//定义变量
private T t=null;

//方法
public void set(T t){
this.t=t;
}
public T get(){
return this.t;
}
}

定义多个泛型时,用逗号隔开<T,E,R>
为方法定义泛型(独属)-----【中转站:参数不确定时

//参数和返回值都可以不确定--工厂模式
修饰符 <E> 返回值 方法名(参数列表){

}

泛型不兼容--向上造型不适用这里

1. List<Number> list = new ArrayList<Integer>();//编译报错
2. 解决:继承--extends泛型的上限(传入类型的最高边界)
? extends 类//?表示的是类或者子类【注:接口也用extends】
List<? extends Number> list = new ArrayList<Integer>();
可以添加null,但是不能添加除null之外的其他元素;
3. 泛型?写在定义的方法中
4. 泛型的下限:(传入的类型的最小边界)
? super 类或接口
能添加除null之外的其他子类元素;
5. 同一个泛型不能同时规定上下限--解决:方法调用(上限方法调用下限方法或相反着调用)
6. ?表示泛型的通配符

使用泛型但,但此时不确定类型,编译时不允许添加,运行时可以添加

List<?> list = new List<String>();

泛型接口同理

jdk1.5的10个特性

Map

映射:需要两个元素--成对出现(key-value)
无序
键重复,覆盖值
需要两个泛型:Map<K,V>
键唯一,值不唯一
映射的顶级接口
不是集合,但它是集合框架【Java Collections FrameWork:集合、映射、操作的工具】的一员
Entry---代表键值对的接口---内部接口(隶属于Map接口)
一个Map有多个entry组成

方法
添加put(key,value)
toString方法被重写了
删除元素--根据key删除键值对remove(key)
获取value--get(key);键不存在,返回null
clean()清空map
containsKey(key)是否包含key
containsValue(value)是否包含value
equals
isEmpty判断映射是否为空
remove(key)移除该键的键值对
size()获取键值对的个数
values获取所有值,并放入Collecton集合中(value打印可重复)

遍历Map

1. 第一种方式:先获取键,在遍历键获取值
Set<String> keys = map.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
System.out.println(map.get(it.next()).toString());
}
2. 第二种方式:获取键值对,再获取key和value
for (Map.Entry<String, Integer> e : map.entrySet()) {
System.out.println(e.getKey()
e6ce
+ ":" + e.getValue());
}

HashMap

允许键为null
允许值为null
HashSet基于HashMap
初始容量16,加载因子0.75f,每次扩容yibei
异步式线程不安全【同一个时间:多个--异步;一个--同步】

HashTable

元素非null-----键值都不允许为null;--NullPointException
初始容量11,加载因子0.75f,扩容11,23,47
同步式线程安全的映射
效率最低的映射
java最早的映射

Dictionary低级映射父类--唯一子类:HashTable

ConcurrentHashMap

异步式线程安全的映射

练习

输入键值对(空格隔开),键正序,键相同时值相加

package com.peng.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class TestListSet {
public static void main(String args[]) {
List<Integer> list = new ArrayList<Integer>();
Scanner s = new Scanner(System.in);
System.out.println("请输入键值对的个数");
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// nextInt默认的后面加空格
int num = Integer.parseInt(s.nextLine());
String str = "";
for (int i = 0; i < num; i++) {
System.out.println("请输入第" + (i + 1) + "键值对");
str = s.nextLine();
String[] temp_arr = str.split(" ");
int arr1 = Integer.parseInt(temp_arr[0]);
int arr2 = Integer.parseInt(temp_arr[1]);
// 判断是否包含此键
if (map.containsKey(arr1)) {
map.put(arr1, map.get(arr1) + arr2);
} else {
map.put(arr1, arr2);
list.add(arr1);
}
}
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i) + "=" + map.get(list.get(i)));
}
System.out.println(map);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: