------- android培训、java培训、期待与您交流! ----------
泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制
好处:
1. 将运行时期出现的问题ClassCastException,转移到了编译时期,
方便于程序员解决问题,让运行时期问题减少,安全
2. 避免了强制转换的麻烦
泛型的格式:通过<>来定义要操作的引用数据类型
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型
其实<>就是用来接收类型的
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可
ArrayList<String> a1=new ArrayList<String>这句话的意思是定义了一个ArrayList容器,这个容器中元素的类型是String类型
自定义的泛型类:
class utils<QQ>
{
private QQ q;
public void setObject (QQ q)
{
this.q=q;
}
public QQ getObject ( )
{
return q;
}
}
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候
早期定义Object来完成扩展
现在定义泛型来完成扩展
泛型的出现避免了强转,同时将错误转移到了编译时期
泛型类定义的类型,在整个类中有效,如果被方法使用
那么泛型类得对象明确要操作的具体类型后,所有要操作的类型就已经固定了
为了让不同方法可以操作不同的类型,而且类型还不确定
那么可以将泛型定义在方法上
public <T> void show(T t)
将泛型定义在方法上的时候,可以接收不同的类型,
show(“hahhah”);
show(123);
特殊之处:
静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。
Public static<W> void method(W t)
给静态方法添加泛型,在使用时应用类调用
在泛型中定义打印集合的方法
在不知道打印什么类型时,可以用通配符代替“?”
public static void print(ArrayList <?> al)
public static<T> void print(ArrayList <T> al)
区别:T代表具体类型,传什么类型就是什么类型,而?代表的是不明确类型,可传入任何类型。
泛型限定:是泛型的高级应用
?通配符 ——也可以理解为占位符
泛型的限定:
? extends E :可以接收E类型或者E的子类,叫做上限
? super E:可以接收E类型或者E的父类型 ,叫做下限
“ArrayList<? Extends Person>”这是泛型的限定,这句话的意思是只能接受Person和Person的子类
泛型限定是用于泛型扩展用的
例如:
Class StuCmp implements Comparator<Student>
{
public int compare(Student s1, Student s2)
{
return s1.getName().compareTo(s2.getName());
}
}
Class Worker implements Comparator<Worker>
{
public int compare(Worker s1, Worker s2)
{
return s1.getName().compareTo(s2.getName());
}
}
Class comp implements Comparator<Person>
{
public int compare(Person p1, Person p2)
{
return p1.getName().compareTo(p2.getName());
// 这只能使用父类的方法
}
}
Map(顶层接口):
|--Hashtable(类):底层是哈希表数据结构,不可以存入null键null值,
该集合是线程同步的。。jdk1.0 效率低
|--HashMap(类): 底层是哈希表数据结构,允许使用null值和null值,
该集合是不同步的。。。jdk1.2 效率高
|--TreeMap(类): 底层是二叉树数据结构,线程不同步,
可以用于给Map集合中的键进行排序
Map和set很像
其实,set底层就是使用了Map集合
HashMap集合中,null是可以作为键存在的
Map集合中的方法:
Map集合:该集合存储键值对,一对一对往里存,而且保证键的唯一性
1,添加
put(K key,V value)
putAll(Map<? Extends K,? extends V> m)
2,删除
Clear()
Remove(Object key)
3,判断
containsValue(Object value) 返回值的类型是boolean类型
containsKey(Object key)
4,获取
get(Object key)
size()
value()
entrySet()
keySet() 重点
在map中使用put添加元素时,当你存的相同键时,新的值会替换老的值,而且put方法会返回这个键对应的原来的值 ,会返回被覆盖的值
Map 集合的两种取出方式:
Set<K> keySet:将map中所有的键存入到set集合中,因为set具备迭代器,所以可以迭代方式取出所有的键,在根据get方法
获 取每一个键对应的值,
返回的是Set
Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry
Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口
map集合的取出原理:将map集合转成set集合,在通过迭代器取出
keySet取出方式:
public static void main(String[] args)
{
Map<String,String> map=new HashMap<String,String>();
map.put("01","zs1");
map.put("02","zs2");
map.put("03","zs3");
map.put("04","zs4");
map.put("05","zs6");
Set<String> keyset=map.keySet();
Iterator<String> it=keyset.iterator();
while(it.hasNext())
{
String key=it.next();
String value=map.get(key);
System.out.println("key:"+key+" value"+value);
}
}
entrySet取出方式:
public static void main(String[] args)
{
Map<String,String> map=new HashMap<String,String>();
map.put("01","zs1");
map.put("02","zs2");
map.put("03","zs3");
map.put("04","zs4");
//利用entrySet取出映射关系存入到Set集合中
Set<Map.Entry<String,String>> entryset=map.entrySet();
Iterator<Map.Entry<String,String>> it=entryset.iterator();
while(it.hasNext())
{
Map.Entry<String,String> entry=it.next();
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+":::"+value);
}
}
练习:
“fsfhsfhsfaahccl”获取该字符串中的字母出现的次数
希望打印结果:a(2) c(2)
通过结果发现,每一个字母都有对应的次数
说明字母和次数之间都有映射关系
注意了,当发现有映射关系时,可以选择map集合
因为map集合中存放就是映射关系。
什么时候使用map集合?
当数据之间存在着映射关系时,就要先想到map集合
思路:
1. 将字符串转换成字符数组,因为要对每一个字母进行操作
2. 定义一个map集合,因为打印结果的字母有顺序,所以使用TreeMap集合
3. 遍历字符数组,
将每一个字母作为键去查map集合,
如果返回null,将该字母和1存入到map集合中。。。。。。。
如果返回不是null,说明该字母在map集合已经存在并有对应的次数。。。
那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖调用原有键对应的值
4. 将map集合中的数据变成指定的字符串形式返回
import java.util.*;
class CharArrayDemo //这道题是有一个字符串,打印输出每个字母出现的次数
{
public static void main(String[] args)
{
String tt="sfsfdsfdseeyyhhb";
Letter(tt);
}
public static void Letter(String char1)
{
//Integer value=0;
char[] ch=char1.toCharArray();
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
for(int x=0;x<ch.length;x++)
{
Integer value=tm.get(ch[x]);
if(value==null)
{
tm.put(ch[x],1);
}
else
{
value=value+1;
tm.put(ch[x],value);
}
}
Set<Character> keyset=tm.keySet();
Iterator<Character> it=keyset.iterator();
while(it.hasNext())
{
Character key=it.next();
Integer value=tm.get(key);
System.out.print(key+"("+value+")"+" ");
}
}
}