Set集合,放的元素不能重复,请问它的判断重不重复是怎么实现的

Set集合,放的元素不能重复,请问它的判断重不重复是怎么实现的,第1张

你好,首先要明白一点:加入Set里面的元素必须定义equals()方法以确保对象的唯一性。

第一个问题:

TreeSet的底层实现是采用红-黑树的数据结构,采用这种结构可以从Set中获取有序的序列,但是前提条件是:元素必须实现Comparable接口,该接口中只用一个方法,就是compareTo()方法。当往Set中插入一个新的元素的时候,首先会遍历Set中已经存在的元素(当然不是采用顺序遍历,具体采用什么方法,建议自己去看看源码),并调用compareTo()方法,根据返回的结果,决定插入位置。进而也就保证了元素的顺序。

第二个问题:

上面已经说过,加入Set里面的元素必须定义自己的equals()方法,但是对于良好的设计风格,最好在覆盖equals()方法的同时,也覆盖hashCode()方法,当然,对于TreeSet而言不用覆盖hashCode()方法也可。请记住:覆盖hashCode()方法的目的,只有一个原因就是提高效率。

在往Set中插入新的对象时,首先会用该对象的hashCode()与已经存在对象的hashCode()做比较,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。

注:如果没有覆盖hashCode()方法,那就是只比较equals()对两个对象equals运算,是判断两个对象是否相等的关键。

第三个问题:

2)HashSet与TreeSet区别:

1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值

2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束

3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例

1、定义一个大小是100的数组

int arr[]=new int[100];//定一个100大小的整型数组

2、循环赋值1-100的数

for(int i=1;i<=100;i++){

  arr[i-1] = i;//赋值1-100的数

}

3、遍历数组

for(int i=0;i<arrlength;i++){//数组最大值是arrlength,循环遍历数组

  Systemoutprintln(arr[i]);//输出数组内的元素

}

给你个java学习的进阶过程吧!根据个人的所学情况来规划好自己的学习任务,希望对你有用了

第一阶段:

JAVA语言基础知识。包括异常、IO流、多线程、集合类。

要求:异常------掌握try-catch-finally的使用

IO流------掌握字节流、字符流和对象序列化的处理。熟练使用各种输入、输出流类

(InputStream、OutputStream、FileInputStream、FileOutputStream、DataInputStream、DataOutputStream、BufferedInputStream、BufferedOutputStream、Reader、Writer、InputStreamReader、OutputStreamWriter、BufferReader、BufferedWriter、ObjectInputStream、ObjectOutputStream)。

多线程-------掌握多线程实现的两种实现方法,分别是继承Thread类与实现Runnable接口。理解线程间的同步与互斥。

集合类-------掌握Set、Collection、Map、List、Iterator、Enumeration接口的使用,掌握HashSet、ArrayList、Vector、HashMap、HashTable类的使用。

另外-------理解Unicode、GB2132、GBK、UTF-8、ISO8859编码方式。

了解javase15新增的内容,元数据,泛型之类的

自己的体会:

1、Iterator可以删除元素,而Enumeration不能;

2、Vertor可以线程同步,安全,但效率较低,而ArrayList不同步,效率高,使用ArrayList创建一个大小固定的List,运行比其他的list要快;

3、List是一个能包含重复元素的已排序的Collection,有时也称序列。和数组一样,都基于0开始的。

List接口是由Arraylist类,LinkedList类和Vector类实现的;

Collections类是用来 *** 纵List的,有reverse,fill,copy,max,min,binarySearch等等方法

4、Set是没有重复元素的,集合框架含有set的两种实现:HashSet和TreeSet。

HashSet把它的元素存储在哈希表中,TreeSet把它的元素存储在树中。可以使用HashSet从ArrayList删除重复

5、Map把键和值联系起来,不包含重复的键(每一个键只能映射到一个值,即是一对一的关系,这称为一对一关系)。Map和Set的不同之处在于Map包含键和值,而Set只包含键。HaspMap 类和TreeMap类实现了Map接口 HashMap把它的元素存储在哈希表中,TreeMap把它的元素存储在树中。

第二阶段:

JAVA网络编程。包括Socket、RMI、HTML、XML、JSP、JavaBean、Servlet、EJB。

要求:Socket--------掌握javaio包中的套接口类和服务器套接口类的使用。

RMI--------掌握RMI基本工作原理、掌握定义远程服务接口类、远程接口类、客户端调用类和部署、编译RMI应用程序。

HTML--------了解HTML语言的语法、各种标签。

XML--------掌握XML语言的语法、DTD、Schema。

JSP-------掌握JSP20语法、隐含对象、EL、JSTL11、JSP自定标签。

JavaBean-------理解JavaBean的特点和事件模型。

Servlet---------掌握>

线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在javautil包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。

如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

Iterator it = collectioniterator(); // 获得一个迭代子

while(ithasNext()) {

Object obj = itnext(); // 得到下一个元素

}

由Collection接口派生的两个接口是List和Set。

List接口

List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

和下面要提到的Set不同,List允许有相同的元素。

除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

LinkedList类

LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些 *** 作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

List list = CollectionssynchronizedList(new LinkedList());

ArrayList类

ArrayList实现了可变大小的数组。

它允许所有元素,包括null。ArrayList没有同步。

size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

主要掌握的接口 :List ,Map

List 的实现类:

ArrayList( 遍历集合中元素时,速度较快

增:add(Object obj);

删:remove(int index)按照索引删除元素

获取:get(int index) 按照索引获取集合中的元素

LinkedList(比ArrayList多了首尾的 *** 作

增:addFirst(Object obj)在集合首部添加元素;

addLast(Object obj) 在集合尾部添加元素

删:removeFirst();删除集合中第一个元素

removeLast();删除集合中最后一个元素

获取:getFirst();获取集合中第一个元素

getLast();获取集合中最后一个元素

Map接口的实现类:HashMap(以键值对存放元素,键与值存在一一映射的关系

增:put(Object key,Object value)key表示键,value表示值

获取:get(Object key) 根据值所对应的键获取元素

remove(Object key) 根据键来移除元素

)

以上就是关于Set集合,放的元素不能重复,请问它的判断重不重复是怎么实现的全部的内容,包括:Set集合,放的元素不能重复,请问它的判断重不重复是怎么实现的、Java中,定义一个1~100的数据,存放进数组,并遍历它。、JAVA 初学者的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10145245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存