set也是继承自collection,set也是集合的一种,同时set不允许重复的元素存在。set的实现类都是基于map来实现的,其中hashset是通过hashmap来实现的,treeset是通过treemap实现的。
set架构:
(1)set是继承于collection的接口,它是一个不允许重复元素的集合。
(2)abstractset是一个抽象类,继承了abstractcollection,abstractcollection实现了set中的绝大部分函数,为set的实现类提供了便利。
(3)hashset和treeset是set的两个实现类。hashset依赖于hashmap,实际上是通过hashmap来实现的,hashset中的元素是无序的。treeset依赖于treemap,实际上是通过treemap实现的,treeset中的元素是有序的。
基于java8的abstractcollection源码:
public abstract class abstractcollection<e> implements collection<e> {
protected abstractcollection() {//构造函数
}
public abstract iterator<e> iterator();//迭代器
public abstract int size();//集合大小
public boolean isempty() {//集合是否为空
return size() == 0;
}
public boolean contains(object o) {//判断是否包含某个元素,通过迭代遍历的方式
iterator<e> it = iterator();
if (o==null) {
while (it.hasnext())
if (it.next()==null)
return true;
} else {
while (it.hasnext())
if (o.equals(it.next()))
return true;
}
return false;
}
public object[] toarray() {//生成数组
// estimate size of array; be prepared to see more or fewer elements
object[] r = new object[size()];
iterator<e> it = iterator();
for (int i = 0; i < r.length; i++) {
if (! it.hasnext()) // fewer elements than expected
return arrays.copyof(r, i);
r[i] = it.next();
}
return it.hasnext() ? finishtoarray(r, it) : r;
}
@suppresswarnings("unchecked")
public <t> t[] toarray(t[] a) {//泛型方式生成数组
// estimate size of array; be prepared to see more or fewer elements
int size = size();
t[] r = a.length >= size ? a :
(t[])java.lang.reflect.array
.newinstance(a.getclass().getcomponenttype(), size);
iterator<e> it = iterator();
for (int i = 0; i < r.length; i++) {
if (! it.hasnext()) { // fewer elements than expected
if (a == r) {
r[i] = null; // null-terminate
} else if (a.length < i) {
return arrays.copyof(r, i);
} else {
system.arraycopy(r, 0, a, 0, i);
if (a.length > i) {
a[i] = null;
}
}
return a;
}
r[i] = (t)it.next();
}
// more elements than expected
return it.hasnext() ? finishtoarray(r, it) : r;
}
private static final int max_array_size = integer.max_value - 8;
@suppresswarnings("unchecked")
private static <t> t[] finishtoarray(t[] r, iterator<?> it) {
int i = r.length;
while (it.hasnext()) {
int cap = r.length;
if (i == cap) {
int newcap = cap + (cap >> 1) + 1;
// overflow-conscious code
if (newcap - max_array_size > 0)
newcap = hugecapacity(cap + 1);
r = arrays.copyof(r, newcap);
}
r[i++] = (t)it.next();
}
// trim if overallocated
return (i == r.length) ? r : arrays.copyof(r, i);
}
//对输入的mincapacity判断最大容量
private static int hugecapacity(int mincapacity) {
if (mincapacity < 0) // overflow
throw new outofmemoryerror
("required array size too large");
return (mincapacity > max_array_size) ?
integer.max_value :
max_array_size;
}
//添加对象
public boolean add(e e) {
throw new unsupportedoperationexception();
}
//通过迭代查找,删除对象
public boolean remove(object o) {
iterator<e> it = iterator();
if (o==null) {
while (it.hasnext()) {
if (it.next()==null) {
it.remove();
return true;
}
}
} else {
while (it.hasnext()) {
if (o.equals(it.next())) {
it.remove();
return true;
}
}
}
return false;
}
//判断集合c中的元素是否都存在
public boolean containsall(collection<?> c) {
for (object e : c)
if (!contains(e))
return false;
return true;
}
//将集合c中的元素添加
public boolean addall(collection<? extends e> c) {
boolean modified = false;
for (e e : c)
if (add(e))
modified = true;
return modified;
}
//删除掉集合c中在此集合中的元素
public boolean removeall(collection<?> c) {
objects.requirenonnull(c);
boolean modified = false;
iterator<?> it = iterator();
while (it.hasnext()) {
if (c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}
//删除掉此集合中在c中不存在的对象
public boolean retainall(collection<?> c) {
objects.requirenonnull(c);
boolean modified = false;
iterator<e> it = iterator();
while (it.hasnext()) {
if (!c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}
//清空集合
public void clear() {
iterator<e> it = iterator();
while (it.hasnext()) {
it.next();
it.remove();
}
}
//通过stringbuilder生成string
public string tostring() {
iterator<e> it = iterator();
if (! it.hasnext())
return "[]";
stringbuilder sb = new stringbuilder();
sb.append('[');
for (;;) {
e e = it.next();
sb.append(e == this ? "(this collection)" : e);
if (! it.hasnext())
return sb.append(']').tostring();
sb.append(',').append(' ');
}
}
}
基于java8的abstractset源代码:
public abstract class abstractset<e> extends abstractcollection<e> implements set<e> {
protected abstractset() {
}
public boolean equals(object o) {//判断两个集合是否相同
if (o == this)
return true;
if (!(o instanceof set))
return false;
collection<?> c = (collection<?>) o;
if (c.size() != size())
return false;
try {
return containsall(c);
} catch (classcastexception unused) {
return false;
} catch (nullpointerexception unused) {
return false;
}
}
//计算hashcode
public int hashcode() {
int h = 0;
iterator<e> i = iterator();
while (i.hasnext()) {
e obj = i.next();
if (obj != null)
h += obj.hashcode();
}
return h;
}
//删除此集合中与c中相同的对象
public boolean removeall(collection<?> c) {
objects.requirenonnull(c);
boolean modified = false;
if (size() > c.size()) {
for (iterator<?> i = c.iterator(); i.hasnext(); )
modified |= remove(i.next());
} else {
for (iterator<?> i = iterator(); i.hasnext(); ) {
if (c.contains(i.next())) {
i.remove();
modified = true;
}
}
}
return modified;
}
}
基于java8的sortset源码:
sortedset<> set<> {
comparator<? > ()sortedset<> (fromelementtoelement)sortedset<> (toelement)sortedset<> (fromelement)()()spliterator<> () {
spliterators.iteratorspliterator<>(
spliterator.distinct | spliterator.sorted | spliterator.ordered) {
comparator<? > () {
sortedset..comparator()}
}}
}
基于java8的navigableset源码:
navigableset<> sortedset<> {
(e)(e)(e)(e)()()iterator<> ()navigableset<> ()iterator<> ()navigableset<> (fromelementfrominclusivetoelementtoinclusive)navigableset<> (toelementinclusive)navigableset<> (fromelementinclusive)sortedset<> (fromelementtoelement)sortedset<> (toelement)sortedset<> (fromelement)}
基于java8的set源码:
public interface set<e> extends collection<e> {
int size(); //大小
boolean isempty();//是否为空
boolean contains(object o); //是否包含某个对象
iterator<e> iterator(); //生成迭代器
object[] toarray(); //返回object数组
<t> t[] toarray(t[] a); //返回泛型数组
boolean add(e e); //向set中添加元素
boolean remove(object o); //从set中删除某个元素
boolean containsall(collection<?> c); //某个collection是否都包含在此lset中
boolean addall(collection<? extends e> c); //将某个collection追加到此set中
boolean retainall(collection<?> c); //删除不存在于collection中的set中的元素
boolean removeall(collection<?> c); //删除包含在此collection中的元素
void clear(); //清空set
boolean equals(object o);//判断两个set是否相同
int hashcode(); //计算set的hashcode
@override
default spliterator<e> spliterator() {
return spliterators.spliterator(this, spliterator.distinct);
}
}
以上就是java集合之set的图文代码介绍的详细内容。