Java面向对象  集合(上)

知识概要:

            (1)体系概述

(2)共性方法

(3)迭代器

(4)list集合

(5)Set 集合





体系概述:

             集合类

 为什么出现集合类?

• 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多 个对象的操作,就对对象进行存储,集合就

是存储对象最常用的一 种方式。

数组和集合类同是容器,有何不同?

•  数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。

         数组中可以存储基本数据类型,集合只能存储对象。

 集合类的特点

•  集合只用于存储对象,集合长度是可变的,集合可以存储不同类型 的对象。

集合的体系结构图

    



List接口中常用类

Vector     :  线程安全,但速度慢,已被 ArrayList替代。

 ArrayList  :  线程不安全,查询速度快。

 LinkedList:  链表结构,增删速度快。

Collection定义了集合框架的共性功能。



1,添加

            add(e);

            addAll(collection);

2,删除  

            remove(e);

            removeAll(collection);

            clear();

3,判断。

           contains(e);

           isEmpty();

4,获取

           iterator();

           size();

5,获取交集。

           retainAll();

6,集合变数组。

          toArray();

1,add方法的参数类型是Object。以便于接收任意类型对象。

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

Collection

         |--List:元素是有序的,元素可以重复。因为该集合体系有索引。

               |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。

               |--LinkedList:底层使用的链表数据结构。            特点:增删速度很快,查询稍慢。线程不同步。

               |--Vector:底层是数组数据结构。                         特点:线程同步。被ArrayList替代了。因为效率低。

|--Set:元素是无序,元素不可以重复。

List:

        特有方法。凡是可以操作角标的方法都是该体系特有的方法。



       add(index,element);

       addAll(index,Collection);



       remove(index);



       set(index,element);



       get(index):

       subList(from,to);

listIterator();

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

ListIterator listIterator();

List集合特有的迭代器。    ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。

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

删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

该接口只能通过List集合的listIterator方法获取。

什么是迭代器呢?

其实就是集合的取出元素的方式。如同抓娃娃游戏机中的夹子。

迭代器是取出方式,会直接访问集合中的元素。

      所以将迭代器通过内部类的形式来进行描述。

      通过容器的iterator()方法获取该内部类的对象。

迭代注意事项

 迭代器在Collcection接口中是通用的,它替 代了Vector类中的Enumeration(枚举)。

  迭代器的next方法是自动向下取元素,要避出现NoSuchElementException。

  迭代器的next方法返回值类型是Object,所以要记得类型转换。

让我们先来看一个类Vector

import java.util.*;

/*
枚举就是Vector特有的取出方式。
发现枚举和迭代器很像。
其实枚举和迭代是一样的。 因为枚举的名称以及方法的名称都过长。
所以被迭代器取代了。
枚举郁郁而终了。 */
class VectorDemo
{
public static void main(String[] args)
{
Vector v = new Vector(); v.add("java01");
v.add("java02");
v.add("java03");
v.add("java04"); Enumeration en = v.elements(); while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
}
}
class  CollectionDemo
{
public static void main(String[] args)
{ method_get();
}
public static void method_get()
{
ArrayList al = new ArrayList(); //1,添加元素。
al.add("java01");//add(Object obj);
al.add("java02");
al.add("java03");
al.add("java04"); /*
Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。 while(it.hasNext())
{
sop(it.next());
}
*/ for(Iterator it = al.iterator(); it.hasNext() ; )
{
sop(it.next());
}
} public static void method_2()
{
ArrayList al1 = new ArrayList(); al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
ArrayList al2 = new ArrayList(); al2.add("java03");
al2.add("java04");
al2.add("java05");
al2.add("java06"); //al1.retainAll(al2);//去交集,al1中只会保留和al2中相同的元素。
al1.removeAll(al2); sop("al1:"+al1);
sop("al2:"+al2); } public static void base_method()
{
//创建一个集合容器。使用Collection接口的子类。ArrayList
ArrayList al = new ArrayList(); //1,添加元素。
al.add("java01");//add(Object obj);
al.add("java02");
al.add("java03");
al.add("java04"); //打印原集合。
sop("原集合:"+al); //3,删除元素。
//al.remove("java02");
//al.clear();//清空集合。 //4,判断元素。
sop("java03是否存在:"+al.contains("java03"));
sop("集合是否为空?"+al.isEmpty()); //2,获取个数。集合长度。
sop("size:"+al.size()); //打印改变后的集合。
sop(al); }




LinkedList:特有方法:

    
    addFirst();
   

