Java集合合集

1 篇文章 0 订阅
1 篇文章 0 订阅
本文详细介绍了Java集合框架中的泛型概念及其使用,包括泛型的类型检查和擦除机制。此外,讲解了ArrayList的创建、元素操作以及包装类的自动装箱与拆箱原理。还探讨了Integer对象的缓存特性,以及在特定条件下对象相等性的判断。最后,简要展示了List接口的常用方法和迭代器的使用。
摘要由CSDN通过智能技术生成

Java集合合集

预备知识

泛型的意义

试想一下我们如何实现一个能传入任意类型数据的顺序表?

  1. 可以把顺序表的参数类型设置成Object类型进行传入数据,但是在取出数据时需要进行强转,所以取出时需要知道取出的类型具体是什么,所以这种方法并不好
  2. 使用泛型实现
class MyArrayList<T>{//这个T代表占位符,也可以是其他字母
	public T[] elem;
    public int size;
    public MyArrayList(){
    	this.elem = new (T[])Object[10];
        //不可以写成this.elem = new T[10],因为不能new范型类型的数组;
        this.size = 0;
    }
    ......
}
public class main{
	public static void main(String[] args){
    	MyArrayList<Integer> l1 = new MyArrayList<>();
        MyArrayList<String> l1 = new MyArrayList<>();
        MyArrayList<Double> l1 = new MyArrayList<>();
        ......
    }
}

意义

  1. 可以自动进行类型检查
  2. 取元素时自动类型转换
一些问题
  1. 在使用时传入的类型不可以是简单数据类型,如:int,double,float...
  2. 泛型的擦除机制:
    1. 泛型在编译的时候,并不会进行指定类型的替换,而是拿着指定的类型进行检查,也就是说,在编译时,拿着你指定的类型进行类型检查,而不是替换
    2. 编译的时候会进行类型擦除,编译是会把泛型都擦除为Object类型,在取出元素是帮你自动做类型转换
  3. 不能new泛型类型的数组
  4. 泛型类型的参数不参与泛型类型的组成 ArrayList<String> arr = new ArrayList<>() 其中arr的类型是ArrayList类型,而不是ArrayList<String>类型
包装类
  1. 装包/装箱
    1. 自动装包
      1. int a = 10; Integer a1 = a;
    2. 显示装包:
      1. int a = 10; Integer a1 = new Integer(a);
      2. int a = 10;Integer a2 = Integer.valueof(a);
  2. 拆包/拆箱
    1. 自动拆包
      1. Integer i = 10;a = i;
    2. 显示拆包
      1. Integer i = 10;int a = i.intValue();

问题
下面程序的输出结果是什么?

Integer a = 100;
Integer b = 100;
Integer c = 130;
Integer d = 130;

sout(a == b);
sout(c == d);

输出结果:
true
false好冷啊

由查看源码可知
当Integer的值在-127-127之间,会从源码中的一个缓存数组中返回值
当不再此范围之内,会new一个Integer对象并返回,上面这种赋值方式会默认调用valueOf方法赋值
在这里插入图片描述

List

用法
ArrayList
  1. 创建线性表:
    1. List<Integer> l = new ArrayList<>();
    2. 当第一次调用new ArrayList<>();里面的大小默认是10,后续进行扩容是进行1.5倍方法扩容
  2. 添加元素:
    1. l.add(10);l.add(20); 通过尾插法插入元素
    2. l.add(1,30);插入元素到指定下标位置
    3. l.addAll();
  3. 删除元素:
    1. list.remove(1)//删除1下表的元素
    2. Integer l= 1;``list.reoove(l);删除值为1的元素
  4. 修改元素:
    1. list.set(0,19);把0下标的元素改为19
  5. 取指定范围:(慎用,若修改新的list1,list的值也会变)
    1. List<Integer> list1 = list.subList(1,3);把1-3的值取到list1中,属于浅拷贝
迭代器

可以用来遍历所有的集合(对于list还可以用forEach或for循环进行遍历)

Iterator<Integer> iter = list.iterator();
while(iterator.hasNext()){
	System.out.println(iterator.next());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值