美文网首页
提示二十九

提示二十九

作者: 飞絮搅青冥 | 来源:发表于2022-07-07 06:46 被阅读0次

提示二十九: 优先考虑泛型。

这一章中,作者主要通过举例讲解了一个的简单堆栈实现。

 class Stack {
        private 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);
        }
    }

因为这里的element对象是Object数组,所以使用的时候会需要强制类型转化,所以作者就提出了两种泛型化的方法。

一种是将Object[]强转成E[]:

public class Stack<E> {
  private E[] elements;
  private int size = 0;
  private static final int DEFAULT_INITIAL_CAPACITY = 16;

  @SuppressWarnings("unchecked")
  public Stack() {
    elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
  }

另外一种是将elements从E[] 改成Object[], 数组取元素时再把Object转化成E。

  private Object[] elements;
  private int size = 0;
  private static final int DEFAULT_INITIAL_CAPACITY = 16;

  public Stack() {
    elements = new Object[DEFAULT_INITIAL_CAPACITY];
  }

  public E pop() {
    if (size == 0)
      throw new EmptyStackException();

    // push requires elements to be of type E, so cast is correct
    @SuppressWarnings("unchecked") E result =
      (E) elements[--size];

    elements[size] = null; // Eliminate obsolete reference
    return result;
  }

第一种可读性更强,但会造成堆污染:数组编译和运行时类型不匹配。第二种就不会造成堆污染。总之,泛型类型比需要在客户端代码中强制转换的类型更安全,更易于使用。在设计新类的时候,要确保它们不需要这种转换就可以使用。

但是如果不用数组,而采用列表,那么上面这个方法会容易很多。但如果考虑到堆栈是基础的数据结构,如果被广泛使用可能会需要考虑性能,数组又比列表更加优秀,总之还是要权衡多方因素。但是我们实际编码过程中,由于是客户端开发为主,基本不会去写非常底层的工具,所以我一般都是无脑选择列表的,可能以后开发的时候也要多考虑考虑。

相关文章

  • 提示29-34

    今天继续学习有关调试的内容,先看提示: 提示二十九:去解决问题,而不是责备。提示三十:不要恐慌。提示三十一:修代码...

  • 提示二十九

    提示二十九: 优先考虑泛型。 这一章中,作者主要通过举例讲解了一个的简单堆栈实现。 因为这里的element对象是...

  • 我为亲爱的肝脏代言-29

    【哪些表现提示肝脏细胞损伤】 每日一更(2020.12.20,第二十九期) 第一个表现: 经常发脾...

  • 三生三世浮生辞(29)

    (若莎温馨提示:看之前做好准备,或者可以绕过这几章。若莎已经做好收刀片板砖的准备) 第二十九章 “你倒是心疼她。不...

  • “珠海长隆海洋王国”游玩温馨提示(上)

    去珠海长隆海洋王国游玩温馨提示: 1、想去的亲可以提前网购门票。 长隆海洋王国的门票挺贵的。我们是年二十九去的,当...

  • 感谢指教,感谢邀请

    2021年9月5日 星期日 晴(农历七月二十九) 【满霞反思成长日记】 昨晚登录网银,不小心默认了一个提示,导致...

  • 2020|12|29

    十二月二十九十二月二十九十二月二十九 十二月二十九十二月二十九了十二月二十九了呀 又是到了一个我敬往事一杯酒的时候...

  • 第二十九课 ДВАДЦАТЬ ДЕВЯТЫЙ УРОК

    单词 Слова: двадцать девять(数)二十九 двадцать девятый(数)第二十九 и...

  • 门道文化|冬不拉:东不拉啊东布拉

    门道提示: 农历八月二十九 冬不拉,是中亚地区的哈萨克族的传统弹拨乐器,在哈萨克斯坦以及中国新疆的哈萨克族中尤其流...

  • 门道文化|寒露:袅袅凉风动,凄凄寒露零

    门道提示: 农历八月二十九 寒露是农历二十四节气中的第十七个节气,寒露是气候从凉爽到寒冷的过渡。气温逐渐下降,我们...

网友评论

      本文标题:提示二十九

      本文链接:https://www.haomeiwen.com/subject/dlmubrtx.html