`
gaosililn
  • 浏览: 70343 次
  • 性别: 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集合框架详解Java集合框架详解Java集合框架详解

    Java集合框架总结

    Java集合框架总结Java集合框架总结Java集合框架总结Java集合框架总结Java集合框架总结Java集合框架总结

    java集合框架图

    java集合框架图java集合框架图java集合框架图java集合框架图java集合框架图

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

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

    Java集合框架使用总结

    本文是对Java集合框架做了一个概括性的解说,目的是对Java集合框架体系有个总体认识,如果你想学习具体的接口和类的使用方法,请参看Java API文档。 一、概述 数据结构对程序设计有着深远的影响,在面向过程的...

    JAVA学习 Java集合框架.ppt

    JAVA学习 Java集合框架.ppt

    java集合框架java集合框架.doc

    java集合框架java集合框架

    Java集合框架及泛型

    集合框架及泛型的介绍和基础理解,方便大家了解集合框架及泛型。

    java数据结构及集合框架

    java数据结构及集合框架

    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集合框架面试题

    内含大量java集合框架方面常被面试官问到的经典面试题。

    java中集合框架层次结构

    java中集合框架层次结构 java中集合框架层次结构

    Java集合框架.ppt

    集合是将多个元素组成一个单元的...Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了Java集合框架位于java.util包中

    数据结构和Java集合框架

    数据结构 和 Java集合框架

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

    Java集合框架 系统的介绍java集合框架的应用

    Java集合框架图

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

    学士后Java集合框架和泛型课后习题答案

    学士后Java集合框架和泛型课后习题答案 希望能够帮助大家更好的学习JAVA,这些知识还是比较基础的,并没有多大难度 一起共同进步

    JAVA集合框架学习总结

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

    java集合 框架 泛型

    java集合 框架 泛型,枚举,有PPT详解,并有实例

Global site tag (gtag.js) - Google Analytics