集合3

泛型在类、方法、接口中的使用
1.泛型在类中的使用
为什么要在类上使用泛型?
(1).为了让当前的Tool1类可以通过给更多类型的对象传值
(2).不需要再进行类型转换,就可以避免错误发生
//使用泛型前
class Tool{
private Object obj;

public Object getObj() {
    return obj;
}

public void setObj(Object obj) {
    this.obj = obj;
}   

}

//使用泛型后
/*

  • E:代表任意一种引用数据类型,<>中不一定是E,可以使用任意字符

  • 相当于在给类使用泛型

  • 使用:在类上确定的泛型可以直接在内部成员上使用
    */
    class Tool1<E>{
    private E obj;

    public E getObj() {
    return obj;
    }

    public void setObj(E obj) {
    this.obj = obj;
    }

}

2.泛型在方法中的使用
class Test<E e>{
//1.方法上的泛型与类上的泛型保持一致,一旦类上的泛型确定了,方法上的就确定了
public E show(E e){
return e;
}
//2.方法上使用自己的泛型
注意:泛型在使用之前一定要进行声明
声明的方法:在方法的最前面使用<泛型类型>
作用:让方法的内部与方法的泛型保持一致
public <F> void play(F f){
ArrayList<F> list = new ArrayList<>();
}

//3.静态方法使用泛型
//类上的泛型无法在静态方法上使用,静态方法必须自己定义
public static <W> void song(W w){

}
}
总结:泛型在方法中的使用,只有与类保持一致的类型是,不需要重新声明,方法中使用自己的泛型以及静态方法都需要重新声明泛型类型

3.泛型在接口中使用
interface Inter<E>{
public void shoe(E e);
}

//相应的子类使用泛型的方式
//1.接口有泛型,子类没有遵守对应的泛型
两种情况:
a.对于重写的接口方法:泛型的和接口的保持一致,即方法的泛型也要给一个具体的类型
b.对于自己特有的方法,可以与接口一致,也可以自己定义泛型
class Pig implements Inter<String>{
第一种情况:
public void show(String e){
}
第二种情况:
public <F>void play(F f){
}
}

2.接口有泛型,子类遵守对应的泛型
类上的泛型确定了,接口上的就确定了,重写方法上也确定了
class Dog<E> implements Inter<E>{
public void show(E e){
}
}
总结:接口上的泛型,在子类实现的时候,如果接口后面接着一个具体的类型(比方说:String),就不需要在类后面声明了,如果接口后面是E、F、W等抽象的类型,即使类型和接口中的一模一样,也要声明,就需要在类后面声明:<E>、<F>、<W>

限制上限:<? extends E>:限制的是整个<>可以取的泛型的类型上限是E,<>中可以取的泛型是E类以及E的子类
限制下限:<? super E>:限制的是整个<>可以取的泛型的类型下限是E,<>中可以取的泛型是E 类及E的父类

collection:直接存储的元素(值)

Map:本身是一个接口,存储的是键值对,Map中一个元素是一个键值对(key:键,value:值),key必须保证唯一,value可以相同
分类:HashMap:底层是哈希表,线程不安全的
TreeMap:底层是二叉树,线程不安全的

//创建一个 Map<键的类型,值的类型>
Map<String,String> map = new Map<>();
//1.增加: V put(K key, V value) 一次增加一份键值对
map.put("01","java");
map.put("02","php");
//因为key是唯一的,如果给同一个key重复赋值,后面的值会将前面的覆盖掉,并将覆盖的值返回,如果第一次使用key,返回null
String value3 = map.put("01","ios");//value是java
//void putAll(map<? extends K,? extends V> map)
Map<String,String> map1=new HashMap>?();
map1.put("03","html");
map1.put("04","python");
map.putAll(map1);

2.删除
//V remove (Object key) 根据key删除元素,并将删除的元素返回
map.remove("01")//删除只需要删除key就可以删除整个键值对
//void clear() 删除全部!=null,而是一个空的集合

3.获取
//V get(Object key) 根据key获取一个值
map.get("02")
//int size() 返回键值对的个数
map.size();
//遍历1:Set<K> KeySet
//遍历2:Set<map.entry<K,V>> entrySet()

4.一些常用的判断
//boolean isEmpty() 判断是否为空
//boolean containsKey(Object key) 判断是否包含当前的Key
//boolean containsValue(Object value) 判断是否半寒当前的value

//遍历1:Set<key> KeySet()
//原理:得到所有的key存放在set中,利用set的迭代器遍历得到key

//遍历2:Set<Map.entry<K,V>> entrySet()
//原理:得到的是每个键值对对应的映射关系类型的对那个(实体/entry对象),存在set中,利用set的迭代器遍历得到entry,在利用entry获取具体的value

public static void main(String[] args){
Map<String,String> map = new Map<>();
map.put("01","java");
map.put("02","php");
map.put("03","html");
map.put("04","python");
map.put("00","ok");
}
//1.使用Set<K> keyset()//这里是Map的引用来调用keyset
Set<String> set1 = map.keyset();
//获取迭代器
Iterator<String> iterator = set1.iterator;
while(iterator.hasnext()){
String string = iterator.next();
System.out.println("key:"+String+" value:"+map.get(string));
}

//使用Set<Map.Entry<K,V>> entrySet()//Entry是Map中一个静态接口
Set<Map.Entry<String,String>> set2 = map.entrySet();
//获取迭代器
Iteraror<Map.Entry<String,String>> iterator = set2.iterator();
while(iterator.hasnet()){
Map.Entry<String,String> entry = iterator.next();
System.out.println("key:"+entry.getkey()+" value:"+entry.getvalue());
}
总结:两种迭代器,一种是通过将key存到Set中,通过keySet方法存入,一个是将键值对的映射即Map.Entry存到Set中,即通过entrySet方法中,然后通过Set中遍历进行取值

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容