为了让集合使用更安全,
问题:什么类型的元素都可以存储。导致取出时,如果出现强转就会引发运行时异常ClassCastException
能不能在创建集合时,就明确容器中的元素的类型。如同数组一样。
目的是为了更安全。
JDK1.5以后,出现了解决方案,使用容器时,必须明确容器中元素的类型。
这种机制:称之为:泛型。
体现
<数据类型>,不是很难理解,
<>也是括号,往括号里写东西其实就是在传递参数。
泛型:
1,安全机制。
2,将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
3,泛型技术,是给编译器使用的技术。
4,避免了强转的麻烦。
泛型概述
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class GenericDemo {
public static void main(String[] args) {
List<String> list=
new ArrayList<String>();
list.add(
"abc");
for (Iterator it = list.iterator(); it.hasNext();) {
String str =(String)it.next();
System.out.println(str.length());
}
}
}
泛型类的使用
import java.util.Iterator;
import java.util.LinkedList;
public class GenericDemo2 {
public static void main(String[] args) {
Tool<String> t =
new Tool<String>();
String s =t.getObject();
System.out.println(s);
Queue<String> queue =
new Queue<String>();
queue.myAdd(
"abc1");
queue.myAdd(
"abc2");
queue.myAdd(
"abc3");
while(!queue.isNull()){
System.out.println(queue.myGet());
}
}
}
class Tool<Q>{
private Q object;
public Q
getObject() {
return object;
}
public void setObject(Q object) {
this.object = object;
}
}
class Queue<E>{
private LinkedList<E> link;
Queue(){
link =
new LinkedList<E>();
}
/**
* 队列的添加元素功能
*/
public void myAdd(E obj){
link.addFirst(obj);
}
/**
* 队列的获取方法
*/
public E
myGet(){
return link.removeLast();
}
/**
* 判断队列中元素是否空,没有元素就为true。
*/
public boolean isNull() {
return link.isEmpty();
}
}
泛型方法的使用
public class GenericDemo3 {
public static void main(String[] args) {
Util<String> util =
new Util<String>();
util.show(
"hehe");
Util<Integer> util2 =
new Util<Integer>();
Util.print(
5);
util2.show(
"hehe");
}
}
class Util<W>{
public <Q>
void show(Q q){
System.
out.println(
"show:"+q);
}
public static<E>
void print(E e){
System.
out.println(
"print:"+e);
}
public void method(W w){
}
}
泛型接口的使用
public class GenericDemo4 {
public static void main(String[] args) {
new InterImpl<String>().show(
"hehe");
}
}
interface Inter<E>{
void show(E e);
}
class InterImpl<T> implements Inter<T>{
@Override
public void show(T e) {
}
}
People
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name,
int age) {
super();
this.name = name;
this.age = age;
}
public String
getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(
int age) {
this.age = age;
}
@Override
public String
toString() {
return "Person [name=" + name +
", age=" + age +
"]";
}
}
Student
public class Student extends Person {
public Student() {
super();
}
public Student(String name,
int age) {
super(name, age);
}
@Override
public String
toString() {
return "Student [Name=" + getName() +
", Age=" + getAge() +
"]";
}
}
Worker
public class Worker extends Person {
public Worker() {
super();
}
public Worker(String name,
int age) {
super(name, age);
}
@Override
public String
toString() {
return "Worker [Name=" + getName() +
", Age=" + getAge() +
"]";
}
}
泛型通配符的使用
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import domain.Student;
public class GenericDemo5 {
public static void main(String[] args) {
Set<Student> list =
new HashSet<Student>();
list.add(
new Student(
"lisi1",
11));
list.add(
new Student(
"lisi2",
12));
list.add(
new Student(
"lisi3",
13));
printList(list);
List<String> list2 =
new ArrayList<String>();
list2.add(
"lisi11");
list2.add(
"lisi22");
list2.add(
"lisi33");
printList(list2);
}
private static void printList(Collection<?> list2) {
for (Iterator<?> it = list2.iterator(); it.hasNext();) {
System.out.println(it.next().toString());
}
}
}
泛型的限定的使用
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import domain.Person;
import domain.Student;
import domain.Worker;
public class GenericDemo6 {
public static void main(String[] args) {
Set<Student> list1 =
new HashSet<Student>();
list1.add(
new Student(
"lisi1",
11));
list1.add(
new Student(
"lisi2",
12));
list1.add(
new Student(
"lisi3",
13));
printList(list1);
List<Worker> list2 =
new ArrayList<Worker>();
list2.add(
new Worker(
"lisi11",
11));
list2.add(
new Worker(
"lisi22",
12));
list2.add(
new Worker(
"lisi33",
13));
printList(list2);
}
private static void printList(Collection<?
extends Person> list) {
for (Iterator<?
extends Person> it = list.iterator(); it.hasNext();) {
System.out.println(it.next().toString());
}
}
}
通配符在api中的体现和使用
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import domain.Student;
public class GenericDemo7 {
public static void main(String[] args) {
Collection<String> c1 =
new ArrayList<String>();
c1.add(
"haha");
c1.add(
"hehe");
Collection<Integer> c2 =
new ArrayList<Integer>();
c2.add(
4);
c2.add(
5);
boolean b = c1.containsAll(c2);
System.out.println(
"b="+b);
}
}
泛型上限在api中的体现和使用
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeSet;
import cn.itcast.domain.Person;
import cn.itcast.domain.Student;
public class GenericDemo8 {
public static void main(String[] args) {
Collection<Student> c =
new ArrayList<Student>();
c.add(
new Student(
"wangcai1",
26));
c.add(
new Student(
"wangcai2",
29));
TreeSet<Person> ts =
new TreeSet<Person>(c);
ts.add(
new Person(
"lisi",
20));
for (Iterator<Person> it = ts.iterator(); it.hasNext();) {
Person person = it.next();
System.out.println(person);
}
}
}
泛型下限在api中的体现和使用
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
import cn.itcast.domain.Person;
import cn.itcast.domain.Student;
import cn.itcast.domain.Worker;
public class GenericDemo9 {
public static void main(String[] args) {
TreeSet<Student> ts =
new TreeSet<Student>(
new ComparatorByName());
ts.add(
new Student(
"abc",
26));
ts.add(
new Student(
"aaa",
29));
ts.add(
new Student(
"lisi",
20));
for (Iterator<Student> it = ts.iterator(); it.hasNext();) {
Student student = it.next();
System.out.println(student);
}
TreeSet<Worker> ts2 =
new TreeSet<Worker>(
new ComparatorByName());
ts2.add(
new Worker(
"abc",
26));
ts2.add(
new Worker(
"aaa",
29));
ts2.add(
new Worker(
"lisi",
20));
for (Iterator<Worker> it = ts2.iterator(); it.hasNext();) {
Worker worker = it.next();
System.out.println(worker);
}
}
}
class ComparatorByName implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
int temp = o1.getName().compareTo(o2.getName());
return temp==
0? o1.getAge() - o2.getAge() : temp;
}
}
泛型细节:保证两边泛型值一致
import java.util.ArrayList;
import java.util.List;
public class GenericDemo10 {
/**
* @param args
*/
public static void main(String[] args) {
List<Integer> list =
new ArrayList<Integer>();
}
public static void show(List<String> list){
}
}
GenericTest1
对字符串按照长度排序,比较器用匿名内部类完成。想要逆序,只要将o1和o2比,改成o2和o1比。
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class GenericTest {
public static void main(String[] args) {
Set<String>
set =
new TreeSet<String>(
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int temp =o1.length()-o2.length();
return temp==
0?o1.compareTo(o2):temp;
}
});
set.add(
"abcd");
set.add(
"java");
set.add(
"hello");
for (Iterator<String> it =
set.iterator(); it.hasNext();) {
String
string = it.next();
System.
out.println(
string);
}
}
}
GenericTest2
获取集合元素最大值,1,指定类型 2,Object类型,3,泛型限定。★★★★★
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import cn.itcast.domain.Student;
public class GenericTest2 {
public static void main(String[] args) {
Collection<Student> c1 =
new ArrayList<Student>();
c1.add(
new Student(
"xiaoming1",
30));
c1.add(
new Student(
"xiaoming2",
36));
c1.add(
new Student(
"xiaoming3",
22));
Student stu = getMax(c1);
System.out.println(stu);
Collection<String> c2 =
new ArrayList<String>();
c2.add(
"abcd");
c2.add(
"java");
c2.add(
"z");
c2.add(
"nba");
String s = getMax(c2);
System.out.println(
"s="+s);
Collection<Dog> c3 =
new ArrayList<Dog>();
}
public static <T
extends Comparable<?
super T>> T getMax(Collection<?
extends T> c,Comparator<?
super T> comp){
if(comp==
null){
return getMax(c);
}
Iterator<?
extends T> it = c.iterator();
T max = it.next();
while(it.hasNext()){
T temp = it.next();
if(comp.compare(temp, max)>
0){
max = temp;
}
}
return max;
}
public static <T
extends Comparable<?
super T>> T getMax(Collection<?
extends T> c){
Iterator<?
extends T> it = c.iterator();
T max = it.next();
while(it.hasNext()){
T temp = it.next();
if(temp.compareTo(max)>
0){
max = temp;
}
}
return max;
}
}
class Dog{}
【作业】
1,Collection和Collections的区别?【面试题】
Collection是集合框架的顶层接口。
下面有两个开发中常用的
List 和
Set集合。
根据数据结构的不同,也有了很多的具体子类集合对象。
Collections:是集合框架中的用于操作集合的工具类。
提供了很多的静态方法:比如:对
list排序,二分查找,比如可以获取最值等。
其中一组可以非同步集合转成同步 集合的方法。
2,对List集合中存储的重复字符串元素,按照长度进行排序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
List<String> list =
new ArrayList<String>();
list.add(
"nba");
list.add(
"abcde");
list.add(
"nba");
list.add(
"cctv");
list.add(
"zz");
list.add(
"cctv");
list.add(
"itcast");
Collections.sort(list,
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int temp = o1.length() - o2.length();
return temp==
0?o1.compareTo(o2):temp;
}
});
for(String str : list){
System.out.println(str);
}
}
}
3,在一个已排序的List集合中插入一个字符串,继续保证这个集合原有排序,问如何获取这个位置。【面试题】
使用到了二分查找。
import java
.util.ArrayList
import java
.util.Collections
import java
.util.Comparator
import java
.util.List
public class Test3 {
public static void main(String[] args) {
//
3,在一个已排序的List集合中插入一个字符串,继续保证这个集合原有排序,问如何获取这个位置。
List<String> list = new ArrayList<String>()
list
.add(
"nba")
list
.add(
"abcde")
list
.add(
"nba")
list
.add(
"cctv")
list
.add(
"zz")
list
.add(
"cctv")
list
.add(
"itcast")
Collections
.sort(list)
String key =
"haha"
//找一个元素在集合中出现的位置。
int index = Collections
.binarySearch(list, key)
System
.out.println(
"index="+index)
if(index<
0){
index = -(index+
1)
}
System
.out.println(
"index="+index)
System
.out.println(list)
list
.add(index, key)
System
.out.println(list)
}
}
5,一个ArrayList对象alist中存有若干个字符串元素,现欲遍历该ArrayList对象, 删除其中所有值为”abc”的字符串元素
,请问下面的实现正确么?如有问题, 会出现什么问题?如何更正?
int size = alist.
size();
for(
int i =
0; i <
size; i++) {
if(
"abc".equals(alist.get(i))) {
alist.remove(i);
}
}
import java.util.ArrayList;
import java.util.
List;
public class Test5 {
public static void main(String[] args) {
List<String>
list =
new ArrayList<String>();
list.add(
"nba");
list.add(
"abc");
list.add(
"abc");
list.add(
"abc");
list.add(
"abc");
list.add(
"cctv");
System.out.println(
list);
for(int i =
0; i <
list.size(); i++) {
if(
"abc".equals(
list.get(i))) {
list.remove(i);
i--;
}
}
System.out.println(
list);
}
}
Collections工具类
import java
.util.ArrayList
import java
.util.Collection
import java
.util.Collections
import java
.util.Comparator
import java
.util.List
import cn
.itcast.api.c.comparator.ComparatorByLength
public class CollectionsDemo {
public static void main(String[] args) {
System
.out.println(
"---------获取最值---------------")
Collection<String> c = new ArrayList<String>()
c
.add(
"haha")
c
.add(
"zz")
c
.add(
"xixii")
c
.add(
"abc")
String max = Collections
.max(c,new ComparatorByLength())
System
.out.println(
"max="+max)
System
.out.println(
"-----------排序-------------")
List<String> list = new ArrayList<String>()
list
.add(
"hahaha")
list
.add(
"abc")
list
.add(
"xiix")
list
.add(
"z")
list
.add(
"java")
Collections
.sort(list,Collections
.reverseOrder())
System
.out.println(list)
}
}
Arrays工具类-集合和数组的互转
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = {
34,
21,
67};
System.
out.println(Arrays.toString(arr));
List<
int[]> list1 = Arrays.asList(arr);
System.
out.println(list1);
String[] strs = {
"hah",
"hehe",
"xixi"};
boolean b = contains(strs,
"hehe");
System.
out.println(b);
List<String> list = Arrays.asList(strs);
System.
out.println(list.contains(
"hehe"));
System.
out.println(list.
get(
2));
System.
out.println(list.indexOf(
"hehe"));
Collection<String> c =
new ArrayList<String>();
c.add(
"haha1");
c.add(
"haha2");
c.add(
"haha3");
c.add(
"haha4");
String[] str_arr = c.toArray(
new String[c.size()]);
System.
out.println(Arrays.toString(str_arr));
}
public static boolean
contains(String[] strs,String key) {
for (
int i =
0; i < strs.length; i++) {
if(strs[i].equals(key)){
return true;
}
}
return false;
}
}