集合
集合与数组之间的区别
共同点:存储多个数据
异同点
数组的特点:
- 是一种引用数据类型,数据是对象数据,是一段连续的内存空间
2.定长,长度一旦确定不可改变
3.所有数据类型相同
4.有序,有索引,根据索引进行操作
集合
1.是一种引用数据类型,数据是对象数据
2.不是定长,长度根据跟随需求对数据进行增删而动态改变
3.可以存储任意引用数据类型
4.有些集合有索引,根据根据索引进行操作,有些集合类型不能跟随索引进行操作
自定义容器类型
public static void main(String[] args) {
//创建一个容器实例 MyContainer my = new MyContainer(); //存储数据 System.out.println(my.size()); my.add("aaa"); System.out.println(my.size()); my.add("bbb"); System.out.println(my.size()); my.add("ccc"); System.out.println(my.size()); System.out.println(my.get(0)); System.out.println(my.get(1)); System.out.println(my.get(2)); System.out.println(my); } } //自定义容器类型 class MyContainer{
//底层存储数据的结构 private String[] elementData; //记录集合中已存储的数据个数 private int size; public MyContainer() {
} / * 追加数据 * @param value 要添加的数据 */ public void add(String value) {
//判断是否是第一次添加 if(elementData==null && size==0){
//如果是第一次 //1)创建新数组 elementData = new String[1]; //2)value添加到数组中 elementData[0] = value; //3)size+1 size++; return; } //如果不是第一次添加 //1)记录原数组地址 String[] temp = elementData; //2)创建新数组 elementData = new String[size+1]; //3)拷贝数据 //i作为原数组与新数组的索引 for(int i=0;i<size;i++){
elementData[i] = temp[i]; } //4)value添加到数组中 elementData[size] = value; //5)size+1 size++; } / * 根据索引获取数据 * @param index 索引 * @return 对应索引位置的数 */ public String get(int index){
if(index<0 || index>=size){
throw new IndexOutOfBoundsException(index+"索引越界了...."); } return elementData[index]; } / * 返回集合中数据的个数 * @return 已存储的数据个数 */ public int size(){
return size; } @Override public String toString() {
return Arrays.toString(elementData); } }
讯享网
Collection
Collection:集合层次结构中的根接口。集合表示一组对象,称为其元素
常用方法:
遍历方式:
- foreach
- iterator迭代器
讯享网 //foreach for (Object o : col1) {
System.out.println(o); } //iterator :迭代器 //1)获取迭代器对象(用来遍历指定集合的迭代器实例) Iterator it = col1.iterator(); //2)判断是否存在下一个元素 while(it.hasNext()){
//3)获取下一个元素 System.out.println(it.next()); }
Set 和 List
set:无序的,不可重复,不可根据索引进行操作
list:有序的,可重复的,可以根据索引进行操作
新增方法
增加了一些与索引操作相关的方法
list集合的遍历方式:
for
foreach
iterator
listiterator
泛型
语法:
<参数类型>
位置:在自定义的时候,如果允许使用泛型,在使用这个类型的时可以为泛型参数具体的数据类型
优点:
规范类型,避免类型转换异常的出现
可以增强程序的稳定性与可读性
便于后期维护
注意:
通过泛型传递数据类型只能传递引用数据类型
ArrayList
List 接口实现类 :
有序的,可重复,可以根据索引进行操作
ArrayList* :
底层结构 数组
特点
根据索引做查询效率高 ,做增删效率低,因为涉及到新数组的创建,原数组数据的拷贝
初始容量
private static final int DEFAULT_CAPACITY = 10;
扩容机制:
int newCapacity = oldCapacity + (oldCapacity >> 1); 每次扩容原容量的1.5倍 通过调用Arrays.copyOf方法实现创建新数组+扩容
- [ ] 注意 : 如果某种类型的底层结构为数组,一般就需要关注初始容量与扩容机制
Vector 与 ArrayList 的区别
共同点 :
底层结构都为数组,特点相同
异同点 :
1.同步问题|线程安全问题
ArrayList是线程不安全|不同步
Vector 是线程安全的,是同步的
如果不需要线程安全实现,建议使用ArrayList代替Vector
2.扩容机制
ArrayList :
初始容量 : 默认10 | 由程序猿自己指定
扩容机制 : 1.5倍
Vector :
初始容量 : 默认10 | 由程序猿自己指定
扩容机制 :
默认扩容原容量的2倍
LinkedList
LinkedList
有序的,可重复,可以根据搜因进行操作的
实现所有可选列表操作,并允许所有元素(包括null )。
底层结构 :
双向链表

特点 :
查询效率低,增删效率高
应用场景 :
适合应用在大量做增删,少量做查询
新增方法 :
遍历方式 :
for foreach iterator listIterator
注意 : 请注意,此实现不同步。
MyLinkedList
set
set :无序的,去重的,最多一个null元素;
无序:
存放的顺序与内部真实存储的顺序不保证一致
新增方法
讯享网static <E> Set<E> of(E... elements) 返回包含任意数量元素的不可修改集。
遍历方式
foreach, iterator
TreeSet
TreeSet:
底层结构:
红黑树(平衡二叉树)
特点
每次过滤一般数据,效率较高,会自动做升序排序;
应用场景:
适合应用在去重的情况下,能够对数据做自动升序排序,相对来说效率较高
新增方法:
新增了一些比较大小相关的方法
遍历
foreach , iterator
请注意,此实现不同步。
定义TreeSet存储字符数据,存储字符数据
根据字符对应的十进制整数确定大小
定义TreeSet,
原因:
TreeSet 会对数据进行默认升序排序,在排序之前就需要先比较大小才能排序,但是TreeSet没有找到对于商品数据的比较规则,就没有办法比较大小,无法排序
解决
内部比较器
内部比较器 | 自然排序 | 自然比较规则|默认比较规则 :
/*这个数据类型实现Comparable<T>接口,重写int compareTo(T o)方法,在方法的内部定义默认比较规则 int compareTo(T o) : 调用compareTo方法能够实现比较大小,实现比较是否相等 两个对象 : x,y 调用 : x.compareTo(y) 返回值 : int类型 0 --> x=y <0 --> x<y >0 --> x>y */
外部比较器
外部比较器|定制排序|自定义比较规则:
定义一个实现类,实现类要求实现Comparator接口,重写int compare(T o1, T o2)方法,方法内部定义比较规则
内部比较器与外部比较器结合使用,可以简化代码并且扩展功能
注意
- TreeSet集合存储数据,根据所存储数据类型的比较规则做去重与排序,跟equals方法无关
- 方法的形参是接口类型,方法的实现就为接口的实现类对象–>接口多态
- 当方法的形参类型为函数式接口类型,方法的实现就可以为lambda表达式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/121816.html