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);
}
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYTMfhHLlN3XnxCM38FdsYkRGZkRG9lcvx2bjxCMy8VZ6l2csYXZMZzcXlVNz0SW1ITdaZTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxczM1AzMxUTMwMDOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
分析原因:
点开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);
}
张康阳-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("新事业"));
}
}
这是因为内部类ArrayList中没有add方法, 内部类ArrayList只是持有对原数组的引用,可以对原数组已有的元素进行修改,如果需要添加元素,必须在转化之前,对原数组进行扩容添加元素。
无论是创业还是守业,都没有对错之分,富二代们的选择本来就很多,也不是我们能操心得了的。最后一首歌词做结:
《沧海一声笑》
沧海笑 滔滔两岸潮
浮沉随浪记今朝
苍天笑 纷纷世上潮
谁负谁胜出 天知晓
江山笑 烟雨遥
涛浪淘尽红尘俗世知多少
清风笑 竟惹寂寥
豪情还剩了一襟晚照
苍生笑 不再寂寥
豪情仍在痴痴笑笑