黑马程序员-javaSE学习之集合框架

来源:互联网 发布:arena仿真软件下载 编辑:程序博客网 时间:2024/05/22 01:37

------- android培训、java培训、期待与您交流! ----------

①集合的由来:对象用于存储以及封装数据,当对象多了之后,如果对象的个数不确定,我们就是用集合容器进行存储。其特点包括:

1.用于存储对象的容器

2.集合的长度是可变的

3.集合中不可以存储基本数据类型值

②集合框架的由来:集合容器因为内部的数据结构不同,可以有多种具体容器,不断的向上抽取,就形成了集合框架。得到的最终根接口是Collection,其常见方法有:

1.添加

boolean add(Object obj)添加一个对象

boolean addAll(Collection coll)添加一堆对象,即一个集合对象中的所有对象

2.删除

boolean remove(Object obj)移除一个对象

boolean removeAll(Collection coll)两个集合对象中元素的共有元素从调用removeall的集合对象中删除

void clear()移除所有对象

3.判断

boolean contains(Object obj)集合中是否包含这个对象

boolean contains(Collection coll)集合中是否包含这一堆对象元素,即一个集合对象

boolean isEmpty()判断集合中是否有元素

4.获取

int size()获取容器的长度

Iterator iterator()取出元素的方式:迭代器

5.其他

boolean retainAll(Collection coll)获取两个容器中的交集元素,即两个集合中相同的元素

Object[] toArray()将集合转成数组

迭代器的使用:

Collection Coll=new ArrayList();

Coll.add(“abc1”);

Coll.add(“abc2”);

Coll.add(“abc3”);

Coll.add(“abc4”);

for(Iterator it=coll.iterator();it.hasNext(); ){

System.out.println(it.next());

}

输出abc1

abc2

abc3

abc4

colletion分类:

List:有序(存入和取出一致),元素都有角标,,元素可以重复

Set:元素不能重复。

List常见方法:除了实现了Collection的方法以外

1.添加:

void add(int index,Object obj)在指定位置插入指定元素,后面的元素向后移动

void addAll(int index,Collection coll) 将所有元素插入到指定位置

2.删除

Object remove(int index)返回的是删除指定位置的对象

3.修改

Object set(int index,Object obj)修改指定位置的指定元素的值//List特有的

4.获取

Object get(int index)获取指定位置的元素值//List特有的取出值的方式

int indexOf(Object obj)获取指定的元素的指定位置

int lastIndexOf(Object obj)获取指定元素的最后出现位置

List subList(int begin,int end)获取从开始位置到结束位置的元素,包含开始的元素,不包含结束的元素

④迭代器Iterator与列表迭代器ListIterator经典例子:当我们想要在迭代的过程中完成增删改查的操作

对于Iterator

List list=new ArrayList();

 list.add("abc1");

 list.add("abc2");

 list.add("abc3");

 list.add("abc4");

 System.out.println("list:"+list);

Iterator it=list.iterator();//获取迭代器对象

while(it.hasNext())

{

Object obj=it.next();//ConcurrentModificationException

if(obj.equals("abc2"))//在迭代的过程中,同时又要执行集合的增加元素的功能,此时就会报错,即“无法并发执行”

{                      //解决的办法就是要么用集合操作不迭代,要么在迭代的过程中不做集合的操作。我们可以使用Iterator的子接口ListIterator

list.add("abc5");//来完成在迭代中对元素的增删改查等更多的操作。

}

}

System.out.println("list:"+list);

对于ListIterator

List list=new ArrayList();

 list.add("abc1");

 list.add("abc2");

 list.add("abc3");

 list.add("abc4");

 System.out.println("list:"+list);

ListIterator it=list.listIterator();//获取列表迭代器对象

//它可以实现在迭代过程中的增删改查

//注意:只有List具有这个功能

while(it.hasNext())

{

Object obj=it.next();

if(obj.equals("abc2"))

{

it.set("abc6");//迭代的过程中将abc2改为abc6

it.add("abc5");//迭代的过程中将abc5插入到abc6之后。

//it.set("abc6");

}

}

System.out.println("list:"+list);

List接口下常用的子类的特点:

vector:内部是数组数据结构,连续存储,长度可变,100%延长(一般数组长度不可变),是同步的(安全的)。1.0开始出现,在List接口出现之前就出现了。增删,查询都很慢。

ArrayList:内部是数组数据结构,长度可变,50%延长,是不同步的。替代了vector。查询的速度非常快,但是增删改查不快,初始化时其长度是10

ArrayList案例:①ArrayList集合存储自定义对象:

Person.java中:

public class Person 

{

private String name;

private int age;

public Person(String name,int age)

{

this.name=name;

this.age=age;

}

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

}

ArrayListDemo.java中:

public class ArrayListDemo 

{

public static void main(String[] args)

{

ArrayList list=new ArrayList();

list.add(new Person("王五",23));//此处默认的将Person对象向上转型成为了Object类型的了。因为add中的参数时Object类型

list.add(new Person("毕老师",24));

list.add(new Person("张三",24));

list.add(new Person("李四",22));

Iterator it=list.iterator();

while(it.hasNext())

{

Person p=(Person)it.next();//注意这里需要将Object类型做向下转型,转成Person类型

System.out.println(p.getName()+"的年龄是"+p.getAge()+"岁");

}

}

}

②ArrayList实现自定义对象存储唯一性

public class ArrayListDemo 

