javaweb学习总结六(泛型)
一:泛型的概念
泛型用来现在集合中的存储类型,防止取出时强制转换发生错误。

1:没有使用泛型时,如下:
@Test
public void test1() {
List list = new ArrayList();
list.add("aaa");
Integer i = (Integer) list.get(0); // 编译时并不会报错
System.out.println(i);
}
而是运行时错误

2:使用泛型后,如下:

二:使用泛型进行存取
可以使用传统的迭代器的keyset或者entryset方式,或者使用增强for循环
@Test
public void test3() {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "aaa");
map.put(2, "bbb");
map.put(3, "ccc"); // 传统keyset
System.out.println("传统keyset方式......");
Set<Integer> set = map.keySet();
Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
Integer key = it.next();
String value = map.get(key);
System.out.println(key + "=" + value);
}
// keyset 增强for
System.out.println("keyset...增强for");
for (Integer key : map.keySet()) {
String value = map.get(key);
System.out.println(key + "=" + value);
}
// 传统entryset
System.out.println("传统entryset方式");
Set<Map.Entry<Integer, String>> entry = map.entrySet();
Iterator<Entry<Integer, String>> item = entry.iterator();
while (item.hasNext()) {
Entry<Integer, String> en = item.next();
Integer key = en.getKey();
String value = en.getValue();
System.out.println(key + "=" + value);
}
// entryset 增强for
System.out.println("entryset...增强for");
for (Map.Entry<Integer, String> entr : map.entrySet()) {
Integer key = entr.getKey();
String value = entr.getValue();
System.out.println(key + "=" + value);
}
}
这里要注意,hashmap存储是安装hashcode进行排序的,如果想按照存入时的
顺序取出,推荐使用LinkedHashMap类,因为它的数据结构是链表。
三:泛型使用注意事项
1:使用泛型时,定义变量和创建对象(左右两边)泛型参数类型要一致
ArrayList<Object> list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<Object>();
以上两种方式都是错误的!
a: ArrayList list = new ArrayList<String>();
b: ArrayList<String> list = new ArrayList();
以上两种方式都是正确的!
a方式是为了兼容jdk1.5之前的程序,如果在jdk1.5之后写程序,会使用到泛型,想要调用
jdk1.5之前的程序,必须兼容此种情况。
b方式是为了兼容不同编程习惯的程序员之间可以互相调用。

2:擦除
在编译期时,使用泛型可以避免类型转换的错误,但是为了使泛型不影响程序运行效率,在生成
class文件时,泛型信息会被忽略掉。
四:自定义泛型
1:自定义泛型方法

如下在方法上声明泛型:

如果有返回值,可以避免类型的强制转换:
可以声明多个泛型:
public <T, K, V> void defineGeneric(T t, K k, V v) {
System.out.println(t + ":" + k + ":" + v);
}
练习题:使用泛型,颠倒数组内的元素
@Test
public void test5() {
Integer[] arr = { 1, 2, 3, 4, 5, 6 };
System.out.println(Arrays.toString(arr));
reverse(arr);
System.out.println(Arrays.toString(arr)); } // 使用泛型,颠倒数组中所有的元素
public <T> void reverse(T[] t) {
for (int i = 0, j = t.length - 1; i < t.length / 2; i++, j--) {
exChange(t, i, j);
}
} // 使用泛型,交互数组中两个元素
public <T> void exChange(T[] t, int a, int b) {
T temp = t[a];
t[a] = t[b];
t[b] = temp;
}
2:自定义泛型类
如果在类里有很多方法使用泛型,可以将泛型定义在类上。

javaweb学习总结六(泛型)的更多相关文章
- javaweb学习总结(六)——Servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- javaweb学习总结(六)——Servlet开发(二)(转)
转载自 http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文 ...
- Java泛型学习笔记 - (六)泛型的继承
在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...
- JavaWeb学习笔记六 JSP
JSP技术 JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结束. JSP是一种Java s ...
- JavaWeb学习 (十六)————JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- javaweb学习总结(六)——Servlet开发(三) 常见问题疑问
[1]response.getWriter().write()与out.print()的区别http://blog.csdn.net/javaloveiphone/article/details/81 ...
- javaweb学习之Servlet开发(二)
javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个< ...
- JavaWeb学习笔记总结 目录篇
JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...
- JavaWeb学习总结(转载)
JavaWeb学习总结(五十三)--Web应用中使用JavaMail发送邮件 JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件 JavaWeb学习总结(五十 ...
随机推荐
- 安卓升级提示 phoneGap APK软件更新提示
以下代码由PHP200 阿杜整理 package com.example.syzx; import java.io.BufferedReader; import java.io.File; imp ...
- STC89C52RC片内资源介绍
STC89C52RC片内有:用户应用程序区(AP)8K,地址0000h-1FFFh. 数据flash区(EEPROM)4K,2000h-2FFFh ISP引导区空间1K/2k/4k. RAM 512B ...
- linux的shell脚本入门
Linux shell脚本入门教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活 的工具.Shell不仅仅是命令的收集,而且是一门非常 ...
- 12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...
- CSS构造列表
列表图片 背景列表 翻转列表 水平导航 内边距与外边距 Ul { List-style-type:none; Margin: 0; Padding: 0; } 使用图片作为列表图标 Ul { Marg ...
- Egret项目Typescript的编译报错
今天编译项目,出现了一个奇怪的报错,如下: E:\engine\egret-core-3.1.2\tools\lib\typescript\tsclark.js:41531 1> if (fil ...
- Castle IOC容器快速入门
主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...
- iOS类别(Category)
iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最 ...
- 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...
- Mybatis学习之配置文件
Mybatis也是ORM框架的一种,与Hibernate框架的不同就是Hibernate框架是实体与表的映射,是一种全自动的ORM实现,而Mybatis是实体与sql语句的映射,是一种半自动的ORM映 ...