博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第26条:优先考虑泛型
阅读量:6171 次
发布时间:2019-06-21

本文共 2035 字,大约阅读时间需要 6 分钟。

考虑第6条的简单堆栈实现:

public class Stack {    pprivate Object[] elements;    private int size = 0;    private static final int DEFAULT_INITAL_CAPACITY = 16;        public Stack() {        elements = new Object[DEFAULT_INITAL_CAPACITY];    }        public void push(Object e) {        ensureCapacity();        elements[size++] = e;    }        public Object pop() {        if(size == 0) {            throw new EmptyStackException();        }        Object result = elements[--size];        elements[size] = null;        return result;    }        public boolean isEmpty() {        return size == 0;    }    private void ensureCapacity() {        if(elements.length == size)            elements = Arrays.copyOf(elements, 2 * size + 1);    }}

将该类泛型化可以提高类型的安全性,方便客户端使用(无需显式强制转换类型)

 

首先用类型参数替换所有的Object类型:

public class Stack
{ pprivate E[] elements; private int size = 0; private static final int DEFAULT_INITAL_CAPACITY = 16; public Stack() { elements = new E[DEFAULT_INITAL_CAPACITY]; } public void push(E e) { ensureCapacity(); elements[size++] = e; } public E pop() { if(size == 0) { throw new EmptyStackException(); } E result = elements[--size]; elements[size] = null; return result; } public boolean isEmpty() { return size == 0; } private void ensureCapacity() { if(elements.length == size) elements = Arrays.copyOf(elements, 2 * size + 1); }}

由于不能创建不可具体化类型的数组,所有有错误(new E[DEFAULT)INITIAL_CAP]是不允许的)

 

解决方法:

1.创建一个Object数组,并将它转换成泛型数组类型:

elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];

错误变成一条警告,因为可以保证类型安全,所以可以用SupressWarning注释忽略掉该警告。

 

2.将elements域的类型从E[]改为Object[]:

private Object[] elements; E result = (E) elements[--size];

产生一条警告,因为可以保证类型安全,所以所以可以用SupressWarning注释忽略掉该警告。

 

实际中选择第二种方法较多,因为pop方法经常会被调用,频繁地类型转换会耗费时间。

 

在25条中,鼓励优先使用列表而非数组。实际上并不总能在泛型中使用列表。为了提高性能,列表不是Java提供的基本实现,如ArrayList就需要在数组上实现,而某些类,如HashMap为了提高性能,也在数组上实现。

转载于:https://www.cnblogs.com/13jhzeng/p/5722102.html

你可能感兴趣的文章
sqlalchemy中文乱码问题解决方案
查看>>
配置163 yum 源
查看>>
ELK日志系统部署(CentOS7.3)
查看>>
android利用java反射机制动态获取资源ID
查看>>
探索MySQL高可用架构之MHA(8)
查看>>
RHCE考试之磁盘配额
查看>>
1 虚拟化介绍
查看>>
Shc可以用来对shell脚本进行加密
查看>>
负载均衡之DNS域名解析,实现一个域名对应多个IP地址
查看>>
CentOS7 修改网卡名称
查看>>
WINDOWS 10 PRO专业版ESD镜像官方下载地址
查看>>
cocoaPods第三方库使用详解
查看>>
9.SQL注入
查看>>
linux 文件,目录权限详解
查看>>
我的友情链接
查看>>
history命令使用技巧
查看>>
php gd库没有安装问题确认
查看>>
JS代码收集资料
查看>>
linux系统运维面试题
查看>>
split命令使用范例
查看>>