    addLast();
    
    getFirst();
    

    getLast();
   
    获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
    removeFirst();

    removeLast();

    获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException


    在JDK1.6出现了替代方法。
    offerFirst();

  
    offerLast();


    peekFirst();


    peekLast();

    获取元素,但不删除元素。如果集合中没有元素,会返回null。
    pollFirst();

    pollLast();

    获取元素,但是元素被删除。如果集合中没有元素,会返回null。


 

LinkedList举例

/*
使用LinkedList模拟一个堆栈或者队列数据结构。 堆栈:先进后出 如同一个杯子。
队列:先进先出 First in First out FIFO 如同一个水管。 */ import java.util.*;
class DuiLie
{
private LinkedList link; DuiLie()
{
link = new LinkedList();
} public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
return link.removeFirst();
}
public boolean isNull()
{
return link.isEmpty();
} } class LinkedListTest
{
public static void main(String[] args)
{
DuiLie dl = new DuiLie();
dl.myAdd("java01");
dl.myAdd("java02");
dl.myAdd("java03");
dl.myAdd("java04"); while(!dl.isNull())
{
System.out.println(dl.myGet());
}
}
}
Set集合

              |--HashSet:
                                  数据结构是哈希表。线程是非同步的。

                                       保证元素唯一性的原理:判断元素的hashCode值是否相同。

                                             如果相同,还会继续判断元素的equals方法,是否为true。
             |--TreeSet:
                                  可以对Set集合中的元素进行排序。

                                             底层数据结构是二叉树。

                                                    保证元素唯一性的依据:

                                                         compareTo方法return 0.
  
    TreeSet排序
 
    第一种方式:让元素自身具备比较性。

    元素需要实现Comparable接口,覆盖compareTo方法。

    也种方式也成为元素的自然顺序,或者叫做默认顺序。

    第二种排序方式。

    当元素自身不具备比较性时,或者具备的比较性不是所需要的。

    这时就需要让集合自身具备比较性,定义结合比较器comparator, 在集合初始化时,就有了比较方式。

HashSet是如何保证元素唯一性的呢?

       是通过元素的两个方法,hashCode和equals来完成。

       如果元素的HashCode值相同,才会判断equals是否为true。

       如果元素的hashcode值不同,不会调用equals。
       注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

代码演示

import java.util.*;

/*
往hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素。
*/
class HashSetTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
HashSet hs = new HashSet(); hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
// hs.add(new Person("a2",12));
// hs.add(new Person("a4",14)); //sop("a1:"+hs.contains(new Person("a2",12))); // hs.remove(new Person("a4",13)); Iterator it = hs.iterator(); while(it.hasNext())
{
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
} public int hashCode()
{
System.out.println(this.name+"....hashCode");
return name.hashCode()+age*37;
} public boolean equals(Object obj)
{ if(!(obj instanceof Person))
return false; Person p = (Person)obj;
System.out.println(this.name+"...equals.."+p.name); return this.name.equals(p.name) && this.age == p.age;
} public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
TreeSet集合排序示例

import java.util.*;

/*
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。 当两种排序都存在时,以比较器为主。 定义一个类,实现Comparator接口,覆盖compare方法。 */
class Student implements Comparable//该接口强制让学生具备比较性。
{
private String name;
private int age; Student(String name,int age)
{
this.name = name;
this.age = age;
} public int compareTo(Object obj)
{ //return 0; if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj; //System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
/**/
} public String getName()
{
return name; }
public int getAge()
{
return age;
}
}
class TreeSetDemo2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(); ts.add(new Student("lisi02",22));
ts.add(new Student("lisi02",21));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi06",18));
ts.add(new Student("lisi06",18));
ts.add(new Student("lisi007",29));
//ts.add(new Student("lisi007",20));
//ts.add(new Student("lisi01",40)); Iterator it = ts.iterator();
while(it.hasNext())
{
Student stu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
} class MyCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2; int num = s1.getName().compareTo(s2.getName());
if(num==0)
{ return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
/*
if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;
*/
} return num; }
}








