你好,首先要明白一点:加入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 初学者的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)