热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java类创建自身对象(java类里面初始化自身)

Vector源码解析老样子,话不多说先上一张UML类图Vector的初始化构造方法无参构造(默认调用初始化容量的构造方法,默认容量为10)publicVector({这里会


00-1010和之前一样,所以我们先来看前面的UML类图。






向量的初始化构造方法


无参数构造(默认调用初始化容量的构造方法,默认容量为10)


public Vector(){ 0


//这里将调用带有容量参数的Vector的构造函数方法。默认容量为10。


//在这里,与ArrayList不同,ArrayList在调用add方法之前不会初始化容量。


这(10);


}


指定初始化容量大小。


公共向量(int initial Capacity){ 0


//这里,调用下面指定的初始化容量和增长系数的构造方法。默认增长系数为0。


这(initialCapacity,0);


}


指定初始容量和增长系数


公共向量(整数容量,整数容量)


super();


//容量不能小于0


if(初始电容0)


引发新的IllegalArgumentException('非法容量: '


initial capacity);


//指定对象数组的初始化容量


this.elementData=新对象[initial capacity];


//设置生长因子


this . capacity increment=capacity increment;


}


使用另一个集合来构造集合。


公共向量(集合?扩展了E(c){ 0


//将传入集合转换为数组


element data=c . to array();


//Vector的元素个数是集合的长度。


element count=element data . length;


//c.toArray可能(错误地)不会返回Object[](参见6260652)


//确定添加的元素对象是否为对象数组类型。


if (elementData.getClass()!=对象[]。类)


//制作一个浅拷贝,将类型转换为对象数组。


element data=arrays . copy of(element data,elementCount,Object[])。类);


}


Add(E e)方法公共同步布尔add(E E){ 0


//更新操作的次数


modCount


//保证元素的容量可以节省,必要时可以扩容。


ensureCapacityHelper(element count 1);


element data[element count]=e;


返回真;


}


//如有必要,增加当前数组的容量,以确保至少可以保存minCapacity capacity参数指定的元素数量。


私有void ensureCapacityHelper(int minCapacity){ 0


//有溢出意识的代码


if(MinCapacity-ElEMENTDATa . length 0)


//矢量的//容量扩展方法


增长(最小容量);


}


//容量扩展方法


私有void grow(int MinCapability){ 0


//有溢出意识的代码


//原始矢量容量值


int old capacity=element data . length;


//如果为capacityIncrement设置了增长系数,则添加系数值以扩展容量,否则,将原始阵列容量更改为2*oldCapacity。


int new capacity=old capacity((capacity increment 0)?


capacity increment : old capacity);


//如果复位容量值小于最小要求容量值。


if(新容量-最小容量

ty <0)
//就将最小的容量值赋值给新的容量
newCapacity = minCapacity;
//如果新容量值比限制的最大容量还要大的话
if (newCapacity - MAX_ARRAY_SIZE > 0)
//重新设置大小
newCapacity = hugeCapacity(minCapacity);
//将原先数组的元素浅拷贝到一个新的数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
//获取最大容量
private static int hugeCapacity(int minCapacity) {
if (minCapacity <0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}

add(int index, E element)方法(指定位置添加元素)

public void add(int index, E element) {
insertElementAt(element, index);
}
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
//如上确保容量
ensureCapacityHelper(elementCount + 1);
//将指定索引到末尾的元素分别往左移动一位
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}

addAll(Collection c)方法

public synchronized boolean addAll(Collection c) {
//更新操作次数
modCount++;
//将传入的集合转为数组
Object[] a = c.toArray();
//获取传入集合的长度
int numNew = a.length;
//如上确保容量
ensureCapacityHelper(elementCount + numNew);
//将指定索引到末尾的元素分别往左移动一位
System.arraycopy(a, 0, elementData, elementCount, numNew);
//集合的大小为旧集合的大小+新集合的大小
elementCount += numNew;
return numNew != 0;
}
remove(int index)方法public synchronized E remove(int index) {
modCount++;
//对index进行边界检查
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
//获取要删除坐标的元素
E oldValue = elementData(index);
//计算指定索引与末尾元素的个数
int numMoved = elementCount - index - 1;
//如果个数大于0
if (numMoved > 0)
//将指定索引到末尾的元素分别往左移动一位
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//递减元素个数,并将末尾元素置空
elementData[--elementCount] = null; // Let gc do its work
return oldValue;
}

remove(Object o)方法

public boolean remove(Object o) {
//调用removeElement(Object obj)方法
return removeElement(o);
}
public synchronized boolean removeElement(Object obj) {
//更新操作次数
modCount++;
//得到要删除元素的坐标
int i = indexOf(obj);
if (i >= 0) {
//根据坐标删除元素
removeElementAt(i);
return true;
}
return false;
}
public synchronized void removeElementAt(int index) {
modCount++;
//对index进行边界检查
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index <0) {
throw new ArrayIndexOutOfBoundsException(index);
}
//计算指定索引与末尾元素的个数
int j = elementCount - index - 1;
if (j > 0) {
//将指定索引到末尾的元素分别往左移动一位
System.arraycopy(elementData, index + 1, elementData, index, j);
}
//减少集合容量
elementCount--;
//递减元素个数,并将末尾元素置空
elementData[elementCount] = null; /* to let gc do its work */
}

removeAll(Collection c)方法

//删除指定集合中的所有元素
public synchronized boolean removeAll(Collection c) {
//调用AbstractCollection中的removeAll的方法
return super.removeAll(c);
}

retainAll(Collection c)方法

//删除非集合c中的元素
public synchronized boolean retainAll(Collection c) {
return super.retainAll(c);
}

clear()方法

public void clear() {
//清空集合方法调用上面removeAllElements方法
removeAllElements();
}
get(int index)方法public synchronized E get(int index) {
//对index进行边界检查
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
//根据下标获取元素
return elementData(index);
}
E elementData(int index) {
//在数组中根据下标获取元素
return (E) elementData[index];
}
set(int index, E element)方法public synchronized E set(int index, E element) {
//对index进行边界检查
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
//获取index坐标的元素
E oldValue = elementData(index);
//将set的元素放入数组指定下标
elementData[index] = element;
return oldValue;
}

总结:

Vector是使用数组保存数据,和ArrayList一样在无参的构造方法中,默认的初始容量为10,增长系数为0比ArrayList多了一个增长系数的概念Vector类是线程安全的List,其底层是通过Synchronized关键字实现的(同步方法),ArrayList是线程不安全的扩容机制:如果增长系数不位 0 那么就是当前容量 + 增长系数,否则就是2倍,ArrayList为1.5倍左右
推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • 本文整理了Java中org.apache.ibatis.mapping.ParameterMapping.getNumericScale()方法的一些代码示例,展示了 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
author-avatar
n张家珲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有