黑马程序员之java中集合框架学习

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

集合的用途:
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式;
数组和集合类同是容器,有何不同:
数组虽然也可以存储对象,但是长度是固定的,集合长度是可变的;
数组中可以存储基本数据类型,集合只能存储对象。
集合特点:
集合只用存储对象,集合长度可变,集合可以存储不同类型的对象;
泛型(Generic):JDK1.5版本以后出现新特性,用于解决安全问题,是一个类型安全机制。
好处:1,将运行时期出现的问题转移到编译时期;让运行时问题减少,安全提高。
2,避免了强制类型转换。
List:集合中数据是有序的,可重复,有索引;
Set:数据无序,不可重复,无索引;
List:
特有方法:凡是可以操作角标的方法都是该体系特有的方法;
add(index,element);
addAll(index,Collection);
remove(index);
set(index,element);
get(index);
subList(from,to);
listIterator();
List集合特有的迭代器:ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常。

所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator方法有限,只能对元素进行判断,取出,删除的操作;

如果想要其他操作如添加,修改等,就需要使用其子接口ListIterator。该对象只能通过listIterator方法获取;

ArrayList(1.2):底层的数据结构使用的是数组结构,线程同步;特点,查询速度快,但是增删稍慢
LinkList:底层的数据结构使用的是链表结构,特点:增删的速度很快,查询稍慢;
Vector(1.0):底层是数组数据结构,线程同步的,被ArrayList替代;
枚举就是Vector特有的取出方式;枚举被迭代替换
Enumeration en = v.elements();en.hasMoreElements();en.nextElement();
List结合判断元素是否相同,依据的是元素的equals方法;
Set:数据无序(存入和取出的顺序不一定一致),不可重复
Set的功能和Collection功能一致
HashSet:底层结构是哈希表,只能用迭代器循环读取集合内元素
HashSet保证元素唯一性:是通过元素的两个方法:hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true;
如果元素的HashCode值不同,不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的HashCode和equals方法;
TreeSet:可以对Set集合中的元素进行排序;集合中元素不具备可比性时报:ClassCastException类型转换异常
底层数据结构是二叉树;保证元素唯一性的依据:compareTo方法返回0;
TresSet排序的第一种方式:让元素自身具备比较性,元素对应的类需要实现Comparable接口,覆盖compareTo方法,也称为元素的自然顺序;

第二种方式:当元素的自身不具备比较性时,或具备的比较性不是所学要的,这是需要让集合具备比较性;定义一个类,实现Comparator接口,实现compare方法;

在集合初始化时,就有了比较方式;让容器自身具备比较性,定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数;

当两种方式都存在时以比较器为主。
记住:排序时,当主条件相同时,一定判断一下次要条件,写在compareTo方法内
import java.util.*;
class ListDemo{
public static void method_1(){
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
sop("元集合:"+al);
//al.remove(2);
//al.set(2,"java07");
//通过角标获取元素
sop("get():"+al.get(1));
//获取所有元素
for(int x=0;x<al.size();x++){
sop("al("+x+")="+al.get(x));
}
Iterator it = al.iterator();
while(it.hasNext()){
sop("next:"+it.next();
}
//通过indexOf获取对象的位置
sop("index="+al.indexOf("java02"));
List sub = al.subList(1,3);
sop("sub="+sub);
}
public static void main(String[] args){
//演示列表迭代器
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
sop("元集合:"+al);
//在迭代过程中,准备添加或者删除元素
ListIterator li = al.listIterator();
while(li.hasNext()){
Object obj = li.next();
if(obj.equals("java02"){
li.add("java08");
//li.set("java005");
}
}
sop(al);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
/*
LinkedList特有方法:
addFirst();
addLast();
getFirst();
getLast();//获取元素不删元素,如果集合中没有元素会出现NoSuchElementException异常;
removeFirst();
removeLast();//获取元素并删除元素,如果集合中没有元素会出现NoSuchElementException异常;
在JDK1.6出现了替代方法:
offerFirst();
offerLast();//添加元素
peekFirst();
peekLast();//获取元素,但不删除,如果没有元素返回null;
pollFirst();
pollLast();//获取元素,但元素被删除,如果集合为空会返回null;
*/
class LinkedListDemo{
public static void main(String[] args){
/*
LinkecList ll = new LinkedList();
ll.addFirst("java01");
ll.addFirst("java02");
ll.addFirst("java03");
ll.addFirst("java04");
ll.addFirst("java05");
sop(link);
*/
//模仿堆栈
MyList my = new MyList();
my.myAdd("java01");
my.myAdd("java02");
my.myAdd("java03");
while(!my.isNull()){
sop(my.myGet());
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
class MyList{
private LinkedList link;

public void MyList(){
link = new LinkedList();

public void myAdd(Object obj){
link.addFirst(obj);
}
public Object myGet(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}
练习:TresSet排序的第一种方式,实现Comparable接口
import java.util.Iterator;

import java.util.TreeSet;

class Man implements Comparable{//该接口强制让Man具备比较性

private String name;
private int age;
Man(String name, int age){
this.name = name;
this.age = age;
}
public int compareTo(Object obj){
if(!(obj instanceof Man)){
throw new RuntimeException("不是学生对象");
}
Man man =  (Man)obj;
if(this.age>man.age)
return 1;
if(this.age==man.age)
return this.name.compareTo(man.name);
return -1;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
public class TreeSetTest {
public static void main(String[] args){
TreeSet ts = new TreeSet();
ts.add(new Man("zhang01",15));
ts.add(new Man("zhang02",35));
ts.add(new Man("zhang05",25));
ts.add(new Man("zhang04",25));
Iterator it = ts.iterator();
while(it.hasNext()){
Man man = (Man)it.next();
System.out.println(man.getName());
}
}
}


//TreeSet排序第二种方式,定义比较器
class MyComparator implements Comparator{
public int compare(Object o1,Object o2){
Man man1 = (Man)o1;
Man man2 = (Man)o2;
int num = man1.getName().compareTo(man2.getName());
if(num==0)
{
//将整数封装成Integer对象
return new Integer(man1.getAge()).compareTo(new Integer(man2.getAge()));
/*直接用整数进行大小比较
if(man1.getAge()>man2.getAge())
return 1;
if(man1.getAge()==man2.getAge())
return 0;
return -1;
*/
}
return num;
}
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值