Java面向对象 集合(上)的更多相关文章

  1. Java面向对象 集合(中)

     Java面向对象 集合(中) 知识概要:                   (1)泛型的体系概念 (2)泛型的特点 (3)自定义泛型类 泛型的体系概念           泛型:JDK1.5版 ...

  2. Java面向对象 集合(下)

      Java面向对象 集合(下) 知识概要:               (1)Map集合的体系结构 (2)Map集合的方法 (3)HashMap TreeMap (4)集合框架中的常用工具类 ( ...

  3. java面向对象(上)

    一.一些重要的概念理解 Java是面向对象的程序设计语言,提供了类,成员变量,方法等的基本功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量.它会引用到类的 ...

  4. 第三章 Java面向对象(上)

    3.1.概述 概述:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象则是将功能封装进对象,强调具备功能的对象,面向对象是基于面向过程的.面向对象的三大特征 ...

  5. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  6. 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)

    091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  7. 111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现

    111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现 本文知识点: 继承的实现 说明:因为时间紧张,本人写博客过程中只是对知识点 ...

  8. java面向对象编程(上)

    java面向对象学习的三条主线 1.Java类及类的成员:属性.方法.构造器.代码块.内部类 2.面向对象的三大特征:封装性.继承性.多态性.(抽象性) 3.其它关键字:this.super.stat ...

  9. 程序设计基础·Java学习笔记·面向对象(上)

    Java程序设计基础之面向对象(上) (自适应学习进度而进行记录的笔记,希望有一些小小的用处吧(^∀^●)ノシ) (新人上路,望多指教,如有错误,望指正,万分感谢(o゚v゚)ノ) 目录 一.面向对象 ...

随机推荐

  1. Linux — 用户组、权限

    Linux 用户组分为:所有者.所在组.其他组 所有者:谁创建,谁是所有者.命令:ls -al 所在组:当创建文件或者文件夹时,这个文件或者文件夹所分配到的用户组,这样就会有效地隔离文件. 其他组:和 ...

  2. dubbo+zookeeper伪集群配置

    zookeeper作为注册中心,服务器和客户端都要访问,如果有大量的并发,肯定会有等待.所以可以通过zookeeper集群解决. 一.为什么需要zookeeper呢? 大部分分布式应用需要一个主控.协 ...

  3. php的mysql语句里变量加不加单引号问题

    第一种[{$_GET['id']}加不加单引号都能正常执行没问题] $sql = "select * from `news` where `id` = {$_GET['id']}" ...

  4. 在对话框中利用CToolBar类添加工具条的方法

    UINT BASED_CODE DockTool[]={ID_NEWGAME,ID_SAVE,ID_OPEN,ID_SEPARATOR,ID_COPYFEN,ID_PASTEFEN,ID_SEPARA ...

  5. python--简易购物车实现

    目标要求: 1.用户输入购物预算 2.打印商品清单,由用户选择,预算够则购买,不够则提示 3.输入q,退出程序 4.购物结束,显示购买的东西和余额 实现: 1.用列表存储商品及价格信息 2.建立空列表 ...

  6. 【1414软工助教】团队作业7——Alpha冲刺之事后诸葛亮 得分榜

    题目 团队作业7--Alpha冲刺之事后诸葛亮 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析& ...

  7. 201521123008《Java程序设计》第五周实验总结

    1.本章学习总结 2.书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 不能.Sy ...

  8. java程序设计----学生基本信息管理系统

    1. 团队课程设计博客链接 http://www.cnblogs.com/hyy786030686/p/7063890.html 2. 个人负责模块或任务说明 --登录界面的设计 --用户名和密码验证 ...

  9. Vagrant下共享目录下静态文件(js/jpg/png等)修改完运行报错

    利用Vagrant部署开发环境,使用目录共享模式,在本地磁盘进行开发,通过虚拟机环境运行开发的页面. 接下来打开页面,看上去一切正常,接下来将发生一个神奇的事情,你修改一个css文件,在刷新浏览器,发 ...

  10. smtp模块使用

    import smtplib from email.mime.text import MIMEText from bs4 import BeautifulSoup from urllib.reques ...