arraylist

手工实现一个Arraylist类

本小妞迷上赌 提交于 2020-03-01 20:53:26
public class xjhArrayList < E > { private Object [ ] elementData ; //定义一个数组,底层 private int size = 0 ; //表示目前容器内元素的个数 private static final int DEFAULT_SIZE = 10 ; //数组默认大小 public xjhArrayList ( ) { //无参构造 elementData = new Object [ DEFAULT_SIZE ] ; } public xjhArrayList ( int capacity ) { //有参构造,自定义初始数组大小 if ( capacity < 0 ) { throw new RuntimeException ( "容器大小不能为负数" ) ; } else { elementData = new Object [ capacity ] ; size = capacity ; } } public void add ( E e ) { if ( size == elementData . length ) { //当添加的元素个数超过原始数组大小时进行扩容操作 Object [ ] newArray = new Object [ elementData . length << 1 ] ; /

java大文件分块上传断点续传demo

房东的猫 提交于 2020-03-01 20:52:25
第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null ; String newpathname = null ; String fileAddre = "/numUp" ; try { InputStream stream = file.getInputStream(); // 把文件读入 String filePath = request.getRealPath(fileAddre); // 取系统当前路径 File file1 = new File(filePath); // 添加了自动创建目录的功能 ((File)file1).mkdir(); newfileName = System.currentTimeMillis() + file.getFileName().substring( file.getFileName().lastIndexOf( '.' )); ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream bos = new FileOutputStream(filePath + "/" + newfileName); newpathname = filePath + "/"

java之电话本管理系统List实现

坚强是说给别人听的谎言 提交于 2020-03-01 20:21:21
使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList; List < String > l = new ArrayList < String > ( ) ; // 利用ArrayList类实例化List集合 本项目Persons为实体类,PhoneBooks为实现类; Persons.java import java . util . ArrayList ; import java . util . List ; import java . util . Scanner ; public class Persons { private String name ; private String sex ; private String phonenum ; private String age ; private String qq ; private String address ; Scanner sc = new Scanner ( System . in ) ; public Persons addPerson ( ) { Persons person = new Persons ( ) ; System . out . println ( "输入姓名:" ) ; String name = sc . next ( ) ;

CopyOnWriteArrayList

天涯浪子 提交于 2020-03-01 15:47:54
除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的)。 先回顾一下一个常识: 1、JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对象,一个线程获取这个引用指向的对象,那么他们之间不会发生ConcurrentModificationException,他们是在虚拟机层面阻塞的,而且速度非常快,几乎不需要CPU时间。 2、JAVA中两个不同的引用指向同一个对象,当第一个引用指向另外一个对象时,第二个引用还将保持原来的对象。 基于上面这个常识,我们再来探讨下面这个问题: 在CopyOnWriteArrayList里处理写操作(包括add、remove、set等)是先将原始的数据通过JDK1.6的Arrays.copyof()来生成一份新的数组 然后在新的数据对象上进行写,写完后再将原来的引用指向到当前这个数据对象(这里应用了常识1),这样保证了每次写都是在新的对象上(因为要保证写的一致性,这里要对各种写操作要加一把锁,JDK1.6在这里用了重入锁), 然后读的时候就是在引用的当前对象上进行读(包括get,iterator等),不存在加锁和阻塞,针对iterator使用了一个叫COWIterator的阉割版迭代器,因为不支持写操作,当获取CopyOnWriteArrayList的迭代器时

Android TagFlowLayout布局实现

假如想象 提交于 2020-03-01 14:02:21
一、简 介 由于移动互联网的发展,大数据技术的进步,app厂商或者犯罪分子会推广你喜欢的内容或者广告。对于各种类型的需求,通过关系数据库心亦不能满足需要,这种情况通过nosql数据库来存储用户兴趣。对于用户兴趣的标注,就是通过tag或者cookie等实现。在这方面,客户端需求也是很大,无论是供应链、内容还是地理定位,都有很大的需求。 这种标记方式比较常用 二、代码实现 public class TagFlowLayout extends ViewGroup { private final static String TAG = "TagFlowLayout"; //自定义属性 private int spacingBetweenItems; private int lineSpacing; private OnItemSelectedListener mOnItemSelectedListener; private OnItemRemovedlistener mOnItemRemovedListener; public TagFlowLayout(Context context) { this(context, null); } public TagFlowLayout(Context context, AttributeSet attrs) { this(context,

ArrayList底层实现原理

浪尽此生 提交于 2020-03-01 11:06:48
ArrayList底层实现原理 ArrayList 的实现原理 ArrayList 概述 ArrayList 可以理解为动态数组,用 MSDN 中的说法,就是 Array 的复杂版本。与 Java 中的数组相比,它的容量能动态增长。ArrayList 是 List 接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。) 每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造 ArrayList 时指定其容量。在添加大量元素前,应用程序也可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量,这可以减少递增式再分配的数量。 注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)

