为什么出现集合类?

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

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

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

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

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

Collection

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

|--ArrayList: 底层的数据结构使用的是数组结构.

特点:查询速度很快,但是增删稍慢.线程不同步所以速度快.

|--LinkedList: 底层使用链表数据结构. 特点:增删速度很快,查询稍慢.

|--Vector: 底层是数组数据结构.线程同步,所以速度超慢,被ArrayList替代了.

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

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

package pack;

import java.util.ArrayList;
import java.util.ListIterator; public class Demo {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("litiepeng");
al.add("chenhaigeng");
al.add("pengjie");
ListIterator<String> listIterator = al.listIterator();
while (listIterator.hasNext()) {
String next = listIterator.next();
System.out.println(next);
}
}
}

  

ArrayList可以通过iterator()迭代元素

在迭代时,不可以通过集合对象的方法操作集合中的元素.

因为会发生ConcurrentModificationException异常

所以,在迭代器,只能用迭代器的操作元素,

方法是有限的.只能对元素进行判断,取出删除操作.

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

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

package pack;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator; public class Demo {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("litiepeng");
al.add("chenhaigeng");
al.add("pengjie"); Iterator<String> iterator = al.iterator();
while(iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
} //ListIterator 是iterator的 子类, 他比父接口多了add set 方法 ListIterator<String> listIterator = al.listIterator();
while (listIterator.hasNext()) {
//
String next = listIterator.next();
listIterator.add("yanxiong");
System.out.println(next);
}
}
}

  

public ArrayList()

构造一个初始容量为 10 的空列表。 如果超过了就在创建一个新的数组,延长50%,把前面的复制在这后面,然后把新的添加再后面.

Vector:向量的大小大于其容量时,容量自动增加的量。

elements

枚举就是Vector特有的取出方式

发现枚举和迭代器很像

其实枚举和迭代是一样的

因为枚举的名称以及方法的名称过长

所以迭代器取代了.

枚举消失了.

LinkedList.pollFirst();和LinkedList.removeFirst();这两个的功能一样,移除后返回移除的元素,不过对于空链表,removeFirst()会返回异NoSuchElementException,pollFirst()直接返回null.一个报异常,一个返回0

当list集合是对象的话,要重写equals,因为底层比较元素是否相同用的是equals,

如果是基本数据元素就不用重写equals了

List集合判断元素是否相同,依据是元素的equals方法.

contains()  remove()底层是调用 equals比较的.

Set:

Set集合的功能和Collection是一致的.

Set:无序,不可以重复元素.

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

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

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

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

如果元素的hashcode值不同,不会调用equals.

注意,对于判断元素是否存在,以及删除remove()和是否包含contains()等操作,依赖的方法是元素的hashCode和equalse方法.

package pack;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.concurrent.ArrayBlockingQueue; public class Demo{
public static void main(String[] args) {
ArrayList<Student> al = new ArrayList<Student>();
System.out.println(al instanceof ArrayList); al.add(new Student("张三", 21));
al.add(new Student("赵六", 22));
al.add(new Student("王武", 23));
al.add(new Student("王武", 23)); for (Student student : al) {
System.out.println(student.toString());
} HashSet<Student> hs = new HashSet<Student>();
hs.add(new Student("张三", 21));
hs.add(new Student("赵六", 22));
hs.add(new Student("王武", 23));
hs.add(new Student("王武", 23)); for (Student student : hs) {
System.out.println(student.toString());
}
}
} class Student{
String name;
int age; Student(String name,int age){
this.name = name;
this.age = age;
}

    //重写equals
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub if(this == obj)
return true; if(obj == null)
return false; if(!(obj instanceof Student))
return false; Student s2 = (Student) obj;
return new Integer(this.age).equals(new Integer(s2.age)); } @Override
public String toString() {
// TODO Auto-generated method stub
return "name:"+name+"age:"+age;
}
}

  

|--TreeSet :可以对Set集合中的元素进行排序.

底层数据结构是二叉树.

保证元素唯一性的依据.

compareTo方法ret urn0;

TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法.这种方式也成为元素的自然顺序,也叫叫做默认顺序.

TreeSet的第二种排序方式

把比较对象作为构造函数的参数传递进去. 让那个参数实现Comparator 接口覆盖compareto方法

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

这是就需要让集合自身具备比较性.

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数

