Java集合框架中的java泛型集合判断类型有什么优点

&nbsp 发表于& 09:35:00
【Java-高级特性】集合框架和泛型(上) 内容、素材及作业交流贴
【Java-高级特性】第1课:集合框架和泛型(上)上课时间:每周一、三、四、五上午10:00-11:30今日作业:课后请大家直接回复本帖,在此帖下提交自己作业/作品,发言交流学习心得,讲师、同学们也会在此给你点评或点赞哦。课工场Java技术交流群:Ps:新人加群后请看群公告获得更多帮助祝你学习进步!课程回放链接:
小课新人&于日 14:03&重新编辑过该帖
全部回复共48条
import&java.util.ArrayL
public&class&News&{
public&static&void&main(String[]&str)
ArrayList&list=new&ArrayList();
list.add(new&NewsInfo(&1&,&新闻1&,&管理员&));
list.add(new&NewsInfo(&2&,&新闻2&,&管理员&));
list.add(new&NewsInfo(&3&,&新闻3&,&管理员&));
list.add(new&NewsInfo(&4&,&新闻4&,&管理员&));
list.add(new&NewsInfo(&5&,&新闻5&,&管理员&));
list.add(new&NewsInfo(&6&,&新闻6&,&管理员&));
System.out.println(&总数是&+list.size());
for(int&a=0;a&list.size();a++)
NewsInfo&news=(NewsInfo)list.get(a);
System.out.println(news.getName());
System.out.println(&程序结束&);
class&NewsInfo
private&String&
private&String&
private&String&
public&NewsInfo(String&id,String&name,String&user)
&setId(id);
&setName(name);
&setUser(user);
public&String&getId()&{
public&void&setId(String&id)&{
this.id&=&
public&String&getName()&{
public&void&setName(String&name)&{
this.name&=&
public&String&getUser()&{
public&void&setUser(String&user)&{
this.user&=&
棒棒哒~集合类的其他方法也 要写一下啊~
你需要登录后才可以回帖& |
public&class&NewsTitle&{
//Id&新闻题目&&作者
private&int&&
private&String&&
private&String&
public&int&getId()&{
public&void&setId(int&id)&{
this.id&=&
public&String&getTitle()&{
public&void&setTitle(String&title)&{
this.title&=&
public&String&getAuthor()&{
public&void&setAuthor(String&author)&{
this.author&=&
public&NewsTitle(int&id,&String&title,&String&author)&{
this.id&=&
this.title&=&
this.author&=&
import&java.util.*;
public&class&ArrayListDemo&{
&*&@param&args
public&static&void&main(String[]&args)&{
//集合&存储&多条新闻标题
NewsTitle&title1=new&NewsTitle(1,&北京终于&晴天了&,&李白&);
NewsTitle&title2=new&NewsTitle(2,&国足获得大力神杯&,&李清照&);
NewsTitle&title3=new&NewsTitle(3,&姚明签约火箭&,&辛弃疾&);
NewsTitle&title4=new&NewsTitle(4,&贝克汉姆退役&,&杜甫&);
NewsTitle&title5=new&NewsTitle(4,&中国收复台湾&,&蒲松龄&);
ArrayList&list=new&ArrayList();&&//&声明集合。
//添加值&&在列表的末尾位置添加元素。起始位置从0开始。&添加成功&&返回true&不成功返回false.
list&.add(title1);
list&.add(title2);
list&.add(title3);
list&.add(title4);
//add&指定添加的位置&,&无返回值方法
list&.add(1,title5);
//遍历&集合
for&(int&i&=&0;&i&&&list.size();&i++)&{&&&&&&
NewsTitle&title=(NewsTitle)list.get(i);&&//list.get();返回指定位置索引的元素。是Obj类型,所以要强转
System.out.println(title.getTitle()+title.getId()+title.getAuthor()); //&&打印&集合中的值
System.out.println(&**************************&);
//增强&型的for&遍历集合
for&(Object&obj:list)&{
NewsTitle&title=(NewsTitle)
System.out.println(title.getTitle());
System.out.println(&************************&);
System.out.println(&当前集合大小为:&+list.size());&&&//返回列表中元素的个数
//判断列表中是否存在指定元素&&list.contains&&返回值是Boolean
System.out.println(list.contains(title1));
//从列表中删除元素&lest.remove&&返回值是Boolean.
System.out.println(list.remove(title1));
//从列表中删除指定位置元素,起始索引位置从0开始。&返回的Obj&类型
list.remove(1);
list.add()&&括号里面的参数是Object&类型的吗、?
如果&元素太多&&,添加是用for&吗、?
你在 MyEclipse 里面 list . 的时候就能看到里面的 参数类型了
2. 第二个问题我暂时没尝试,不知道是否可以用循环,理论上行得通, 就像之前做过的一个 选民投票的 题目一样
可以啊,可以用循环啊,可问题是你要把对象放在哪里?除非这些对象也是有共同特征的,比如每次list.add(new NewsTitle()),将这句话放在循环中,就是在循环添加新闻标题对象。
你需要登录后才可以回帖& |
package&com.
&*&新闻标题类
&*&@author&xieqian
public&class&PressTitle&{
private&int&
private&String& //标题
private&String& //作者
public&PressTitle(){}
public&PressTitle(int&id,&String&title,&String&author)&{
this.id&=&
this.title&=&
this.author&=&
public&int&getId()&{
public&void&setId(int&id)&{
this.id&=&
public&String&getTitle()&{
public&void&setTitle(String&title)&{
this.title&=&
public&String&getAuthor()&{
public&void&setAuthor(String&author)&{
this.author&=&
}package&com.
import&java.util.ArrayL
public&class&TextPress&{
&*&@param&args
public&static&void&main(String[]&args)&{
//创建新闻标题对象
PressTitle&title1&=new&PressTitle(1,&成都今天天气多雨&,&张三&);
PressTitle&title2&=new&PressTitle(2,&成都昨日某某&,&李四&);
PressTitle&title3&=new&PressTitle(3,&成都未来3天天气晴朗&,&张三&);
PressTitle&title4&=new&PressTitle(4,&成都天气多雨4&,&王五&);
PressTitle&title5&=new&PressTitle(5,&成都天气多5&,&张三&);
//创建ArryaList集合对象
ArrayList&lists=new&ArrayList();
lists.add(title1);
lists.add(title2);
lists.add(title3);
lists.add(title4);
System.out.println(&集合中是元素个数是:&+lists.size());
System.out.println(&向集合下标为2的位置添加元素!&);
lists.add(2,title5);
System.out.println(&添加后集合中是元素个数是:&+lists.size());
//遍历元素打印新闻标题
System.out.println(&新闻标题ttt作者&);
for&(int&i&=&0;&i&&&lists.size();&i++)&{
PressTitle&title=(PressTitle)lists.get(i);
System.out.println(title.getTitle()+&tt&+title.getAuthor());
System.out.println(&-----------------------n&);
//使用增强for循环打印
System.out.println(&使用增强for循环打印信息如下:&);
System.out.println(&新闻标题ttt作者&);
for&(Object&obj:lists)&{
PressTitle&title=(PressTitle)
System.out.println(title.getTitle()+&tt&+title.getAuthor());
System.out.println(&-----------------------n&);
System.out.println(&删除集合下标为2的元素!&);
lists.remove(2);
System.out.print(&删除集合中title4的元素:&);
System.out.println(lists.remove(title4));
System.out.println(&删除后打印集合中元素个数是:&+lists.size());
System.out.print(&查看集合中是否包含title3这个元素:&);
System.out.println(lists.contains(title3)+&n&);
//清除集合中所以元素
lists.clear();
System.out.println(&打印清除集合中所以元素后的个数:&+lists.size());
System.out.println(&查看集合中是否有元素(没有元素返回true):&+lists.isEmpty());
嗯嗯,写的很好~
你需要登录后才可以回帖& |
public&class&NewsTitle&{
private&int&
private&String&
private&String&
public&int&getId()&{
public&void&setId(int&id)&{
this.id&=&
public&String&getTitle()&{
public&void&setTitle(String&title)&{
this.title&=&
public&String&getFrom()&{
public&void&setFrom(String&from)&{
this.from&=&
public&NewsTitle(){}
public&NewsTitle(int&id,&String&title,&String&from)&{
this.id&=&
this.title&=&
this.from&=&
import&java.util.ArrayL
//新闻管理
public&class&ArrayListDemo&{
public&static&void&main(String[]&args)&{
//集合存储多条新闻标题
NewsTitle&title1&=&new&NewsTitle(1,&美6岁男童贪玩惹祸&被困15米高树顶&,&中国青年网&);
NewsTitle&title2&=&new&NewsTitle(2,&全球九大紧俏餐厅&其中一家已预定到2025年&,&新华网&);
NewsTitle&title3&=&new&NewsTitle(3,&天天两包烟玩手机到凌晨5点&28岁男突发心肌梗死&,&华龙网&);
NewsTitle&title4&=&new&NewsTitle(4,&估过万斑蝶来港避寒&南大屿山成新越冬地&,&中国青年网&);
NewsTitle&title5&=&new&NewsTitle(5,&济宁打击非法生产经营烟花爆竹百日行动启动&,&大众网&);
ArrayList&list&=&new&ArrayList();
//集合中的元素赋值用&&*.add(Object);
list.add(title1);
list.add(title2);
list.add(title3);
list.add(title4);
list.add(1,&title5);
System.out.println(&新闻标题的总数:&+list.size());&//列表的长度(元素个数)&&&*.size();
//遍历list,取出每条新闻标题的题目
//传统型的for
for(int&i=0;i&list.size();i++){
NewsTitle&title&=(NewsTitle)&list.get(i);&//&*.get(i);获得列表的下标
System.out.println(title.getTitle()+&_&+title.getFrom());
System.out.println(&******************************************&);
//增强型的for
for(Object&obj:list){
NewsTitle&title&=(NewsTitle)&
System.out.println(title.getTitle()+&_&+title.getFrom());
System.out.println(&******************************************&);
System.out.println(list.contains(title5));&&//判断列表中是否存在&title5
list.remove(title5);&//从列表中删除&title5
System.out.println(list.contains(title5));
System.out.println(&******************************************&);
list.remove(2);&&//从列表中删除下标为2的元素
System.out.println(&新闻标题的总数:&+list.size());
for(Object&obj:list){
NewsTitle&title&=(NewsTitle)&
System.out.println(title.getTitle()+&_&+title.getFrom());
不错,不错~
你需要登录后才可以回帖& |
不错。貌似前两次课没看见你来听课呢~
嗯,有点事耽误了,嘻嘻
你需要登录后才可以回帖& |
package com.kgc.public class NewsTitle {
private S private S public NewsTitle(){}; public NewsTitle(int id, String title, String author) {
this.title =
this.author = } public int getId() {
} public void setId(int id) {
this.id = } public String getTitle() {
} public void setTitle(String title) {
this.title = } public String getAuthor() {
} public void setAuthor(String author) {
this.author = } }package com.kgc.import java.util.ArrayLpublic class ArrayListDemo { public static void main(String[] args) {
//集合存储
NewsTitle title1 = new NewsTitle(1,&苏州新闻&,&周加伟&);
NewsTitle title2 = new NewsTitle(2,&南京新闻&,&周伟&);
NewsTitle title3 = new NewsTitle(3,&扬州新闻&,&周加&);
NewsTitle title4 = new NewsTitle(4,&北京新闻&,&加伟&);
NewsTitle title5 = new NewsTitle(5,&上海新闻&,&伟&);
ArrayList list=new ArrayList();
list.add(title1);
list.add(title2);
list.add(title3);
list.add(title4);
list.add(1,title5);
System.out.println(&新闻标题的总数:&+list.size());
for(int i=0;i&list.size();i++){
NewsTitle title=(NewsTitle)list.get(i);
System.out.println(title.getId()+&t&+title.getTitle()+&t&+title.getAuthor());
System.out.println(&###############&);
for(Object obj : list){
NewsTitle title=(NewsTitle)
System.out.println(title.getId()+&t&+title.getTitle()+&t&+title.getAuthor());
System.out.println(list.contains(title1));
System.out.println(list.remove(title1));
System.out.println(list.contains(title1));
System.out.println(&新闻标题的总数:&+list.size());
System.out.println(&----------------&);
for(Object obj : list){
NewsTitle title=(NewsTitle)
System.out.println(title.getId()+&t&+title.getTitle()+&t&+title.getAuthor());
list.remove(1);
System.out.println(&新闻标题的总数:&+list.size());
System.out.println(&+++++++++++++++++++++&);
for(Object obj : list){
NewsTitle title=(NewsTitle)
System.out.println(title.getId()+&t&+title.getTitle()+&t&+title.getAuthor());
你需要登录后才可以回帖& |
老师我的myexclipse界面动不动就成这样了,就是自己已经创建了很多的javaproject,也做过很多很多的案例了。但是你看找不到了。重新创建一个还是看不见,怎么找啊?
可以检查一下你的Myeclipse安装目录下的项目文件还在不在
你需要登录后才可以回帖& |
package&com.kgc.oop.
//新闻标题
public&class&NewsTitle&{
//ID&新闻题目&作者
private&int&
private&String&
private&String&
public&NewsTitle(){}
public&NewsTitle(int&id,&String&title,&String&author)&{
this.id&=&
this.title&=&
this.author&=&
public&int&getId()&{
public&void&setId(int&id)&{
this.id&=&
public&String&getTitle()&{
public&void&setTitle(String&title)&{
this.title&=&
public&String&getAuthor()&{
public&void&setAuthor(String&author)&{
this.author&=&
package&com.kgc.oop.
import&java.util.ArrayL
public&class&ArrayListDemo&{
public&static&void&main(String[]&args)&{
//集合存储多条新闻线索
NewsTitle&tite1&=&new&NewsTitle(1,&新闻标题1&,&admin&);
NewsTitle&tite2&=&new&NewsTitle(2,&新闻标题2&,&admin&);
NewsTitle&tite3&=&new&NewsTitle(3,&新闻标题3&,&admin&);
NewsTitle&tite4&=&new&NewsTitle(4,&新闻标题4&,&admin&);
NewsTitle&tite5&=&new&NewsTitle(5,&新闻标题5&,&admin&);
ArrayList&list&=&new&ArrayList();
list.add(tite1);
list.add(tite2);
list.add(tite3);
list.add(tite4);
list.add(1,&tite5);
System.out.println(&新闻标题的总数:&+list.size());
//遍历list,取出每条新闻标题
for(int&i=0;i&list.size();i++){
NewsTitle&title&=&(NewsTitle)list.get(i);
System.out.println(title.getTitle());
System.out.println(&******************************&);
for(Object&obj&:&list){
NewsTitle&title&=&(NewsTitle)
System.out.println(title.getTitle());
System.out.println(&********************************&);
//判断是否存在tite1
System.out.println(list.contains(tite1));
//移除tite1
list.remove(tite1);
//再次判断是否存在tite1
System.out.println(list.contains(tite1));
System.out.println(list.size());
//清空集合
list.clear();
System.out.println(list.size());
//判断集合是否为空
System.out.println(list.isEmpty());
你需要登录后才可以回帖& |
//新闻管理
public&class&NewsManagement&{
private&int&newNo;//ID
private&String&newT//名称
private&String&newsA//作者
public&NewsManagement(){}
public&NewsManagement(int&newNo,String&newTitle,String&newsAuthor)&{
this.newNo&=&newNo;
this.newTitle&=&newT
this.newsAuthor&=&newsA
public&String&getNewTitle()&{
return&newT
public&void&setNewTitle(String&newTitle)&{
this.newTitle&=&newT
public&String&getNewsAuthor()&{
return&newsA
public&void&setNewsAuthor(String&newsAuthor)&{
this.newsAuthor&=&newsA
public&int&getNewNo()&{
return&newNo;
public&void&setNewNo(int&newNo)&{
this.newNo&=&newNo;
import&java.util.ArrayL
public&class&NewsMgr&{
public&static&void&main(String[]&args)&{
//初始化信息,存储多个新闻
NewsManagement&news1&=&new&NewsManagement(1,&女婴捐器官救多人,仅活74分钟&,&NewsAdmin&);
NewsManagement&news2&=&new&NewsManagement(2,&日本出资5亿援肋中国绿化&,&NewsAdmin&);
NewsManagement&news3&=&new&NewsManagement(3,&张家界全球最长玻璃桥合龙&,&NewsAdmin&);
NewsManagement&news4&=&new&NewsManagement(4,&美国加州枪击案至少14人遇难&,&NewsAdmin&);
NewsManagement&news5&=&new&NewsManagement(5,&北京一学校开启充气膜抗雾霾&,&NewAdmin&);
ArrayList&list&=&new&ArrayList();
list.add(news1);
list.add(news2);
list.add(news3);
list.add(news4);
list.add(2,news5);
//显示新闻标题总数
System.out.println(&新闻标题总数是:&+list.size());
System.out.println(&-----------------------------------------&);
//显示新闻标题
for(Object&obj:list){//增强性for
NewsManagement&news&=&(NewsManagement)
System.out.println(news.getNewNo()+&-&+news.getNewTitle());
System.out.println(&-----------------------------------------&);
//判断是否存在指定元素
System.out.println(list.contains(news2));
//删除指定元素(直接用下标)
list.remove(1);//测试等同于list.remove(news2)
//普通性for
for(int&i=0;i&list.size();i++){
NewsManagement&news&=&(NewsManagement)list.get(i);
System.out.println(news.getNewNo()+&-&+news.getNewTitle());
//判断是否存在指定元素
System.out.println(list.contains(news2));
list.clear();//清空
System.out.println(list.size());
//判断是否清空了,返回值为boolean
System.out.println(list.isEmpty());
你需要登录后才可以回帖& |
你需要登录后才可以回帖& |
你需要登录后才可以回帖& |
你需要登录后才可以回帖& |
写的很好,下一次可以把运行效果一起贴出来呦~
你需要登录后才可以回帖& |
package com.kgc.//创建新闻标题类public class NewsTitle { //标题属性 id &name & author
private S private S
//构造方法 public NewsTitle(){}
public NewsTitle(int id, String name, String author) {
this.name =
this.author = } public int getId() {
} public void setId(int id) {
this.id = } public String getName() {
} public void setName(String name) {
this.name = } public String getAuthor() {
} public void setAuthor(String author) {
this.author = }
}******************************************************************************package com.kgc.import java.util.ArrayL//创建一个新闻管理系统public class NewsMgr { public static void main(String[] args) {
NewsTitle title1 = new NewsTitle(1,&新闻标题1&,&张三&);
NewsTitle title2 = new NewsTitle(2,&新闻标题2&,&李四&);
NewsTitle title3 = new NewsTitle(3,&新闻标题3&,&王五&);
NewsTitle title4 = new NewsTitle(4,&新闻标题4&,&陈六七&);
NewsTitle title5 = new NewsTitle(5,&新闻标题5&,&赵八九&);
ArrayList list = new ArrayList();
list.add(title1);
list.add(title2);
list.add(title3);
list.add(title4);
System.out.println(&************新闻标题5未添加前****************&);
System.out.println(&新闻标题总数为:&+list.size());
System.out.println(&新闻标题如下:&);
//遍历list集合,取出每天新闻标题题目
for(int i =0;i&list.size();i++){
//强制转换
NewsTitle title = (NewsTitle)list.get(i);
System.out.println(title.getName());
System.out.println(&*********用增强型for遍历集合打印id和作者******&);
for(Object obj:list){
NewsTitle title = (NewsTitle)
System.out.println(title.getId()+&t&+title.getAuthor());
System.out.println(&************添加新闻标题信息****************&);
list.add(2,title5);
System.out.println(&新闻标题信息如下:&);
for(Object obj:list){
NewsTitle title = (NewsTitle)
System.out.println(title.getId()+&t&+title.getName()+&t&+title.getAuthor());
写的不错,再接再厉呦!
你需要登录后才可以回帖& |
棒棒哒~赞一个~
你需要登录后才可以回帖& |
你需要登录后才可以回帖& |
(C)2017 北京课工场教育科技有限公司 版权所有
京公网安备90号
加群找伙伴问大牛&>&&>&&>&&>&学士后Java集合框架和泛型课后习题答案
学士后Java集合框架和泛型课后习题答案
上传大小:9KB
学士后Java集合框架和泛型课后习题答案
综合评分:0(0位用户评分)
所需积分:2
下载次数:4
审核通过送C币
创建者:qw
创建者:zhangguo5
课程推荐相关知识库
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
学士后Java集合框架和泛型课后习题答案
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
zengqing2010
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:您还可以使用以下方式登录
当前位置:&>&&>& > 《集合框架及泛型》上机实践内容
java泛型与集合框架 《集合框架及泛型》上机实践内容
《集合框架及泛型》作业
一、根据课上讲解内容,完成演示示例和课堂练习
1、ArrayList获取并打印新闻标题
需求说明:按照以下实现的步骤,使用ArrayList获取和打印新闻标题,显示效果如下图所示:
(1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性;
(2)创建存储各类新闻标题的集合对象;
(3)按照顺序依次添加各类新闻标题,使用add()方法;
(4)获取新闻标题的总数,使用size()方法;
(5)根据位置获取相应新闻标题、逐条打印每条新闻标题的名称,使用for循环遍历。
2、ArrayList存储狗狗信息
需求说明:按照以下实现的步骤,使用ArrayList存储狗狗信息,使用ArrayList的方法对狗狗信息进行删除、读取和判断,显示效果如下图所示:
(1)存储多条狗信息,获取狗总数,逐条打印出各条狗信息;
(2)删除指定位置的狗,使用remove()方法;
(3)判断集合中是否包含指定狗,使用contains()方法;
3、LinkedList添加和删除新闻标题
需求说明:在作业1的基础上,换用LinkedList存储新闻数据,并且使用LinkedList的getFirst()和getLast()方法获取第一条和最后一条数据,以及removeFirst()和removeLast()方法删除第一条和最后一条数据,输出效果如下图所示。
4、集合头尾位置删除和条件狗信息
需求说明:按照作业3的实现方式和所用到LinkedList的方法,实现狗狗信
息的更新并输出,输出效果如图所示。
5、使用Iterator和增强型for循环遍历Set
需求说明:按照以下实现的步骤,使用Iterator和增强型for循环遍历Set,输出效果如下图所示:
(1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性;
(2)创建存储各类新闻标题的集合对象;
(3)按照顺序依次添加各类新闻标题;
(4)获取新闻标题的总数;
(5)使用iterator()获取Iterator对象;
(6)使用Iterator遍历集合,使用hasNext()方法作为循环条件,判断是否存在另一个可访问的元素;
(7)使用增强型for遍历集合;
6、HashSet存储狗狗信息
需求说明:使用HashSet存储多条狗狗信息,获取狗狗总数,使用Iterator接口逐条打印出各条狗狗信息,输出效果如图所示。
7、使用HashMap集合类
需求说明:按照以下实现的步骤,使用HashMap建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作,输出效果如下图所示:
(1)使用HashMap存储多组国家英文简称和中文全称的键值对;
(2)显示&CN&对应国家的中文全称;
(3)显示集合中元素个数;
(4)两次判断Map中是否存在&FR&键;
(5)分别显示键集、值集和键值对集;
(6)清空 HashMap并判断;
欢迎转载:
推荐:    java中泛型的使用 -
- ITeye技术网站
博客分类:
泛型(Generics)是由编译器来验证从客户端将一种类型传送给某一对象的机制,实现了数据类型的参数化.
1.在使用泛型之前,先来看一下没有泛型的java集合框架(Collection)
import java.util.ArrayL
import java.util.L
public class GenericsDemo1 {
private final List list = new ArrayList();
public void addList() {
list.add("test");
list.add(10);
public void showList() {
for (Object o : list) {
System.out.println(((String) o));
public static void main(String[] args) {
GenericsDemo g = new GenericsDemo();
g.addList();
g.showList();
此段程序中包含两个方法,addList方法为list中增加了一个String类型和一个int类型;showList方法中,由于Collection在内部用的是Object,我们需要用String进行强制转换,运行时会出现ClassCastException.在实际开发中,开发这必须用实际类型进行Cast,编译器无法检查,代码在运行时会有抛出ClassCastException的危险.
2.使用泛型
j2se在1.5为所有的Collection都加入了泛型的声明,例如:
public class ArrayList&E& extends AbstractList&E& {
public void add(E element) {
public Iterator&E& iterator() {
这里的E是一个类型变量,并没有对它进行具体类型的定义,只是一个类型占位符,由使用者指定类型.通过使用泛型可增加类型安全:&&在类型没有变化时,Collection是类型安全的;&&类型的匹配错误在编译期间就可以捕捉到;&&内在的类型转换优于在外部的人工造型;&&使接口更加强壮,因为它增加了类型;
使用泛型修改第1节中的程序:
import java.util.ArrayL
import java.util.L
public class GenericsDemo2 {
private final List&String& list = new ArrayList&String&();
public void addList() {
list.add("test");
// list.add(10);
public void showList() {
for (String o : list) {
System.out.println(o);
public static void main(String[] args) {
GenericsDemo g = new GenericsDemo();
g.addList();
g.showList();
注意,使用泛型后,list.add(10)类型匹配错误,无法通过编译.
3.类型通配符
通过泛型可以做到限制类型,那么能否利用'多态'的特性呢?
List&Object& list = new ArrayList&String&();
如上,定义了一个存储Object类型的List,利用'多态'的特性,创建了一个String类型的ArrayList赋给list.实际上,这行代码是无法正常编译的,应该使用以下定义方式:
List&?& list3 = new ArrayList&String&();
其中?表示unknown类型,能与其他类型进行匹配,类似于'父类',称作类型通配符.有以下表现形式:
E类型&? extends E&
继承E的unknown类型&? super E&
E的unknown父类型&?&
unknown类型
下面通过一个例子来了解这几种通配符:
import java.util.ArrayL
import java.util.L
public class GenericsDemo3 {
public void a() {
List&Object& list = new ArrayList&&();
list.add(new Object());
list.add("a");
list.add(97);
list.add(null);
public void b() {
List&? extends Object& list = new ArrayList&String&();
// list.add(new Object());
// list.add("b");
// list.add(98);
list.add(null);
public void c() {
List&? super String& list = new ArrayList&&();
// list.add(new Object());
list.add("c");
// list.add(99);
list.add(null);
public void d() {
List&?& list = new ArrayList&&();
// list.add(new Object());
// list.add("d");
// list.add(100);
list.add(null);
此段程序包含的四个方法中,在a方法中,泛型类型确定为Object,可成功添加四个元素;在b方法中,list的定义是没问题的,但list.add("b")却无法通过编译,可知list内存储的数据类型的编译类型是unknown的,因此无法添加一个String.在c方法中,定义了一个存储String的父类的list,但list.add(new Object())却无法通过编译,而list.addd("c")却能执行通过,由此可见此时&? super String&与&String&作用相同.在d方法中,由于?是unknown类型,所以Object,String,Integer都是无法被添加的.由于null是所有类的对象,所以上述四个方法中的list.add(null)都是可以成功执行的.
4.自定义泛型&T&
在编程过程中,通过&T&表示一个类型,具体类型由使用者提供,如:Map&K,V&{},推荐的命名:
key,map的键V
value,list和set的内容,map的值E
public class GenericsDemo4 {
public static &T extends Comparable&T&& T max(T t1, T t2) {
if (t1.compareTo(t2) & 0) {
return t1;
return t2;
public static void main(String[] args) {
System.out.println(max(98, 97));
System.out.println(max("a", "b"));
// System.out.println(max(97, "b"));
此段程序在max方法中定义了一个泛型T,T实现了Comparable接口(不能用implements,只能用extends),Comparable比较的类型又是T,同时也将T作为参数和返回值.在main方法中调用了3次max,只有前两次能够编译并执行,在第三次调用max(97,"b")时,传入的参数分别是Integer和String,编译器无法判断返回值的类型,无法完成编译.执行后输出结果:
另外注意,定义的&T&可以同时继承类和实现接口,用&连接,上述的max方法也可如下定义:
public static &T extends Object & Comparable&T&& T max(T t1, T t2) {
if (t1.compareTo(t2) & 0) {
return t1;
return t2;
泛型(Generics),实现类数据类型的参数化,通过使用泛型,对数据类型自动检查,避免了类型转换,增加了程序的安全性.
xiao1zhao2
浏览: 16838 次
来自: 北京
synchronized与Lock在实现上并没有本质的区别,所 ...
xiao1zhao2 写道戢_时光 写道
5)Lock可以 ...
加点难度,如何解决拆包、粘包
戢_时光 写道
5)Lock可以提高多个线程进行读操作的效 ...
同问,想了解性能如何}

我要回帖

更多关于 java 获取集合泛型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信