黑么程序员(五)集合中set和list集合之间的特点以及特别用法

集合中存储的都是对象的引用(地址);

集合和数组的区别。。集合可变长度,数组不行

Collection
|----list 元素师有序的,元素可以重复。因为该集合有索引,角标位置所以是可以重复的,a1的张三和a2的张三。所以可以重复。有序
|-----ArrayList 底层是数组结构,查询速度快,但是增删特别麻烦。
默认是10个容量,可变长度数组每次延长50%
|-----LinkedList 增删特别快,,但是查询慢。。链表结构一个元素只记住上下两个元素。
|----Vector  底层是数组结构,线程同步 被arraylist取代了。基本不用了
|----set元素是无序的。。元素不可以重复。但是能排序
|------HashSet 通过元素的两个方法,hashcode和equals来完成。如果元素的hashcode值相同才会判断equals是否为true如果hash值不同不会调用
多了hash值的判断 。对于判断元素是否存在以及删除等操作依赖的方法是元素的hashcode和equals来完成
|------TreeSet 
|-----可以读set集合汇总的元素进行排序。让元素自身具备比较性。实现Comparable接口覆盖compareable方法这叫元素的自然顺序也叫默认顺序
第二种排序方式,当元素自身不具备比较性时,或者具备的比较性不是所需要的时候就需要让集合具备比较性集合初始化就具备了比较性
list集合特有的特点:因为有角标所有特有一些特点 <> 没带着个的话统一用的是object。调用的时候要强转
contains  (0==null?e==null:o.equals(e)) 0==null的真假,返回后面的e==null也是真假。意思就是。0==null是ture的话返回e==null的true或者false
0==null是false的话返回o.equals(e)的ture或者false。
al.remove(new Person("lisi03",33))
new Person("lisi03",33) 会有自己的引用地址。因为new了。这个引用地址在集合中是不存在的所以补能删除。
remove也是调用了equals方法。把这个元素和集合中的元素比较。如果相同就删除。
凡是可以操作角标的方法都是改体系特有的方法
 add(int index, E element) 
          在列表的指定位置插入指定元素
 addAll(int index, Collection<? extends E> c) 
          将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
 remove(int index) 
          移除列表中指定位置的元素(可选操作)。
 set(int index, E element) 
          用指定元素替换列表中指定位置的元素(可选操作)。//只有list集合有更改元素的特点,其他集合没有。

 get(int index) 
          返回列表中指定位置的元素。


 List<E> subList(int fromIndex, int toIndex) 
          返回列表中指定的 fromIndex(包括 )和 toIndex(不包括) 
 ListIterator<E> listIterator() 
          返回此列表元素的列表迭代器(按适当顺序)。 




 *****list集合特有的迭代器 特殊的地方列表迭代器//***迭代器的小特点。。按照角标位置开始迭代。。角标最前的先出来。
 ListIterator 是Iterator的接口,在迭代是不可以集合的方法操作集合的元素
 hasPrevious()  逆向遍历


LinkedList 特有方法
addFirst(E e) 
将指定元素插入此列表的开头。
addLast(E e) 
将指定元素添加到此列表的结尾。
getFirst() 
返回此列表的第一个元素。 
E getLast() 
返回此列表的最后一个元素。

E remove() //remove 也可以获取元素。。并同时移除元素。。。
          获取并移除此列表的头(第一个元素)。 
E remove(int index) 
 移除此列表中指定位置处的元素。 
boolean remove(Object o) 
 从此列表中移除首次出现的指定元素(如果存在)。 
E removeFirst() 
 移除并返回此列表的第一个元素。
 while(!link.isEmpty)
 {
removelast();
 }//抛出异常。。
 在1.6版本改变了出现了替代方法
pollFirst() 
获取并移除此列表的第一个元素;如果此列表为空,则返回 null。 
E pollLast() 
获取并移除此列表的最后一个元素;如果此列表为空
 E peekFirst() 
获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。 
E peekLast() 
获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null 








class Demo
{


 public static void main(String[] args)
 {
ArrayList al=new ArrayList();
al.add("java01");
a1.add("java02")
//演示迭代器。在迭代过程中,准备添加或者删除元素
Iterator it=al.iterator(); //迭代器只能移除
while(it.hasNext())
{
Object obj=it.next();
if("java02".equlas(obj))//错误的地方,元素放进迭代器中进行取出的过程中是通过迭代器来操作的
//如果此时你再通过集合来操作元素产生并发操作,会有错误的。不能对同意元素进行同时操作
//既进行迭代操作又通过集合操作产生并发错误。
a1.add("java008");//
it.remove();//把集合中这个元素的引用移除了。但是。这个元素还是在内存中的,打印是有的。只是集合中没有了
sop(obj);
}


 }
 列表迭代器继承自迭代器。。有指针有角标。。有添加有取出能修改。
}
LinkedList的一个小练习:
模仿堆栈 先进后出
或者队列结构 先进先出


class DuiLie
{
private LinkedList link;
DuiLie()
{
link=new LinkedList();
}
public void myadd(Object obj)
{
link.addLast(obj);
}

public Object get()
{
return link.pollLast();


}
public boolean isEmpty()
{
return link.isEmpty();
}
}
class Demo
{
public static void main(String[] args)
{
DuiLie dl=new DuiLie();
dl.myadd("java01");
dl.myadd("java02");
dl.myadd("java03");
dl.myadd("java04");
while(!dl.isEmpty())
{
System.out.println(dl.get());
}
}
}


class Demo
{


 public static void main(String[] args)
 {
LinkedList a2=new LinkedList();
a2.addFirst("java01");
a2.addFirst("java02");
a2.addFirst("java03");
//演示迭代器。在迭代过程中,准备添加或者删除元素
Iterator it=a2.iterator(); //迭代器只能移除
while(it.hasNext())
{
Object obj=it.next();
System.out.println(obj);
}


 }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值