「java容器set」Java容器类
本篇文章给大家谈谈java容器set,以及Java容器类对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java中list和set的区别
list和set都是集合容器,list是有序不唯一 ,set是无序唯一 这两种集合主要看你需要封装什么样的数据。希望能帮到你!
java中 List 与Set 的区别
其实就实际开发中List使用的次数更多一点,
假如从数据库里读了很多条记录 经过处理封装成对象 就可以装在一个该对象类型的list里面 就可以迭代访问里面每个对象,里面的对象是有顺序的,只有索引,你不能通过对他们取别的名字之类的得到她。
而set只能对应true or false,比方可以存放一个班上一门课作业是否提交,那bool assignment = set('小张'),就可以得到小张的作业是否已经提交list的话,就好比一个数组,存放一类对象的组合,一个容器,跟上面List性质不一样的,可以想象成是一个可以动态变大变小的数组就可以了。
简单来说就是
List : 存放有序可重复的元素
set : 存放无序不可重复的元素
如果你只需要在一个集合中选取一个数字,而不需要得到它的排序,你就可以使用set,而它在我们实际的应用中很少使用,我再给你推荐一个map,也就是映射
映射,存放的是键与值的映射,其中键是唯一的(不能有重复对象),而值可以有重复的对象,存的时候,需要指定键和对应的值,取的时候可以根据键名取到值,也可以遍历。
JAVA里面set,map,list的区别是什么?(尽量详细)
一、List接口
List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
ArrayList
ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量:
private static final int DEFAULT_CAPACITY = 10;
随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。
size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。
ArrayList擅长于随机访问。同时ArrayList是非同步的。
LinkedList
同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。
由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端,节约一半时间)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。
与ArrayList一样,LinkedList也是非同步的。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(…));
Vector
与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。
Stack
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
二、Set接口
Set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样运行null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,关于API方面。Set的API和Collection完全一样。实现了Set接口的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。
HashSet
HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的。集合元素可以是null,但只能放入一个null。它内部元素的顺序是由哈希码来决定的,所以它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。
TreeSet
TreeSet是二叉树实现的,基于TreeMap,生成一个总是处于排序状态的set,内部以TreeMap来实现,不允许放入null值。它是使用元素的自然顺序对元素进行排序,或者根据创建Set时提供的 Comparator 进行排序,具体取决于使用的构造方法。
LinkedHashSet
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
三、Map接口
Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。实现map的集合有:HashMap、HashTable、TreeMap、WeakHashMap。
HashMap
以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。
HashTable
也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式。HashTable继承Dictionary类,实现Map接口。其中Dictionary类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类。每个键和每个值都是一个对象。在任何一个 Dictionary 对象中,每个键至多与一个值相关联。Map是”key-value键值对”接口。 HashTable采用”拉链法”实现哈希表不过性能比HashMap要低。
TreeMap
有序散列表,实现SortedMap接口,底层通过红黑树实现。
WeakHashMap
谈WeakHashMap前先看一下Java中的引用(强度依次递减)
强引用:普遍对象声明的引用,存在便不会GC
软引用:有用但并非必须,发生内存溢出前,二次回收
弱引用:只能生存到下次GC之前,无论是否内存足够
虚引用:唯一目的是在这个对象被GC时能收到一个系统通知
以弱键实现的基于哈希表的Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。null值和null键都被支持。该类具有与HashMap类相似的性能特征,并具有相同的效能参数初始容量和加载因子。像大多数集合类一样,该类是不同步的。
四、总结
1、List、Set都是继承自Collection接口,Map则不是。
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
3、Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
4、Map适合储存键值对的数据
5、线程安全集合类与非线程安全集合类 :
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
Java编程用Set容器
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
/**
* 有10本图书,2个属性:名称和ISBN号,将10本图书存放到一个Set容器中,
* 要求:(1)遍历容器中的10本图书,分别输出他们的基本信息
* (2)将Set容器中的对象全部放到一个list容器中,实现从小到大的排序后再将其按顺序输出
*
* @author kevin
*
*/
public class TestBook {
/**
* 添加书
*/
public SetBook addBook() {
SetBook bookSet = new HashSetBook();
for (int i = 0; i 10; i++) {
Book book = new Book();
book.setBookName("book" + i);
book.setISBN("iSBN" + i);
bookSet.add(book);
}
return bookSet;
}
/**
* 将Set容器中的对象全部放到一个list容器中
* 实现从小到大的排序后再将其按顺序输出
* @param bookSet
* @return
*/
public ArrayListBook toList(SetBook bookSet){
ArrayListBook bookList = new ArrayListBook();
bookList.addAll(bookSet);
Collections.sort(bookList,new ComparatorBook() {
public int compare(Book o1, Book o2) {
return o1.getBookName().compareTo(o2.getBookName());
}
});
return bookList;
}
/**
* 遍历书
* @param books
*/
public void out(CollectionBook books){
for(Book book : books){
System.out.println("书名:"+book.getBookName() +"----书ISBN:"+book.getISBN());
}
}
public static void main(String[] args) {
TestBook testBook = new TestBook();
SetBook bookSet = testBook.addBook();
testBook.out(bookSet);
System.out.println("--------------------排序后-------------------");
testBook.out(testBook.toList(bookSet));
}
}
/**
* 书实体
* @author kevin
*
*/
class Book {
private String bookName;
private String ISBN;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getISBN() {
return ISBN;
}
public void setISBN(String iSBN) {
ISBN = iSBN;
}
}
效果:
书名:book1----书ISBN:iSBN1
书名:book2----书ISBN:iSBN2
书名:book5----书ISBN:iSBN5
书名:book0----书ISBN:iSBN0
书名:book7----书ISBN:iSBN7
书名:book4----书ISBN:iSBN4
书名:book9----书ISBN:iSBN9
书名:book6----书ISBN:iSBN6
书名:book3----书ISBN:iSBN3
书名:book8----书ISBN:iSBN8
--------------------排序后-------------------
书名:book0----书ISBN:iSBN0
书名:book1----书ISBN:iSBN1
书名:book2----书ISBN:iSBN2
书名:book3----书ISBN:iSBN3
书名:book4----书ISBN:iSBN4
书名:book5----书ISBN:iSBN5
书名:book6----书ISBN:iSBN6
书名:book7----书ISBN:iSBN7
书名:book8----书ISBN:iSBN8
书名:book9----书ISBN:iSBN9
关于java容器set和Java容器类的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-01,除非注明,否则均为
原创文章,转载请注明出处。