`
gaosililn
  • 浏览: 73087 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

在Java中,小白对集合框架的认识

    博客分类:
  • Java
 
阅读更多

在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(),虽然长得很像,但是确实两个不同的对象,在开发中,这种偷懒的结果往往会付出惨重的代价,而且这种错误是很难被发现的。

 

  1. 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
  2. 获取链的第一个元素的方法
  • element()  //获取链中第一个元素
  • getFirst()  //获取链中第一个元素
  • peek()     //获取链中第一个元素
  • peekFirst()  //获取链中第一个元素

上面四种方法均可获取第一个元素,并且不移除,下面四种方法也可以获取第一个元素,但是会移除获取到的元素

  • pollFirst() //获取链中第一个元素,并且移除
  • poll()  //获取链中第一个元素,并且移除
  • pop() //弹栈,弹出第一个元素
  • removeFirst() //移除并且返回第一个元素

在开发当中选方法要谨慎啊,不然方法虽多,用错了麻烦就大了

 

 

 

Link的子类Vector

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。它是有线程安全的。

构造方法有一下

  1. 获取指定的索引出的组件通常有两种方法
  • 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集合框架和泛型课后习题答案

    在Java中,集合框架主要包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。这个框架允许我们高效地处理各种数据结构,而无需从头开始编写代码。泛型则是Java 5引入的一项...

    Java集合框架及泛型

    泛型是Java中处理类型安全的一种方式,允许我们在类、接口和方法中指定类型参数。这样,编译器可以在编译时检查类型一致性,防止在运行时出现ClassCastException。泛型的基本语法是在类或接口声明中使用尖括号`&lt;&gt;`,...

    【Java】Java集合框架思维导图。

    xmind格式的Java集合框架学习导图,包括Collection接口/Map接口以及具体实现类。 同样包含大厂面试题,也在导图中有所体现。 能学到什么: 更加成体系的知识框架,更加全面的、系统的知识。 思维导图: 思维导图具有...

    集合框架学习笔记

    集合框架是Java编程语言中的核心组成部分,它提供了一套高效、灵活的数据结构和算法操作,使得程序员能够方便地存储和管理对象。这篇学习笔记将深入探讨Java集合框架的基础概念、主要类库以及常见应用场景。 首先,...

    Java集合框架总结

    Java集合框架是Java编程中不可或缺的一部分。通过理解这些接口和类的特性及其相互间的关系,可以更高效地编写出健壮的应用程序。同时,合理利用抽象类和迭代器等工具能够进一步提高代码的质量和可维护性。

    java集合框架图

    在Java集合框架中,主要有六种核心接口:`Collection`, `Set`, `List`, `Queue`, `Deque`, 和 `Map`。此外,还有五个抽象类以及多个实现类,它们共同构成了Java集合框架的基础。 #### 二、核心接口介绍 1. **`...

    数据结构和Java集合框架

    在Java中,数据结构指的是组织、存储和管理数据的方式,而集合框架则是一组接口和类,为处理各种数据结构提供了统一的API。 首先,我们要理解数据结构的基本类型。在计算机科学中,常见的数据结构包括数组、链表、...

    6.java集合框架.zip

    6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6....

    Java中的集合框架Markdown全系列笔记

    能学到什么:在学习Java的朋友,可以从本文教程中学习到Java中最常用的集合框架,HashMap,ArrayList,HashSet等,同时又基于代码有一定层次的原理解释,让大家知其然,知其所以然,而又不会有太高的学习门槛。...

    集合框架,java中常用的集合类和接口

    Java 集合框架是 Java 语言中提供的一种统一的标准体系结构,用于表示和操作集合。集合框架包含三大块内容:对外的接口、接口的实现和对集合运算的算法。 1. 接口:Collection 顶层接口是集合框架的核心接口,定义...

    Java集合框架图

    Java集合List集合Set集合Map集合Collection和collections工具类的框架图

    JAVA集合框架学习总结

    本文档为本人学习 java 集合框架期间的学习总结笔记,希望对新学习的朋友有所帮助和参考价值。本人java 开发时间不是太长,可能存在不完善或不对之处,欢迎指正!

    java 集合框架的原理及其使用

    Java集合框架是Java编程语言中一个非常重要的...总的来说,Java集合框架通过其丰富的接口和实现,使得在Java中处理和管理对象变得更加灵活和高效。理解并熟练使用这些集合类和接口,对于编写高质量的Java代码至关重要。

    面渣逆袭 Java 集合框架篇.pdf

    面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣...

    Java集合框架常见面试题.pdf

    Java集合框架是Java编程语言中的核心部分,它提供了一组高效、灵活的数据结构,使得开发者可以方便地存储和管理各种类型的...无论是在面试中还是实际开发中,深入理解Java集合框架的知识都能帮助开发者更好地解决问题。

    Java集合框架使用总结

    而在面向对象的编程语言如Java中,则采用类来描述数据结构及其相关的操作方法。Java集合框架(Java Collection Framework, JCF)正是为了满足这一需求而设计的一套规范和实现。 Java集合框架由一系列接口和其实现类...

    Java集合框架在Web开发中的应用.pdf

    在Web开发中,Java集合框架对动态存储对象的问题进行了解决。通过使用Java集合框架,可以存储和操作数据,从而使Web应用程序设计更加简便。Java集合框架的应用结果表明,使用Java集合框架可以使Web应用程序设计更加...

Global site tag (gtag.js) - Google Analytics