{

public static void main(String[] args)

{

ArrayList list=new ArrayList();

list.add(new Person("王五",23));//此处默认的将Person对象向上转型成为了Object类型的了。因为add中的参数时Object类型

list.add(new Person("毕老师",24));

list.add(new Person("张三",24));

list.add(new Person("李四",22));

list.add(new Person("李四",22));

Iterator it=list.iterator();

while(it.hasNext())

{

Person p=(Person)it.next();//注意这里需要将Object类型做向下转型,转成Person类型

System.out.println(p.getName()+"的年龄是"+p.getAge()+"岁");

}

ArrayList ls=getElements(list);

Iterator it2=ls.iterator();

while(it2.hasNext())

{

Person p2=(Person)it2.next();//注意这里需要将Object类型做向下转型,转成Person类型

System.out.println(p2.getName()+"的年龄是"+p2.getAge()+"岁");

}

}

public static ArrayList getElements(ArrayList list)

{

ArrayList ls=new ArrayList();

Iterator it=list.iterator();

while(it.hasNext())

{

Object obj=it.next();//由于在前面的代码中我们将对象的类型转换成了Person类型,所以这里必须将对象类型再转换为Object

if(!(ls.contains(obj)))

{

ls.add(obj);

}

}

return ls;

}

}

LinkedList:内部是链表数据结构,是不同步的。增删元素速度非常快,但是查询相对不快。

LinkedList面试题:请用LinkedList模拟一个堆栈或者队列数据结构

堆栈:先进后出,First In Last Out,FILO

队列:先进先出,First In First Out,FIFO

LinkedList常用方法(本身特有):

1.添加:

void addFirst(Object obj);

void addLast(Object obj);

jdk1.6

Object offerFirst();

Object offerLast();

2.获取:

Object getFirst();//获取但不移除,如果链表为空则抛出NoSuchElementException异常

Object getLast();

jdk1.6

Object peekFirst();//获取但不移除,如果链表为空,则返回null

Object peekLast();

3.删除:

Object removeFirst();//获取并移除,如果链表为空则抛出NoSuchElementException异常

Object removeLast();

jdk1.6

Object poolFirst();//获取并移除,如果链表为空,则返回null

Object poolLast();

set接口下常用的子类的特点:set接口中的方法和Collection接口中方法一致

HashSet:内部数据结构是哈希表

哈希表确定两个元素是否相同

①:判断两个元素的哈希值值是否相同。如果相同,再判断两个元素的内容是否相同

②:判断哈希值相同,其实判断的是两个对象的hashCode的方法返回的值是否相同;判断内容就是使用equals方法。如果哈希值不同就不需要判断内容

事例:HashSet自定义对象存储,以Person为例:在此过程中我们需要重写hashCode方法和equals方法

程序名:Person.java

public class Person 

{

private String name;

private int age;

public Person(String name,int age)

{

this.name=name;

this.age=age;

}

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

public int hashCode()

{

System.out.println(name+":"+age);

return name.hashCode()+age;

}

public boolean equals(Object obj)

{

System.out.println(name+"..equals.."+age);

Person p=(Person)obj;

return this.name.equals(p.name) && this.age == p.age;

}

}

程序名:HashDemo.java

public class HashDemo

{

public static void main(String[] args)

{

HashSet hs=new HashSet();

hs.add(new Person("张三",23));

 

hs.add(new Person("李四",24));

hs.add(new Person("王五",25));

hs.add(new Person("毕老师",26));

Iterator it=hs.iterator();

while(it.hasNext())

{

Person p=(Person)it.next();

System.out.println(p.getName()+"的年龄是"+p.getAge()+"岁");

}

}

}

TreeSet:可以对set集合的元素(无论是数字还是字母甚至字符)进行排序,非同步。

TreeSet判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0就是相同元素,不存。

TreeSet对元素进行排序的方式一:让元素自身具备比较功能,元素就要实现Comparable接口,覆盖CompareTo方法。

如果不要按照对象中具备的自然元素进行排序。如果对象不具备自然顺序,怎么办?

此时我们使用TreeSet的第二种排序方式:让集合自身具备这种功能。定义一个类,让其实现comparable接口,将该类对象作为参数,传给TreeSet集合的构造函数

Map集合框架(Map接口):

Map集合与Collection集合的区别:

Map集合一次添加一对元素,Collection一次只添加一个元素

Map集合也称为双列集合,其实Map集合中就是键值对,该集合必须保证键的唯一性。Collection也称为单列集合。

 

Map集合常用方法:

①添加

value put(key,value) 返回一个和key相关的值,如果没有返回null

②删除

void clear()  清空集合元素

value Remove(key)  根据key删除这一个键值对

③判断

boolean containsKey(key)

boolean containsValue(value)

boolean isEmpty()

④获取

value getKey(key)根据键返回值,如果没有键返回null,当然可以通过返回的null值来判断是否包含指定键。

int size()  返回键值对的个数

Map常用的子类:

Hashtable:内部结构是哈希表,是同步的。不允许null作为键,null作为值

子类Properties类:用来存储键值对类型的配置文件信息。可以和IO技术相结合。

HashMap:内部结构是哈希表,不是同步的。允许null作为键值

TreeMap:内部结构是二叉树,不是同步的,可以对Map集合中的键进行排序。

 

集合的一些技巧:


                                                                                                                         集合使用分类图解 

 

⑧集合框架工具类:提供的都是静态方法

Collections

Arrays

asList():将数组转成List集合,要注意以下两点:

①当数组中存储的元素是对象时,转成集合时,直接将数组中的元素作为集合中的元素作为集中存储。

②当数组中的元素是基本数据类型的数据时,就会将该数组作为集合中的元素进行存储。

toArray():参数中需要传入一个指定类型的数组,如果指定数组的长度小于集合的长度,那么该方法会创建一个该类型与集合长度相同的数组;如果指定数组的长度大于集合的长度,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null,所以建议创建与集合长度相同的数组


原创粉丝点击