JAVA初级(十八)集合框架之List和Set的基本介绍和使用以及区别
本节介绍集合框架中的List和set
首先集合框架主要的作用是什么?
集合框架主要用来存储一组数据,就和数组一样.
集合框架主要分为两种Collection和Map,其中list和set属于Collection.
Collection表示存储一个数据的集合.只有一列的
Map存数键值对,这是有两列的
List和Set的基本使用,增删改查.
List和set的使用方法几乎一样.它们都是一个接口,因此要使用就要创建它们的实现类
由于它们是用来存数据用的,所以我们就需要知道如何来存储和取出,也就是如何来进行数据的增删改查
List是一个接口,常用的实现类有LinkedList和ArrayList
public static void main(String[] args) { List arrayList = new ArrayList();//创建一个list的实现类ArrayList List linkedList = new LinkedList();//创建一个list的实现类LinkedList arrayList.add("a");//添加一个元素 arrayList.add("b");//添加一个元素 arrayList.add("c");//添加一个元素 String firstElement = (String)arrayList.get(0);//取出第一个元素-->也就是"a"元素 arrayList.set(0,"d");//修改第一个元素,把"a"修改成"d" arrayList.remove(0);//删除第一个元素,这里就是把上面修改后的的第一个"d"删除 arrayList.remove("c");//删除"c"这个元素,把"c"删除 }
这样对一个List的基本操作就完成了.
增:add(int index)方法,添加一个元素
删:remove(int index或者Object o)方法,删除一个元素,删除指定索引或指定内容的元素
改:set(int index,Object o),修改指定索引的元素
查:get(int index)取出指定索引的元素
其中如果创建的实现类是LinkedList,那操作方法也是一样的,也是add,remove…
List将数据一 一的存储起来跟数组一样用下标来指定元素的位置.
set也是一个接口,常用的实现类是HashSet和TreeSet
Set hashSet = new HashSet();//创建一个hashSet的实现类 Set treeSet = new TreeSet();//创建一个treeSet的实现类 hashSet.add("a");// 添加一个元素 hashSet.add("b");// 添加一个元素 hashSet.remove("a");//删除"a"元素
这样对一个Set的基本操作就完成了
TreeSet的操作方法也是一样,
增和删的方法和List一样
但你发现Set没有get和set方法,也就是没有指定的查和改方法.并且remove方法没有指定索引的那个重载方法.这是一个主要区别.Set没有索引
List和Set的遍历
上面对List和Set进行了数据的存储,那么如果要一次性取出来要怎么做?
–>取集合的长度使用size()方法
1,for循环遍历
for (int i = 0;i<arrayList.size();i++){ System.out.println(arrayList.get(i)); }
2,foreach遍历,也就是增强for循环
for (Object o:arrayList) {//右边写要遍历的集合,左边是元素的类型,中间是元素值.从第一个元素开始取 System.out.println(o); }
3,Iterator迭代器遍历
用法步骤,
1,先用list的Iterator()方法创建这个list的Iterator
2,用while循环和Iterator的hasNext方法来判断是否还有元素
3,如果while判断为true,就用Iterator的next取出元素
Iterator iterator = arrayList.iterator();//创建这个list的Iterator while (iterator.hasNext()){//判断下一个元素是否有值 Object next = iterator.next();//取出下一个元素的值 System.out.println(next); }
这三种遍历有什么区别?什么时候用哪个?
首先如果只是输出结果,那么是没有区别的。但是如果要对集合增和删,那么它们就有区别.
看下面的代码
假如这个arrayList有三个元素{“a”,“b”,“c”}
for (int i = 0; i < arrayList.size(); i++) { if (arrayList.get(i).equals("a")) { arrayList.remove(i);//删除成功 } } for (Object o:arrayList) { if(o.equals("a")) { arrayList.remove(o);//报错 } } Iterator iterator = arrayList.iterator(); while (iterator.hasNext()){ Object next = iterator.next(); if(next.equals("a")) { iterator.remove();//删除成功 } }
结论:
1,foreach中进行增和删.会报错,你把remove换成add也会报错,但普通的for和Iterator不会.
2,在这个例子中for和Iterator都成功的删掉了元素.但是在不确定元素的情况不推荐用for进行list的增删.这个例子中Iterator正确的对arrayList进行了三次遍历,但是for只有两次.因为在遍历第一次的时候把元素删了.size减少了1.因此就不能保证结果是对的.
–>所以如果要对list进行增和删的操作.用Iterator
其他两种看情况,foreach用的比较多.因为在实际开发中,list存的一般都是对象.foreach遍历对里面的对象进行逻辑操作比其他两种方便点.
List和Set的区别
上面已经说到了一个区别
1,list有索引,set无索引
其实就是说List是有序集合,Set是无序集合.因为List是有序的所以设计成了有索引.因为我们能准确的拿到指定位置的元素.Set是无序的所以设计成了没有索引.所以不能准确的拿到指定位置的元素,也就是没有get方法
至于为什么说有序和无序,这个要找能理解源码的人来说明的。我看了下源码,~并不能理解。
但我们使用set的原因主要是因为下面这个第二个区别
2.set不能存储重复元素,list可以
public static void main(String[] args) { List arrayList = new LinkedList(); arrayList.add("a");//添加一个元素 arrayList.add("a");//添加一个元素 for (Object o:arrayList) { System.out.print(o); } Set hashSet = new HashSet();//创建一个hashSet的实现类 hashSet.add("a");// 添加一个元素 hashSet.add("a");// 添加一个元素 Iterator iterator = hashSet.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next()); } }
执行以上代码,set只输出一个a
Set不能存储重复元素这个特性是开发中使用Set的最主要原因.
3,List查询快,插入慢,Set查询慢,插入快
这些就是list和set的主要区别
数组和集合的使用选择
选择使用数组还是集合得看具体的需求。要知道如何选择就得了解下它们的区别
1,数组的长度在定义时就固定了。而集合不是,集合会动态扩充长度。
所以在存储一组数据时,如果你能保证这组数据的长度固定不变时,使用数组.否则使用集合
2,要对一组数据进行增减操作时建议用集合.数组想要添加数组需要知道索引然后赋值,然后要删除则需要进行移位,即把后面的数据前移一个.操作繁琐容易出错.
不过使用数组最主要的原因就是能够长度不变.因为数组在查询,增删改上效率都是比集合高的。但是长度不能保证的话这个数组就可能直接没法用了,
总结:
1,List和Set是什么?
是集合框架的Collection的子接口.它们的实现类能够用来存储数据
2,List和Set怎么用?
创建它们的实现类,List主要有ArrayList和LinkedList,Set主要有HashSet和TreeSet。
List有add,get,remove和set方法来进行数据的增删改查.
Set有add和remove来进行数据的增删.
3,List和Set的遍历–>3中方法. 其中Set只有两种方法.foreach和Itreator
4.List和Set的3个主要区别.
(1)List有序,Set无序
(2)List能重复,Set不能重复
(3)List查询快,插入慢,Set查询慢,插入快
5,什么时候用什么集合好?
大多数情况的选择是可以重复的数据用List,不能重复的数据用Set.
- JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用
- JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用
- 【Java集合的详细研究8】List,Set,Map用法以及区别
- Java基本概念:集合类(Collection)List/Set/Map的区别和联系
- 【Java_集合框架Set】HashSet、LinkedHashSet、TreeSet使用区别
- 【Java集合的详细研究8】List,Set,Map用法以及区别
- [Java] 集合类(List、Set、Map的基本使用)
- java 集合 之 链表和线性表以及ArrayList的各方法的介绍及示例 及 ArrayList与LinkedList的区别分析 及 ArrayList与Array(数组)的区别
- Java基本概念:集合类(Collection)List/Set/Map... 的区别和联系
- 【深入理解java集合系列】List,Set,Map用法以及区别
- Java集合中:List、Set、map的区别和具体的使用场景和高频问题解析
- Java—集合框架 List和Set的contains()以及Map的containsKey()、containsValue()
- JAVA基础学习之 Map集合、集合框架工具类Collections,Arrays、可变参数、List和Set集合框架什么时候使用等(4)
- Java学习第14天:集合框架零接触和基本理解(List和Set)
- Java基础知识强化之集合框架笔记19:List集合迭代器使用之 并发修改异常的产生原因 以及 解决方案
- Java基本概念:集合类(Collection)List/Set/Map... 的区别和联系
- 黑马程序员java学习—集合框架List和Set
- 黑马程序员_java_集合框架_Collection_List_Set_泛型
- Java基本概念:集合类 List/Set/Map... 的区别和联系
- java集合list,set,map区别与联系