大内高手社区
标题: java泛型 & 增强for循环foreach [打印本页]
作者: ABCDEFG 时间: 2021-11-16 17:58
标题: java泛型 & 增强for循环foreach
一、泛型
1.为什么引入泛型?
[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
关于JDK5.0新特性:泛型(编译器概念)
1、为什么引入泛型?
1.可以统一集合中的数据类型
2.减少强制类型转换
2、泛型语法如何实现?
3、泛型的优点与缺点?
优点:统一类型,减少强制类型转换
缺点:只能存储一种类型
以下程序没有使用泛型,缺点?
如果集合不使用泛型,则集合中的元素类型不统一。
在遍历集合的时候,只能拿出来Object类型,需要大量的强制类型转换,太麻烦。
*/
import java.util.*;
public class GenericTest01 {
public static void main(String[] args) {
// 创建一个集合,存储A、B、C
Set s = new HashSet();
// 创建对象
A a1 = new A();
B b1 = new B();
C c1 = new C();
// 添加元素
s.add(a1);
s.add(b1);
s.add(c1);
// 需求:遍历集合。如果是A类型,调用m1方法;如果是B类型,调用m2方法;如果是C类型,调用m3方法
Iterator it = s.iterator();
while(it.hasNext()){
Object o = it.next();
if(o instanceof A){
A a = (A)o;
a.m1();
}else if(o instanceof B){
B b = (B)o;
b.m2();
}else if(o instanceof C){
C c = (C)o;
c.m3();
}
}
}
}
class A{
public void m1(){
System.out.println("A's m1()...");
}
}
class B{
public void m2(){
System.out.println("B's m2()...");
}
}
class C{
public void m3(){
System.out.println("C's m3()...");
}
}
2.泛型语法
2.1 List使用泛型
[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
泛型语法如何实现?
泛型是一个编译阶段的语法
在编译阶段统一集合中的类型
*/
import java.util.*;
public class GenericTest02 {
public static void main(String[] args) {
// 创建一个List集合,只能存储字符串类型
List<String> strs = new ArrayList<String>();
// 添加元素
//strs.add(1); Error
strs.add("Jack");
strs.add("Tom");
strs.add("Tony");
strs.add("Smith");
// 遍历
Iterator<String> it = strs.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
2.2 Map使用泛型
[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
Map使用泛型
*/
import java.util.*;
public class GenericTest03 {
public static void main(String[] args) {
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("西瓜", 10);
maps.put("苹果", 5);
maps.put("桃子", 4);
maps.put("葡萄", 8);
Set<String> keys = maps.keySet();
Iterator it = keys.iterator();
while(it.hasNext()){
String k = (String) it.next(); // 这里it.next()返回的是Object类,还是需要强制转换
Integer v = maps.get(k);
System.out.println(k + "-->" + v);
}
}
}
2.3 SortedSet集合使用泛型
[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
SortedSet集合使用泛型
*/
import java.util.*;
public class GenericTest04 {
public static void main(String[] args) {
SortedSet<Manager> ss = new TreeSet<Manager>();
// 添加
Manager m1 = new Manager(1000);
Manager m2 = new Manager(1500);
Manager m3 = new Manager(900);
Manager m4 = new Manager(2000);
ss.add(m1);
ss.add(m2);
ss.add(m3);
ss.add(m4);
// 遍历
Iterator it = ss.iterator();
while(it.hasNext()){
Manager m = (Manager) it.next(); // 这里it.next()返回的是Object类
System.out.println(m);
}
}
}
class Manager implements Comparable<Manager>{
double sal;
Manager(double sal){
this.sal = sal;
}
public String toString(){
return "Manager[sal:" + sal +"]";
}
public int compareTo(Manager m){
double sal1 = this.sal;
double sal2 = m.sal;
if(sal1 < sal2){
return -1;
}else if(sal1 > sal2){
return 1;
}else{
return 0;
}
}
}
3. 自定义泛型
[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
自定义泛型
*/
public class GenericTest05 {
public static void main(String[] args) {
MyClass<String> mc = new MyClass<String>();
// mc.m1(100); // 传入int类型数据,编译失败
mc.m1("100");
}
}
// 自定义泛型
// 这里面的字母T是无所谓的,一般是 T 或者 E , T:type ; E:element
class MyClass<T>{
public void m1(T t){
System.out.println(t);
}
}
二、增强for循环 foreach
[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
关于增强for循环
语法:
for(类型 变量 : 数组名/集合名){}
集合要想使用增强for循环这样语法,集合需要使用泛型。
如果集合不使用泛型,该集合在用增强for循环的时候应该用Object类型定义
*/
import java.util.*;
public class ForeachTest01 {
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,76};
//遍历
for(int i=0; i<a.length; i++){
System.out.println(a);
}
System.out.println("=================");
// foreach
for(int e : a){
System.out.println(e);
}
System.out.println("================");
// 集合
Set<String> strs = new HashSet<String>();
strs.add("张三");
strs.add("李四");
strs.add("王五");
strs.add("赵六");
// 遍历
for(String name : strs){
System.out.println(name);
}
System.out.println("================");
// 集合不使用泛型
List l = new ArrayList();
l.add(1);
l.add(2);
l.add(3);
l.add(4);
// 如果集合不使用泛型,该集合在用增强for循环的时候应该用Object类型定义。
for(Object o : l){
//for(Integer o : l){ // 【注意】即使这里写的是Integer也仍然会报错,尽管集合里面都是整型
System.out.println(o);
}
}
}
[Java] 纯文本查看 复制代码
package com.company01.generic;
import java.util.*;
public class ForeachTest02 {
public static void main(String[] args) {
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("西瓜", 10);
maps.put("苹果", 5);
maps.put("桃子", 4);
maps.put("葡萄", 8);
Set<String> keys = maps.keySet();
for (String k : keys) {
Integer v = maps.get(k);
System.out.println(k + "-->" + v);
}
}
}
【免责声明】本文部分系转载,原文来源csdn,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与联系我们,我们会予以更改或删除相关文章,以保证您的权益!
欢迎光临 大内高手社区 (https://bbs.tedu.cn/) |
Powered by Discuz! X3.4 |