在Java中,集合框架是线性的数据结构。在集合框架中,最常用的是Map List Set。
数组与集合的区别:
数组:保存同一种类型,大小一经给定不能再更改,(可以再新创建一个同一种类型的新数组,保存数据后在赋值给原来需要改变数组的大小的数组);
集合:创建时候可以不需要给定集合 大小,可以保存不同类型的数据(可以混存整形,浮点,对象,字符、字符串等)。
List 接口:
List 接口包含三种子类:ArrayList 、LinkedList和Vector。前两种是异步,意味着是非线程安全,后一种是同步,某种意义上说安全性会更好。
ArrayList采用数组保存元素,意味着当大量添加元素,数组空间不足时,依然需要通过新建数组、内存复制的方式来增加容量,效率较低;而当进行对数组进行插入、删除操作时,又会进行循环移位操作,效率也较低;只有进行按下标查询时(get方法),使用数组效率很高。
LinkedList采用链表保存元素,在添加元素时只需要进行一次简单的内存分配即可,效率较高;进行插入、删除操作时,只需对链表中相邻的元素进行修改即可,效率也很高;但进行按下标查询时,需要对链表进行遍历,效率较低。
ArrayList:
构造ArrayList类有三种方法:
- ArrayList();构造一个初始容量为0 的空链表;
- ArrayList(int initialCapacity);构造一个有指定初始容量的空链表;
- ArrayList(Collection<? extends E> c);构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
下面看看上面的构造方法的却别:
List list=new ArrayList(); List list2=new ArrayList(10); //list添加元素 list.add("jisuanjixueyuan");//添加字符串 list.add(123);//添加整形 list.add('a');//添加字符 list.add(12.12);//浮点型 list.add(new JButton());//添加对象 list.add(2, "gaosi");//插入指定的位置 //list2 添加元素 list2.add("nanhuajisuanjixueyuan");//添加字符串 //打印list的大小 System.out.println("---list_size----"+list.size()); //打印list2 的大小 System.out.println("---list2_size---"+list2.size());
输出结果却是这样的:构造函数时候虽然声明list2 的初始容量,但是输出时候却是按实际大小容量输出。
---list_size----6
---list2_size---1
第三种构造方法:
List list=new ArrayList(); //list添加元素 list.add("jisuanjixueyuan");//添加字符串 list.add(123);//添加整形 list.add('a');//添加字符 list.add(12.12);//浮点型 list.add(new JButton());//添加对象 list.add(2, "gaosi");//插入指定的位置 List list2=new ArrayList(list);//构造含list的list2 //打印list的大小 System.out.println("---list_size----"+list.size()); //打印list2 的大小 System.out.println("---list2_size---"+list2.size()); //遍历list2 并且打印全部元素 for(int i=0;i<list.size();i++){ System.out.println(list2.get(i)); }
输出结果:
---list_size----6
---list2_size---6
jisuanjixueyuan
123
gaosi
a
12.12
javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@11a5ee81,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=,defaultCapable=true]
ArrayList常用的方法:
- add(E e) ;将指定的元素添加到此列表的尾部。
- add(int index, E element) ;将指定的元素插入此列表中的指定位置。
- addAll(Collection<? extends E> c) ; 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
- addAll(int index, Collection<? extends E> c) ;从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。
- get(int index) ; 返回此列表中指定位置上的元素。
- remove(int index) ;移除此列表中指定位置上的元素。
- remove(Object o) ;移除此列表中首次出现的指定元素(如果存在)。
- removeRange(int fromIndex, int toIndex) ; 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
- set(int index, E element) ; 用指定的元素替代此列表中指定位置上的元素。
- indexOf(Object o) ; 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
- lastIndexOf(Object o) ;返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。
- clear() ; 移除此列表中的所有元素。
对比一下添加元素的方法的却别:
主要看一下在一个ArrayList中添加另外一ArrayList的方法:add();与addAll()的区别
List list=new ArrayList(); List list2=new ArrayList(10); //list添加元素 list.add("jisuanjixueyuan");//添加字符串 list.add(123);//添加整形 list.add('a');//添加字符 list.add(12.12);//浮点型 list.add(new JButton());//添加对象 list.add(2, "gaosi");//插入指定的位置 //list2 添加元素 list2.add("nanhuajisuanjixueyuan");//添加字符串 list2.add(312); list2.add(12.34); list2.addAll(1,list);//添加list到list2 的第二个引索处 //打印list2 的大小 System.out.println("---list2_size---"+list2.size()); //遍历list2 并且打印全部元素 for(int i=0;i<list2.size();i++){ System.out.println(list2.get(i)); }
输出结果:
--list2_size---9
nanhuajisuanjixueyuan
jisuanjixueyuan
123
gaosi
a
12.12
javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@6fd90825,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=,defaultCapable=true]
312
12.34
将list添加到list2 的代码改为
list2.add(1,list);//添加list到list2 的第二个引索处
输出结果却是:
---list2_size---4
nanhuajisuanjixueyuan
[jisuanjixueyuan, 123, gaosi, a, 12.12, javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@7d95609,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=,defaultCapable=true]]
312
12.34
细心的朋友就会发现第二种方法与第一种方法的输出结果有点差别:前一种方法是将list的元素一个个输出来,第二种方法却是将list的元素用[]括起来的,当做是一个元素输出来。
移除指定元素得注意:
clear() ;是清除所有的元素
remove(int index);移除指定引索出的元素
remove(Object o) 移除指定对象的元素
还用上面的代码举例,添加了移除的方法
list2.remove((Object)1234);
list2.remove(1234);
当我们要移除一个对象是整形的时候,下面的一种方法必定会出异常,所以我们在移除整形对象的时候要注意将整形转型为对象。
2、 LinkedList
构造方法:
- LinkedList() ; 构造一个空列表。
-
LinkedList(Collection<? extends E> c) ; 构造一个包含指定 collection 中的元素的列表,这些元素 按其 collection 的迭代器返回的顺序排列。
LinkedList 包含大部分 ArrayList的方法 ,但是比ArrayList的方法更加多;
- addFirst(E e) ; 将指定元素插入此列表的开头
- addLast(E e) ; 将指定元素添加到此列表的结尾。
- offerFirst(E e) ; 在此列表的开头插入指定的元素。
- offerLast(E e) ; 在此列表末尾插入指定的元素。
- offer(E e) ;将指定元素添加到此列表的末尾(最后一个元素)。
- getFirst() ;返回此列表的第一个元素
- getLast() ; 返回此列表的最后一个元素。
-
E
peek()
获取但不移除此列表的头(第一个元素)。 -
E
peekFirst()
获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。E
peekLast()
获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。 -
E
poll()
获取并移除此列表的头(第一个元素)E
pollFirst()
获取并移除此列表的第一个元素;如果此列表为空,则返回 null。E
pollLast()
获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。 -
E
remove()
获取并移除此列表的头(第一个元素)。E
remove(int index)
移除此列表中指定位置处的元素。boolean
remove(Object o)
从此列表中移除首次出现的指定元素(如果存在)。E
removeFirst()
移除并返回此列表的第一个元素。boolean
removeFirstOccurrence(Object o)
从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。E
removeLast()
移除并返回此列表的最后一个元素。boolean
removeLastOccurrence(Object o)
从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。 -
Iterator<E>
descendingIterator()
返回以逆向顺序在此双端队列的元素上进行迭代的迭代器
在用contains()方法判定链中是否包含指定元素时候:
LinkedList list=new LinkedList();//创建一个LinkedList对象 list.add(new JButton());//添加按钮对象 System.out.println(list.contains(new JButton()));
输出结果是:false
不要偷懒,上面两个new JButton(),虽然长得很像,但是确实两个不同的对象,在开发中,这种偷懒的结果往往会付出惨重的代价,而且这种错误是很难被发现的。
-
descendingIterator(),举例
LinkedList list=new LinkedList();//创建一个LinkedList对象 list.add(12);//添加整形对象 list.offer(1232354556);//只添加到此时的末尾 list.addLast("lillin");//添加到链位 list.add(new JButton());//添加按钮对象 list.add(1, 'w');//添加到指定的位置 list.addFirst("gaosi");//List无添加到表头,必须是Linkedlist下才行 System.out.println(list.size()); Iterator it=list.descendingIterator();//逆序返回链中的元素 //顺序输出 System.out.println("---顺序输出---"); for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } System.out.println("逆序输出------------"); while(it.hasNext()){ System.out.println(it.next()); }
输出结果是:6
---顺序输出---
gaosi
12
w
1232354556
lillin
javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@11a5ee81,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=,defaultCapable=true]
逆序输出------------
javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@11a5ee81,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=,defaultCapable=true]
lillin
1232354556
w
12
gaosi - 获取链的第一个元素的方法
- element() //获取链中第一个元素
- getFirst() //获取链中第一个元素
- peek() //获取链中第一个元素
- peekFirst() //获取链中第一个元素
上面四种方法均可获取第一个元素,并且不移除,下面四种方法也可以获取第一个元素,但是会移除获取到的元素
- pollFirst() //获取链中第一个元素,并且移除
- poll() //获取链中第一个元素,并且移除
- pop() //弹栈,弹出第一个元素
- removeFirst() //移除并且返回第一个元素
在开发当中选方法要谨慎啊,不然方法虽多,用错了麻烦就大了
Link的子类Vector
Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。它是有线程安全的。
构造方法有一下
- 获取指定的索引出的组件通常有两种方法
- get()
- elementAt()
- elements()//获取全部组件的地址(应该是地址,一大串有16进制的数符串的2
2. capacity()与size()的区别
- capacity()//返回当前的容量
- size 是返回当前的组件数
Vector list=new Vector(100); //添加元素 list.add(12); list.add("gaosi"); list.add(0,"lilin"); //输出大小 System.out.println(list.size());//输出当前的组件数 System.out.println(list.capacity());//输出当前容量
输出结果是:3 100
setSize()即可生成新的容量大小,如果组件数未达到容量大小,会用null填充。上面的代码加上:list.setSize(200);输出的结果会是3 100 200
其他的方法与ArrayList的方法用法差不多
Set接口:
set接口是一种简单的集合框架,而且它保存的元素是无序不重复的。也就是说,set接口的元素是没有特定顺序的,特别是它不保证该顺序恒久不变,不能像数组一样通过下表遍历,但可以通过迭代方式遍历数组,当set出现相同的元素的时候,前者会被后者覆盖掉,。此类允许使用 null 元素,最多一个。
常用子类:HashSet<E> TreeSet<E>
HashSet:
HashSet不是线程同步的,对数据安全方面安全性不是很好。
- 构造方法
HashSet()
构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。HashSet(Collection<? extends E> c)
构造一个包含指定 collection 中的元素的新 set。HashSet(int initialCapacity)
构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。HashSet(int initialCapacity, float loadFactor)
构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。 - 常用的方法
boolean
add(E e)
如果此 set 中尚未包含指定元素,则添加指定元素。void
clear()
从此 set 中移除所有元素。boolean
contains(Object o)
如果此 set 包含指定元素,则返回 true。boolean
isEmpty()
如果此 set 不包含任何元素,则返回 true。Iterator<E>
iterator()
返回对此 set 中元素进行迭代的迭代器。boolean
remove(Object o)
如果指定元素存在于此 set 中,则将其移除。int
size()
返回此 set 中的元素的数量(set 的容量)。
代码举例:
List list=new LinkedList(); list.add("gaosililin"); list.add("nanhuajisuanjixueyuan"); Set set=new HashSet(list);//构造一个HashSet对象并且用list初始化 //向Hashset 添加元素 set.add(12); set.add("sfjgdouivg8y"); set.add(new Color(12,12,12)); //输出大小 System.out.println("---size---"+set.size()); //从set 中获取迭代器 Iterator it=set.iterator(); //打印迭代器的元素 while (it.hasNext()){ System.out.println(it.next()); } set.add(12);//添加已有的元素,覆盖前相同的元素 System.out.println("size---------"+set.size()); //从set 中获取迭代器 Iterator it1=set.iterator(); //打印迭代器的元素 while (it1.hasNext()){ System.out.println(it1.next()); }
输出结果是:
---size---5
sfjgdouivg8y
nanhuajisuanjixueyuan
gaosililin
java.awt.Color[r=12,g=12,b=12]
12
size---------5
sfjgdouivg8y
nanhuajisuanjixueyuan
gaosililin
java.awt.Color[r=12,g=12,b=12]
12
代码解读:先创造一个list对象,并且添加两个字符串到list当中,利用第二种构造方法创建一个HashSet对象并且用list去初始化HashSet(若是用第三种构造方法创建一个容量为100的HashSet对象,但是你只向当中添加小于100个元素,调用HashSet.size()时只返回元素个数而不是容量值噢)。上面代码也看到了,当我们添加相同的元素时候,前面的一个元素会被后添加相同的元素给覆盖了,说明Set的不可以重复性。从输出的结果也说明了Set 保存数据的并不是按照我们添加元素的顺序保存,连续运行几次,输出结果却是一样的,说明set保存数据有他自己的规律。还有就是,set的获取元素并不像link那样子调用get()方法支架获取,要调用iterator()来获取迭代器,转由迭代器获取set的元素
2.TreeSet
这是一种按自然顺序保存数据的set子类,貌似只能添加保存整数的,小白测了字符型,字符串以及浮点型的都会报异常。若是要对对整形数据进行严格的筛选的话,用TreeSet来时比较方便的,对数据进行的各种方法的筛选的方法比较多。与之相类似的还有他的兄弟ConcurrentSkipListSet<E>
Map接口:
集合框架-映射map与list,set有点儿不一样。map同时存放着两种对象一种对象称为key,一种称为value,两种对象是相对应的,但是key是不可以重复的,value是可以重复的,可以理解为
相关推荐
在Java中,集合框架主要包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。这个框架允许我们高效地处理各种数据结构,而无需从头开始编写代码。泛型则是Java 5引入的一项...
泛型是Java中处理类型安全的一种方式,允许我们在类、接口和方法中指定类型参数。这样,编译器可以在编译时检查类型一致性,防止在运行时出现ClassCastException。泛型的基本语法是在类或接口声明中使用尖括号`<>`,...
xmind格式的Java集合框架学习导图,包括Collection接口/Map接口以及具体实现类。 同样包含大厂面试题,也在导图中有所体现。 能学到什么: 更加成体系的知识框架,更加全面的、系统的知识。 思维导图: 思维导图具有...
集合框架是Java编程语言中的核心组成部分,它提供了一套高效、灵活的数据结构和算法操作,使得程序员能够方便地存储和管理对象。这篇学习笔记将深入探讨Java集合框架的基础概念、主要类库以及常见应用场景。 首先,...
在Java集合框架中,主要有六种核心接口:`Collection`, `Set`, `List`, `Queue`, `Deque`, 和 `Map`。此外,还有五个抽象类以及多个实现类,它们共同构成了Java集合框架的基础。 #### 二、核心接口介绍 1. **`...
在Java中,数据结构指的是组织、存储和管理数据的方式,而集合框架则是一组接口和类,为处理各种数据结构提供了统一的API。 首先,我们要理解数据结构的基本类型。在计算机科学中,常见的数据结构包括数组、链表、...
6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6....
能学到什么:在学习Java的朋友,可以从本文教程中学习到Java中最常用的集合框架,HashMap,ArrayList,HashSet等,同时又基于代码有一定层次的原理解释,让大家知其然,知其所以然,而又不会有太高的学习门槛。...
Java 集合框架是 Java 语言中提供的一种统一的标准体系结构,用于表示和操作集合。集合框架包含三大块内容:对外的接口、接口的实现和对集合运算的算法。 1. 接口:Collection 顶层接口是集合框架的核心接口,定义...
Java集合List集合Set集合Map集合Collection和collections工具类的框架图
本文档为本人学习 java 集合框架期间的学习总结笔记,希望对新学习的朋友有所帮助和参考价值。本人java 开发时间不是太长,可能存在不完善或不对之处,欢迎指正!
Java集合框架是Java编程语言中一个非常重要的...总的来说,Java集合框架通过其丰富的接口和实现,使得在Java中处理和管理对象变得更加灵活和高效。理解并熟练使用这些集合类和接口,对于编写高质量的Java代码至关重要。
面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣...
Java集合框架是Java编程语言中的核心部分,它提供了一组高效、灵活的数据结构,使得开发者可以方便地存储和管理各种类型的...无论是在面试中还是实际开发中,深入理解Java集合框架的知识都能帮助开发者更好地解决问题。
而在面向对象的编程语言如Java中,则采用类来描述数据结构及其相关的操作方法。Java集合框架(Java Collection Framework, JCF)正是为了满足这一需求而设计的一套规范和实现。 Java集合框架由一系列接口和其实现类...
在Web开发中,Java集合框架对动态存储对象的问题进行了解决。通过使用Java集合框架,可以存储和操作数据,从而使Web应用程序设计更加简便。Java集合框架的应用结果表明,使用Java集合框架可以使Web应用程序设计更加...
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型。接口允许集合独立操纵其代表的细节。在面向对象的语言,接口通常形成一个层次。 实现(类):是集合...