里面增加的自定义值必须能自动排序,如果不能自动排序,就会报错误,Comparable

当两种排序都存在时,以比较器为主

//创建构造器

package pack;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; public class TreeSetDemo { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<Computer> ts = new TreeSet<Computer>(new myComparator());
ts.add(new Computer("zhangsan", ));
ts.add(new Computer("zhaosi", ));
ts.add(new Computer("xiaosi", )); Iterator<Computer> iterator = ts.iterator();
while (iterator.hasNext()) {
Computer computer = iterator.next();
System.out.println(computer.toString());
}
} }
//简单构造器,比较字符串大小
class myComparator implements Comparator { public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
Computer s1 = (Computer) o1;
Computer s2 = (Computer) o2; int num = new Integer(s1.age).compareTo(new Integer(s2.age));
if (num == ) {
return s1.name.compareTo(s2.name);
} return num;
}
} // 有泛型
class myComparator2 implements Comparator<String> { public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int num = new Integer(o1.length()).compareTo(new Integer(o2.length()));
if (num == ) {
return o1.compareTo(o2);
} return num;
}
} class Computer {
Computer(String name, int age) {
this.name = name;
this.age = age;
} String name;
int age; @Override
public String toString() {
// TODO Auto-generated method stub
return "name:" + name + " age" + age;
}
}

//实现comparable接口

//实现comparable接口    使用在set里面
class Student implements Comparable{ String name;
int age; Student(String name,int age){
this.name = name;
this.age = age;
} public int compareTo(Object obj) {
// TODO Auto-generated method stub
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象"); Student s = (Student)obj; if(this.age>s.age){
return 1;
}
if(this.age == s.age){
return this.name.compareTo(s.name);
}
return -1;
}
}

java集合框架list和set的更多相关文章

  1. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  2. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  3. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  4. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  5. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  6. 22章、Java集合框架习题

    1.描述Java集合框架.列出接口.便利抽象类和具体类. Java集合框架支持2种容器:(1) 集合(Collection),存储元素集合 (2)图(Map),存储键值对.

  7. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  8. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  9. Java集合框架

    集合框架体系如图所示 Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包. Map接口的常用方法 Map接口提 ...

  10. Java集合框架(常用类) JCF

    Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...

随机推荐

  1. mongoDB7--游标cursor

    之前我们学习了"增删改查"四中语法和查询表达式的深入学习,我们已经掌握了一定的操作mongodb数据的能力,那么接下来我们就要考虑我们的操作的效率问题了.(1)游标介绍如果我们查询 ...

  2. 10682 deathgod想知道的事(数论)

    10682 deathgod想知道的事 该题有题解 时间限制:1000MS  内存限制:65535K提交次数:265 通过次数:14 题型: 编程题   语言: G++;GCC Description ...

  3. HDU 3452 Bonsai

    可以转化成最小割的求解,题目其实就是要求把点分成两个集合,增加一个超级汇点,一部分的点在根节点所在集合内,一部分节点在超级汇点所在的集合内,这两就分开了,又要求费用最小,那么就是最小割. #inclu ...

  4. Spring 框架理论基础

    一. IOC 控制反转 概念解释:当我需要一个资源时,容器已经帮我准备好,我只需要接受就可以. // 加载 IOC 容器 ApplicationContext ac = new ClassPathXm ...

  5. gerrit review 设置

    $ git config remote.review.pushurl "ssh://someone@ip:29418/the_project" $ git config remot ...

  6. 【python问题系列--1】SyntaxError:Non-ASCII character '\xe5' in file kNN.py on line 2, but no encoding declared;

    因为Python在默认状态下不支持源文件中的编码所致.解决方案有如下三种: 一.在文件头部添加如下注释码: # coding=<encoding name> 例如,可添加# coding= ...

  7. rollout

    #! /bin/ksh #  设置环境变量 ############### ###   UAT   ### ############### export ENVS=/test/change/env/e ...

  8. Tree Restoring

    Tree Restoring Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem Statement Aoki lo ...

  9. OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

    OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符. ...

  10. NumPy基础:数组和矢量计算

    今天被老板fire了,还是继续抄书吧,安抚我受伤的小心脏.知识还是得慢慢积累,一步一个脚印,这样或许才是最快的捷径. ------2015-2-16-------------------------- ...