天天看点

王思聪VS张康阳:创业更比守业难?

2021年7月12日张近东辞去苏宁董事长并提名张康阳为非独立董事。张近东的黯然退场犹如2017年的王健林。那么在时代更迭的过程中,他们的儿子又会以怎样的姿态立住脚跟?

王思聪 张康阳
父亲 王健林 张近东
父亲企业 万达 苏宁
学校 伦敦大学学院 沃顿商学院
性格 张扬 低调
成就 IG创始人 国米主席
出生日期 1988.01.03 1991.12.21
星座 摩羯座  射手座
财富排名(2020) 7 61
绯闻 "国民老公"

通过对比可以发现,王思聪和张康阳虽然同属富二代,但却走了截然不同的发展道路。王思聪对外创业,张康阳对内守业。这没有优劣之分,都符合各自现状的最优选择。接下来通过代码演绎这两种情况。

王思聪-ArrayList.subList()

ArrayList的subList()方法是对List截取一段数据,而subList()返回SubList内部类

这就像王健林当初给王思聪5亿投资练手,7年后5亿变63亿,随后成立IG电子竞技俱乐部,这时候的老王已经看不明白了,但是仍大受震撼。很多人会觉得只要有钱,成立一个电子竞技俱乐部也不是什么难事,可现实情况真的这样吗?

以下代码,模拟以上的说法,老王绕过小王成立IG俱乐部,结果抛出异常。

public static void main(String[] args) {

    List<String> list = new ArrayList<String>();
    list.add("11");
    list.add("22");
    list.add("33");
    list.add("44");

    List<String> sub = list.subList(1, 4);

    System.out.println("前"+list);
    System.out.println("sub后"+sub);

    System.out.println("开始add------");
    list.add("IG");

    System.out.println("前"+list);
    System.out.println("sub后"+sub);
}
           
王思聪VS张康阳:创业更比守业难?

 分析原因:

点开ArrayList里的subList方法,返回一个内部类SubList

内部类SubList继承AbstractList,ArrayList也继承AbstractList

又因为AbstractList中有modCount成员变量

因此ArrayList和SubList都各自持有modCount的一个副本

public List<E> subList(int fromIndex, int toIndex) {
    subListRangeCheck(fromIndex, toIndex, size);
    return new SubList(this, 0, fromIndex, toIndex);
}

private class SubList extends AbstractList<E> implements RandomAccess {
    private final AbstractList<E> parent;
    private final int parentOffset;
    private final int offset;
    int size;

    SubList(AbstractList<E> parent,
            int offset, int fromIndex, int toIndex) {
        this.parent = parent;
        this.parentOffset = fromIndex;
        this.offset = offset + fromIndex;
        this.size = toIndex - fromIndex;
        this.modCount = ArrayList.this.modCount;
    }
}

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    protected transient int modCount = 0;
}
           

ArrayList方面

 当ArrayList进行add的时候 ensureCapacityInternal方法使 modCount自增1

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}


private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}


private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
           

SubList方面

SubList进行打印的时候,默认调用了toString方法,通过一系列的方法调用,最后落到ArrayList的modCount和SubList的modCount对比上,

已知ArrayList的modCount因为add()自增1,SubList的modCount仍保持初始值0,在这里就会抛出ConcurrentModificationException

public String toString() {
    Iterator<E> it = iterator();
}

public Iterator<E> iterator() {
    return listIterator();
}

public ListIterator<E> listIterator(final int index) {
    checkForComodification();
}

private void checkForComodification() {
    if (ArrayList.this.modCount != this.modCount)
        throw new ConcurrentModificationException();
}
           

ArrayList的modCount和SubList的modCount不同,导致异常的抛出。回到话题,小王成长于互联网发展的时代,经受新鲜事物的洗礼,当上一辈的人把电子游戏视为洪水猛兽的时候,小王已然取得了游戏排位赛里的连续胜利。不同的思考方式,注定会做出不一样的事情,只有最符合时代要求的思考才能胜出。对于以上的异常代码,只要把list.add改为sub.list就可以了,让专业的人做专业的事。

public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        list.add("11");
        list.add("22");
        list.add("33");
        list.add("44");

        List<String> sub = list.subList(1, 4);

        System.out.println("前"+list);
        System.out.println("sub后"+sub);

        System.out.println("开始add------");
        sub.add("IG");

        System.out.println("前"+list);
        System.out.println("sub后"+sub);
    }
           
王思聪VS张康阳:创业更比守业难?

张康阳-Arrays.asList

Arrays的asList方法的作用是数组转list,Arrays的asList方法中,返回值是Arrays的内部类ArrayList

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
           

打开内部类ArrayList我们看到,ArrayList的有参构造方法的参数是引用类型,这就说明了两点:

1.数值转list,数值内的元素类型应为引用类型

2.转成的list内部仍持有原数组的引用,这样修改原数组的值,仍能在list中体现

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
{
    private final E[] a;

    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);
    }
}
           

这就像张近东投资国米,张康阳出任国米主席。企业管理是张近东的强项,张康阳可以获得更多的资源,张父对儿子的期望是守业,而观众更希望看到开创事业的惊心动魄,那么根据这种需求进行如下代码模拟:

数组转list后,list通过add方法添加新元素,结果报错

public class TestAsList1 {
    public static void main(String[] args) {
        String[] obi = {"11","22"};
        List<String> arr = Arrays.asList(obi);
        System.out.println("守业:"+arr.contains("11"));

        arr.add("新事业");
        System.out.println("创业:"+arr.contains("新事业"));
    }

}
           
王思聪VS张康阳:创业更比守业难?

这是因为内部类ArrayList中没有add方法, 内部类ArrayList只是持有对原数组的引用,可以对原数组已有的元素进行修改,如果需要添加元素,必须在转化之前,对原数组进行扩容添加元素。

无论是创业还是守业,都没有对错之分,富二代们的选择本来就很多,也不是我们能操心得了的。最后一首歌词做结:

《沧海一声笑》

沧海笑 滔滔两岸潮

浮沉随浪记今朝

苍天笑 纷纷世上潮

谁负谁胜出 天知晓

江山笑 烟雨遥

涛浪淘尽红尘俗世知多少

清风笑 竟惹寂寥

豪情还剩了一襟晚照

苍生笑 不再寂寥

豪情仍在痴痴笑笑

王思聪VS张康阳:创业更比守业难?