Collection的子接口之一:List
- Collection接口:单列集合,用来存储一个一个的接口
- List接口:存储有序的、可重复的数据 --->动态数组
- ArrayList:
- Linkedlist:
- Vector:
- Set接口:存储无序的、不可重复的数据 ---->高中讲的"集合"
- HashSet:
- LinkedHashSet:
- TreeSet:
- HashSet:
- List接口:存储有序的、可重复的数据 --->动态数组
- Map接口:双列集合,用来存储一对(key - value)一对的数据 --->高中函数:y=f(x)
- HashMap:
- LinkedHashMap:
- TreeMap:
- Hashtable:
- Properties:
Collection接口:单列集合,用来存储一个一个的对象
List接口:存储有序的,可重复的数据。 “动态”数组,替換原有的数组
Arraylist:作为ist接中的主要实现类:线程不安全的,效率高;底层使用Object[] elementData存储
Arraylist的源码分析:
jdk 7情况下:
ArrayList List = new Arraylist();//底层创建了长度是10的Object[]数组elementData
list.add(123);//elementData [0] = new Integer(123);
list.add(11);//如果此次的添加导致底层eLementData教组容量不够,则扩容。默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
结论:建议开发中使用带参的构进器: Arraylist List = new Arraylist(int capacity)
jdk 8中ArrayList的变化:
ArrayList list = new ArrayList();//底层Object[] elementDeta初始化为{},并没有创建 长度为10的Object数组
list.add(123);//第一次调用add()时,底层才创建了长度10的Object数组,并将数据123添加到elementData[0]
后续的添加和扩容操作与jdk 7无异
小结:jdk 7中ArrayList的创建类似于单例的饿汉式,而jdk 8中ArrayList的对象创建类似于懒汉式,延迟了数组的创建,节省内存。
Linkedlist: 对于频繁的插入、删除操作,使用此类效率EHCArraylist高; 底层使用双向链表存储
LinkedList list = new linkedList(); 内部声明了Node类型的First和Last属性,默认为null
list.add(123);将123封装到Node中,创建了Node对象。
其中Nude定义为:
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next){
this. item = eLement;
this.next = next;
this.prev = prev;
}
}
Vector: 作为list接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储
Vector的源码分析:jdk7和jdk8中通过Vector()构造器创建对象是,底层都创建了长度为10的Object数组,在扩容方面默认扩容为原来的数组长度的2倍。
面试题:ArrayList、LinkedList、Vector三者的异同?
同:三个类都是实现了List接口,存储数据的特点相同,存储有序的、可重复的数据
不同:见上
List的常用方法:
void add(int index, 0bject ele): 在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index): 获取指定index位置的元素int index0f(object obj): 返回bj在集合中首次出现的位置
int lostIndex0f(object obj):返回obj在当前集合中首次出现的位置
object remove(int index):移除指定index位置的元素,并返回此元素
object set(int index, object ele): 设置指定index位置的元素为ele
eleList sublist(int fromIndex, int toIndex): 返回从fromIndex到toIndex位置的子集合
static void test1(){ ArrayList list = new ArrayList(); list.add(123); list.add(456); list.add("牛马"); list.add(new Person("张三",50)); list.add(456); System.out.println(list); //void add(int index,Object ele):在index位置插入ele元素 list.add(1,"bb"); System.out.println(list); //boolean addAll(int index,Collection eles):从index位置开始将eles中的所以元素添加进来 list.addAll(3,Arrays.asList(666,"黑手")); System.out.println(list); System.out.println(list.size()); //Object get(int index);获取指定index位置的元素 System.out.println(list.get(5)); //int indexOf(Object obj):返回obj在集合中首次出现的位置 System.out.println(list.indexOf(456)); //int lastIndexOf(Object obj):返回boj在当前集合中最后一次出现的位置 System.out.println(list.lastIndexOf(456)); //Object remove(int index):溢出指定位置的元素,并返回此元素 System.out.println(list.remove(4)); System.out.println(list); //Object set(int index,Object ele):设置指定index位置的元素为ele,返回值是index未更改前的元素 System.out.println(list.set(5,"黑手")); System.out.println(list); //list sublist(int fromIndex,int toIndex):返回fromIndex到toIndex位置的左闭右开子集合 System.out.println(list.subList(2,5)); }
总结:常用方法
增:add(Object obj)
删:remove(int index)/remove(Object boj)
改:set(int index,Object ele)
查:get(int index)
插:add(int index,Object ele)
长度:size()
遍历:①:Iteratar迭代器方式
②:增强for循环
③:普通的循环
static void test(){ ArrayList list = new ArrayList(); list.add(123); list.add(456); list.add("牛马"); list.add(new Person("张三",50)); list.add(456); //方式一:iterator迭代器 Iterator iterator = list.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } //方式二:增强for循环 for (Object obj : list){ System.out.println(obj); } //方式三:普通for循环 for (int i=0; i < list.size();i++){ System.out.println(list.get(i)); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)