`
gaosililn
  • 浏览: 73461 次
  • 性别: 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集合框架思维导图。

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

    JAVA学习 Java集合框架.ppt

    JAVA学习 Java集合框架.ppt

    java数据结构及集合框架

    java数据结构及集合框架

    java集合框架全面进阶.pdf

    在Java集合框架的发展史上,JDK 1.2版本中引入的集合框架极大地改进了集合类的设计和实现,这个版本的集合框架广泛应用于Java 2平台。随着Java 2平台的发展,集合框架经历了多次更新和扩展,以满足不断增长的编程...

    Java集合框架详解

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一种高效、灵活的方式来存储和操作数据。这个框架由一系列接口和类组成,它们定义了不同类型的集合,如List、Set和Map,以及它们的操作方法和实现原理。理解...

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

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

    JAVA集合框架学习总结

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

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

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

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

    Java集合框架是Java编程语言中的一个核心组件,它为存储、管理和操作对象提供了一套统一的接口和类。集合框架使得开发者可以更加高效地处理数据,而无需关注底层的实现细节。本文将深入探讨Java集合框架的主要组成...

    JAVA学习Java集合框架.pptx

    在Java中,异常是指程序执行过程中出现的非正常情况,例如除以零、数组越界、文件不存在等。Java提供了try-catch语句来捕捉和处理异常。 throw和throws的区别与联系 throw和throws是Java中用于异常处理的两个...

    一个扑克游戏,用于Java集合框架练习.zip

    一个扑克游戏,用于Java集合框架练习一个扑克游戏,用于Java集合框架练习 一个扑克游戏,用于Java集合框架练习一个扑克游戏,用于Java集合框架练习 一个扑克游戏,用于Java集合框架练习一个扑克游戏,用于Java集合...

    java集合框架的使用。集合的运算

    1. 散列集合:在Java中,HashSet是散列集合的一个典型代表。它通过哈希算法来存储元素,确保元素的唯一性。HashSet不保证元素的顺序,但插入和查找速度非常快。例如,你可以创建一个HashSet,然后添加元素,检查元素...

    Java集合框架培训资料

    在Java中,集合框架主要由两个顶级接口构成:`Collection`和`Map`。`Collection`接口是所有单值容器的父接口,包括了`List`、`Set`和`Queue`等子接口。`Map`接口则代表键值对的容器,如`HashMap`、`TreeMap`等。 1....

    Java集合框架总结

    在Java中,集合框架是实现这一概念的标准化结构,它包括接口、接口的实现和算法。接口定义了集合的行为,比如添加、删除和查询元素;实现则是接口的具体类,它们提供了实际的数据结构,如链表、数组或树;算法是一...

    Java集合框架源码

    Java集合框架源码,需要的自行下载!

    JAVA常用集合框架讲解

    JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解

    07 java异常处理和集合框架

    在Java中,异常是一种特殊的事件,它中断了程序的正常执行流程。Java提供了一种结构化的异常处理机制,通过`try-catch-finally`块来捕获和处理这些异常。当在`try`块中发生异常时,相应的`catch`块会被执行,用来...

    一个讲解很清晰的Java集合框架PPT

    在Java中,集合框架主要包括四大接口:List、Set、Queue和Map。每个接口都有自己的特性和用途,适用于不同的数据组织需求。 1. **List接口**:List是有序的集合,允许元素重复,并且支持索引访问。ArrayList和...

    java中的集合框架和序列化

    学习java基础知识的很好材料 java中的集合框架和序列化

Global site tag (gtag.js) - Google Analytics