java集合相关

ε祈祈猫儿з 提交于 2020-03-01 11:02:27
List,Set,Map三者的区别? List:List接口存储一组不唯一的有序对象,可以多个元素引用相同的对象。 Set:不允许重复的集合,不会多个元素指向一个对象。 Map:使用键值对来进行存储,Map会去维护与 Key 相关联的 值 ,两个Key可以引用相同的对象,但Key不能重复,一般常见的Key是String类型,也可以是任何对象。 ArrayList和LinkedList的区别 线程安全:都是不同步的,都不能保证线程的安全的 底层结构: ArrayList 底层使用的是Object类型的数组, LinkedList 底层使用 双向链表 数据结构(此处应该注意jdk1.6之前用的是循环链表,jdk1.7取消了循环) 对元素进行删除和插入: ArrayList采用数组存储,所以插入和删除元素的时间复杂程度会受元素位置的影响,直接使用add()方法会默认将元素追加到列表的末尾,但是如果需要在==指定位置 #8BC34A==插入某个元素的话,时间复杂程度就会变得很高了 LinkedList采用链表存储,所以插入和删除元素是不受元素位置影响的 快速访问:LinkedList 不支持高效率的随机访问。而ArrayList支持,也就是可以通过获取元素下标来快速获取元素对象。 内存比较:ArrayList 的空间浪费主要体现在list列表的结尾会预留一定的空间

Java基础知识_List集合

穿精又带淫゛_ 提交于 2020-03-01 11:02:07
一、ArrayList解析 首先我们来讲解的是ArrayList集合,它是我们用的非常多的一个集合 首先我们来讲解的是ArrayList集合,它是我们用的非常多的一个集合 首先我们来看一下ArrayList的属性 DEFAULT_CAPACITY是初始化容量 EMPTY_ELEMENTDATA是指定该ArrayList的容量为0时,返回空数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA它与上面的区别是,该数组是默认返回的,而后者是在用户指定的容量为0时返回。 elementData保存添加ArrayList的元素 size是ArrayList的实际大小 根据上面我们可以发现,Array List底层其实就是一个数组,ArrayList有扩容这个概念,正因为它扩容,所以可以实现动态增长。 1.2 构造方法 我们来看看构造方法来印证我们上面说的对不对: 如果指定了容量,那么数组就初始化成对应的容量,否则返回的是DEFAULTCAPACITY_EMPTY_ELEMENTDATA 1.3 Add方法 add方法可以说是ArrayList比较重要的方法了,我们来总览一下 1.3.1 add(E e) 步骤:   检查是否需要扩容   插入元素 首先,我们来看这个方法 1 public boolean add(E e) { 2

Java中Vector和ArrayList的区别

风流意气都作罢 提交于 2020-03-01 10:52:57
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下: ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。 LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。 查看Java源代码,发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不同。 ArrayList中: 1 public

树—最“有套路”的数据结构

ぃ、小莉子 提交于 2020-03-01 09:41:13
前言 标题用“有套路”来形容一种数据结构,似乎有点不尊重的意思。不过,我倒是觉得,一种实用的学科,就是应该产生一点套路,这才能发挥体系化研究的优势,套路就是一种保证: 在不投入更多创造性与努力的情况下,依旧能获得比起随意进行相关操作更好的结果 。一门成熟的学科都应如是,如果研究许久,在学科所研究的许多问题的实践上还不如一些“天赋”“灵感”,那就不得不说这门学科的“伪科学”或者“水分”还是蛮大的了。 言归正传,这篇文章将会是一系列寻找算法与数据结构的文章的开篇,树由于其特性,是递归、分治等等重要算法思想的典型载体,同时套路性较强又具有一定规律和难度,上手后,也可以获得总结其他算法“套路”的必要经验。作为一个训练的开头,还是很合适了。 树的定义与理解 先简要谈谈树的抽象定义:树本质上是一种无向图( 图:由顶点与路径构成的数据结构 ),其中,任意两个顶点之间 有且只有一条 路径。简而言之,树是一种具有特殊性质的图。 树的结构非常直观,而且树的大多数结构具有一个重要性质: 递归 。主要来说,就是树具有某一性质时,往往其子树也具有同样的性质。比如说,一个树如果是二叉搜索树,其子树也必须是二叉搜索树。 根据这样的性质,遇到树的问题,很自然会考虑如何合理使用递归算法,其实质就是:分解为子问题,最后解决基本情况,把复杂的递归过程交给计算机来处理。所以,树类型代码的特点就是简洁(不过换句话说