黑马程序员-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,所以建议创建与集合长度相同的数组
- 黑马程序员-javaSE学习之集合框架
- 黑马程序员——JavaSE之集合框架一
- 黑马程序员——JavaSE之集合框架总结二
- 黑马程序员--java学习之集合框架
- 黑马程序员----JAVASE之集合操作【上】
- 黑马程序员----JAVASE之集合操作【下】
- 黑马程序员-javaSE学习之语言基础
- 黑马程序员-javaSE学习之面向对象
- 黑马程序员-javaSE学习之异常
- 黑马程序员-javaSE学习之IO流
- 黑马程序员-javaSE学习之网络编程
- 黑马程序员----集合之集合框架
- 黑马程序员--Java学习笔记之集合框架
- 黑马程序员—Java学习笔记之集合框架(一)
- 黑马程序员—Java学习笔记之集合框架(二)
- JAVASE之集合框架
- 黑马程序员--学习日记--集合框架
- 黑马程序员--集合框架学习小练习
- 印象笔记 - 记录生活的点点滴滴
- Strut.xml内的属性,action属性,package属性,(一)
- HDFS架构(二)
- apt包管理工具介绍
- Spring中JdbcTemplate实现
- 黑马程序员-javaSE学习之集合框架
- 图像的Log-Polar极坐标变换
- hadoop在ubuntu下的安装配置
- VC调用DLL
- Java对象序列化
- “黑暗面程序员”java中我们所熟知的四中排序算法
- Accelerated C++ Exercise 5-10(回文数)
- hadoop集群安装教程
- webService服务启动,客户端调用报错