黑马程序员—java技术blog—第四篇:List和Set的总结
来源:互联网 发布:淘宝刀创 编辑:程序博客网 时间:2024/06/02 05:03
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
一、List
1.List的特点:
List:有序(存入和取出的顺序一致,元素都有索引,元素可以重复)。
List:特有的常见方法:有一个共性特点就是可以操作角标。
2.List类的常用方法:
List list=new ArrayList();
(1).添加
void add(index,element);
list.add(1,"dad");
(2).删除
Object remove(index);
list.remove(1);
(3).修改元素q
Object set(index,element);
(4).获取:
Object get(index);
list.get(1);
int indexOf(object);
list.indexOf("dad");
List subList(from,to);
list.subList(0,2);
(5).List的取出元素的方法:
用都有的iterator方法:
Iterator it=coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
list特有的取出方法元素的方式之一:
for(int i=0;i<list.size();i++){
System.out.println("get:"+list.get(i));
}
注意:
在迭代器过程中,不要使用集合操作元素,容易出现异常。可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。
ListIterator it=list.listIterator();//获取列表迭代器对象
//它可以实现在迭代过程中完成对元素的增删改查。
//只有list集合具备该迭代功能。
while(it.hasNext()){
Object obj=it.next();
if(obj.equals("add")){
list.set("ddaf");
}
hasPrevious();//逆序
3.List:常用的子类对象
--Vector:内部是数组结构,是同步的。增删,查询都很慢。
Vector v=new Vector;
Enumeration en=v.elements();
//Enumeration接口与Iterator功能重复优先使用Iterator
While(en.hasMoreElements()){
System.out.prrintln("nextelment:"+en.nextElement());
}/
--ArrayList:内部是数组结构,不是同步的。替代Vector。查询的速度快。。
--LinkedList:内部是链表数据结构。增删元素非常快。
二、Set
1.Set的特点:
Set:元素不能重复,无序。
Set接口的方法和Collection一样。
2.常用子类:
(1)--HashSet:内部数据结构是哈希表,不是同步的。
哈希算法,用哈希算法对元素进行存储,并获取其位置。
查找时用哈希算法先算其位置。
//自定义哈希算法
哈希查找:先用哈希算法判断哈希值,哈希值相同在判断内容。
判断哈希值相同,其实判断的是对象的hashCode的方法,
判断内容相同,用的是equals方法。
HashSet存储
//往HashSet集合中存储Person对象。
如果姓名和年龄相同视为同元素。
//需要重写Person类中的hashCode()方法
public class HashSetTest{
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("lisi4",24));
hs.add(new Person("lisi7",27));
hs.add(new Person("lisi1",21));
Iterator it=hs.iterator();
while(it.hasNext()){
//System.out.println(((Person)it.next()).getName());
//System.out.println(((Person)it.next()).getAge());
//不要在一个循环里用两个.next()方法 容易出现异常
Person p=(Person)it.next();
System.out.println(p.getName()+p.getAge());
}
}
}
记住:如果元素存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
一般情况下,如果定义的类会产生很大对象。比如人 ,
学生,书,都需要equals,hashCode方法。
建立判断是否是相同的依据。
(2)TreeSet:可以对Set集合的元素进行排序。是不同步的。
判断元素的唯一性的方式:就是根据比较方法的返回结果
是否是0,是0,就是相同元素,不存。
//存入学员信息,根据年龄排序
public class TreeSetTest{
pubic static void main(String[] args){
TreeSet hs=new TreeSet();
hs.add(new Person("lisi4",24));
hs.add(new Person("lisi7",27));
hs.add(new Person("lisi1",21));
Iterator it=hs.iterator();
while(it.hasNext()){
//System.out.println(((Person)it.next()).getName());
//System.out.println(((Person)it.next()).getAge());//不要在一个循环里用两个.next()方法 容易出现异常
Person p=(Person)it.next();
System.out.println(p.getName()+p.getAge());
}
}
}
需要Person 实现Comparable接口中的compareTo()方法
public int compareTo(Object obj){
Person p=(Person) obj;
int temp=this.age-p.age;
return (temp==0)?this.name.compareTo(p.name):temp;
}
这段代码中
按照Person类的排序叫做自然排序。(就是按照实例化的那个对象排序调用实体化类的排序方法)
排序:
让元素自身具备比较功能,元素需要实现Comparable接口,覆盖compareTo方法
如果不要按照对象中具备的自然顺序排序或者对象不具备自然排序?
可以使用TreeSet集合的第二种排序方式:
让集合具备比较功能。定义一个类实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。
可以先创建一个比较器,在创建集合对象时调用比较器,这样在添加时就会调用比较器的方法。
题:对字符串长度排序。
代码:
import java.util.Iterator;
import java.util.TreeSet;
import java.util.Comparator;
public class ComparatorByLength implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO 自动生成的方法存根
String str1=(String)o1;
String str2=(String)o2;
if(str1.length()<str2.length()){
return -1;
}
else if(str1.length()==str2.length())
{
if(str1.equals(str2)){
return 0;
}
else return 1;
}
else return 1;
}
}
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
TreeSet hs=new TreeSet(new ComparatorByLength());
hs.add("ddjjd");
hs.add("dd");
hs.add("djd");
hs.add("d");
Iterator it=hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
} //d
} //dd
} //djd
// ddjjd
----- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>
- 黑马程序员—java技术blog—第四篇:List和Set的总结
- 黑马程序员—java技术blog—第四篇 IO流中其他流概述总结
- 黑马程序员—java技术blog—第六篇:IO流的总结
- 黑马程序员—java技术blog—第十三篇反射的基础概述与总结
- 黑马程序员java学习—集合框架List和Set
- 黑马程序员—java基础_集合List和Set
- 黑马程序员—java技术blog—第三篇:异常
- 黑马程序员—java技术blog—第八篇:反射
- 黑马程序员—java技术blog—第一篇:Date和Calendar类的使用方法
- 黑马程序员—java技术blog—第二篇:String 类的常用方法
- 黑马程序员—java技术blog—第九篇一些常见的基础语法概述
- 黑马程序员--java技术blog---第四篇:IO流(3)
- 黑马程序员—java技术blog—第一篇 IO概述及字节流总结
- 黑马程序员——Java基础—集合(Set、List)
- 黑马程序员——Java学习之Collection、List、Set
- 黑马程序员——集合类(list和set)(一)
- 黑马程序员——关于Set,List,Map集合的简单总结
- 黑马程序员——java基础拾遗之集合框架(一) List 和 Set
- SRM556题解(T3除外)
- Linux驱动的platform机制
- Poj2653
- Codeforces Round #253 (Div. 1)D题
- 2014 MySql安装图解
- 黑马程序员—java技术blog—第四篇:List和Set的总结
- UILabel设置多种字体、颜色
- 嵌入式软件开发工程师成长历程
- Poj1113
- oracle11g导9i后的问题
- HDU 4902Nice boat
- linux下svn常用指令
- Windows node.js npm install express -g Cannot find module 'express'
- iOS 面试题 (四)