数组,是最简单的数据结构,是一种用来存储多个数据的容器.
数据结构:
把多个数据按照一定的存储方式,存储起来,称存储方式之为数据结构.
数据的存储方式有很多,数组,队列,链表,栈,哈希表等等.
不同的数据结构,性能是不一样的,比如有的插入比较快,查询比较快,但是删除比较慢.
有的删除比较快,插入比较快,但是查询比较慢.
根据实际操作,合理选择即可
集合
- 集合和数组的区别
数组和集合类都是容器
数组长度是固定的,集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象, 数组中存储数据类型是单一的,数组一旦初始化,长度固定,且操作复杂GURD,集合中可以存储任意类型的对象。
集合类的特点
用于存储对象,长度是可变的,可以存储不同类型的对象。
数组的特点:
1. 只能存储同一种数据类型的数据。
2. 一旦初始化,长度固定。
3. 数组中的元素与元素之间的内存地址是连续的
4.Object类型的数组可以存储任意类型的数据
注意: 集合和数组中存储都是对象的引用,而不是对象本身
- 集合的分类
- Collection: 单列集合
- 1.List:
如果是实现了List接口的集合类,具备的特点: 有序,可重复;只有List接口下面的集合类才具备索引值。其他接口下面的集合类都没有索引值
- 1.1.ArrayList:
底层是维护了一个Object数组实现 的, 特点: 查询速度快,增删慢。
什么时候使用ArrayList: 如果目前的数据是查询比较多,增删比较少的时候,那么就使用ArrayList存储这批数据。
注意: 当使用无参构造函数时,Object数组默认的容量是10,当长度不够时,自动增长0.5倍。
- 1.2.LinkedList:
底层是使用了链表数据结构实现的, 特点: 查询速度慢,增删快
由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高但查询时需要一个一个的遍历, 所以效率较低
- 1.3.Vector:
和ArrayList原理相同,底层也是维护了一个Object的数组实现的, 但Vector是线程安全的, 效率略低, , 考虑了线程安全问题, 所以效率略低
- 2.Set:
如果是实现了Set接口的集合类,具备特点: 无序,不可重复。
- 2.1HashSet
底层是使用了哈希表来支持的,特点: 存取速度快.
hashSet的实现原理:
往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。
情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。
情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行 添加。
- 2.2TreeSet
TreeSet低城是使用红黑树(二叉树)数据结构实现的,存储规则:左小到右,
TreeSet要注意的事项:
(1). 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
(2). 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。
(3). 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加.(注意:TreeSet与HashCode、equals方法是没有任何关系。)
(4). 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序 的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
(5). 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器那么是以比较器的比较规则优先使用。
自定义定义比较器: 自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare方法内即可。
自定义比较器的格式 :
} ```
注意:TreeSet可对String排序(有默认顺序),
字符串的比较规则:
情况一: 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。
情况 二:对应位置上 的字符都一样,比较的就是字符串的长度。
推荐使用:使用比较器(Comparator)。
- 2.3LinkedHashSet
- Map: 键值对
- HashMap
- TreeMap
- HashTable
- LinkedHashMap
- Collection接口
>Collection是单例集合的跟接口,一个Collection代表一组Object,即Collection的元素(Elements)。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
- Map接口
- Iterator迭代器
>主要用于遍历集合对象,Jdk1.5之后添加的新接口, Collection的父接口. 实现了Iterable接口的类就是可迭代的.并且支持增强for循环。该接口只有一个方法即获取迭代器的方法iterator()可以获取每个容器自身的迭代器Iterator。(Collection)集合容器都需要获取迭代器(Iterator)于是在5.0后又进行了抽取将获取容器迭代器的iterator()方法放入到了Iterable接口中。Collection接口进程了Iterable,所以Collection体系都具备获取自身迭代器的方法,只不过每个子类集合都进行了重写(因为数据结构不同)
- Iterator接口定义的方法
>Itreator 该接口是集合的迭代器接口类
定义了常见的迭代方法
1:boolean hasNext()
判断集合中是否有元素,如果有元素可以迭代,就返回true。
2: E next()
返回迭代的下一个元素,注意:如果没有下一个元素时,调用
next元素会抛出NoSuchElementException
3: voidremove()
从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操
作)。
- List特有的迭代器ListIterator
>Iterator在迭代时,只能对元素进行获取(next())和删除(remove())的操作。
对于Iterator 的子接口ListIterator在迭代list集合时,还可以对元素进行添加(add(obj)),修改set(obj)的操作。
定义一下特有方法
1. add(E e)
将指定的元素插入列表(可选操作)。该元素直接插入到返回的下一个元素的前面(如果有)
2.void set(E o)
用指定元素替换 next或 previous返回的最后一个元素
3.hasPrevious()
逆向遍历列表,列表迭代器有多个元素,则返回true。
4.previous()
返回列表中的前一个元素。
- 泛型