13. 集合框架

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

  迭代器:集合的取出元素的方式

 import java.util.ArrayList;
import java.util.Iterator; public class Demo{
public static void main(String[] args) {
//创建一个集合容器,使用Collection接口的子类:ArrayList
ArrayList al1 = new ArrayList();
ArrayList al2 = new ArrayList(); //添加元素
al1.add("java01");
al1.add("java02");
al1.add("java03"); al2.add("java01");
al2.add("java02");
al2.add("java05"); //删除元素
al1.remove("java02"); //获取元素个数(集合长度)
al1.size(); //清空集合
al1.clear(); //判断元素
al1.contains("java03"); //判断集合是否为空
al1.isEmpty(); //取交集
al1.retainAll(al2); //获取迭代器,用于取出集合中的元素
Iterator it = al1.iterator();
while(it.hasNext()){
System.out.println(it.next());
} }
}

Collection

  |--List:元素是有序的,元素可以重复。因为该集合体系有索引。判断元素是否相同,依据元素的equals方法。

    |--ArrayList:底层使用的数组数据结构。查询速度很快,但是增删稍慢。不是同步的。默认长度为10。超过10则延长50%。

    |--LinkedList:底层使用的链表数据结构。增删速度很快,但是查询速度稍慢。

    |--Vector:底层使用的是数组数据结构。是同步的。被ArrayList替代了。超过10则延长100%,变为20。

  |--Set:元素是无序的(存入和取出的顺序不一致),元素不可以重复

    |--HashSet:底层使用的是Hash表,通过hashCode和equals两个方法来保证元素唯一性。如果元素的hashCode值相同,才会判断equals是否为true。 如果元素的hashCode值不同,则不会调用equals。线程时非同步的。

    |--TreeSet:底层使用的是二叉树,可以对set集合中的元素进行排序。compareTo()方法return 0 能保证元素唯一性。TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖CompareTo方法,这种方式也成为元素的自然顺序,或默认顺序;第二种方式:当元素自身不具备比较性,或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。定义比较器,将比较器作为参数传递给TreeSet集合的构造函数。当两种排序都存在时,以比较器为主。

比较器的定义方法:定义一个类,实现Comparator接口,覆盖Compare方法。

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

  增:add(index, element);   addAll(index, Collection);

  删:remove(index);

  改:set(index, element);

  查:get(index);   subList(from, to);   listIterator();

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

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常,所以在迭代时,只能用迭代器的方法操作元素,可是Iterator方法有限,只能对元素进行判断,取出,删除的操作。如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的ListIterator方法获取。

Vector中的枚举:Vector特有的取出方式,与迭代器相像。被迭代器取代了。

 import java.util.Enumeration;
import java.util.Vector; public class Demo{
public static void main(String[] args) {
Vector v = new Vector(); v.add("java01");
v.add("java02");
v.add("java03"); Enumeration en = v.elements(); while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
}
}

LinkedList特有方法:

  addFirst();   addLast();

  getFirst();   getLast();   获取元素,但不删除元素。如果列表为空,则抛NoSuchElementException异常。

  removeFirst();   removeLast();    获取元素,也删除元素。如果列表为空,则抛NoSuchElementException异常。

  JDK1.6后出现的替代方法:

  offerFirst();  offerLast();

  peekFirst();  peekLast();    获取元素,但不删除元素。如果列表为空,则返回null。

  pollFirst();    pollLast();   获取元素,也删除元素。如果列表为空,则返回null。

使用LInkedList模拟一个堆栈或者队列的数据结构

 import java.util.LinkedList;

 class DuiLie{
private LinkedList link;
DuiLie(){
link = new LinkedList();
} public void myAdd(Object obj){
link.addFirst(obj);
} public Object myGet(){
return link.removeLast();
} public boolean isNull(){
return link.isEmpty();
}
}
public class Demo{
public static void main(String[] args) {
DuiLie dl = new DuiLie(); dl.myAdd("java01");
dl.myAdd("java02");
dl.myAdd("java03"); while(!dl.isNull())
System.out.println(dl.myGet());
}
}

去除ArrayList集合中的重复元素:

 import java.util.ArrayList;
import java.util.Iterator; public class Demo{
public static void main(String[] args) {
ArrayList al = new ArrayList(); al.add("java01");
al.add("java02");
al.add("java01");
al.add("java03");
al.add("java02");
al.add("java04");
System.out.println(al); al = singleElement(al);
System.out.println(al);
} public static ArrayList singleElement(ArrayList al){
ArrayList newAl = new ArrayList(); Iterator it = al.iterator(); while(it.hasNext()){ Object obj = it.next(); if(!newAl.contains(obj)){ newAl.add(obj);
}
}
return newAl;
}
}

输出结果:

[java01, java02, java01, java03, java02, java04]
[java01, java02, java03, java04]

注:在迭代时,循环中next调用一次,就要hasNext判断一次。

将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

例如:存储人对象。同姓名,同年龄,就视为同一个人,为重复元素。

 import java.util.ArrayList;
import java.util.Iterator; class Person{
private String name;
private int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public boolean equals(Object obj){
if(!(obj instanceof Person)) return false;
Person p = (Person)obj;
return p.name.equals(this.name) && p.age == this.age;
}
}
public class Demo{
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add(new Person("ztq01", 20));
al.add(new Person("ztq02", 21));
al.add(new Person("ztq03", 22));
al.add(new Person("ztq03", 22));
al.add(new Person("ztq05", 24)); al = singleElement(al);
Iterator it = al.iterator();
while(it.hasNext()){
Person p = (Person)it.next();
System.out.println(p.getName() + "..." + p.getAge());
}
}
public static ArrayList singleElement(ArrayList al){
ArrayList newAl = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();
if(!newAl.contains(obj)){
newAl.add(obj);
}
}
return newAl;
}
}

输出结果:

ztq01...20
ztq02...21
ztq03...22 
ztq05...24

将自定义对象作为元素存到HashSet集合中,并去除重复元素。

例如:存储人对象。同姓名,同年龄,就视为同一个人,为重复元素。

复写hashCode()和equals()方法:其中equals同上。

public int hashCode(){
return name.hashCode() + age;
}

注:对于判断元素是否存在,以及删除等操作,依赖的方法时元素的hashCode()和equals()

往TreeSet集合中存储自定义对象学生,想按照学生的年龄进行排序。

注:排序时,当主要条件相同时,一定要判断一下次要条件。

 import java.util.Iterator;
import java.util.TreeSet; class Student implements Comparable{ //该接口强制让学生类具备比较性
private String name;
private int age;
Student(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public int compareTo(Object obj){
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;
}
}
public class Demo{
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Student("ztq01", 20));
ts.add(new Student("ztq04", 23));
ts.add(new Student("ztq02", 21));
ts.add(new Student("ztq05", 21));
ts.add(new Student("ztq03", 22)); Iterator it = ts.iterator();
while(it.hasNext()){
Student s = (Student)it.next();
System.out.println(s.getName() + "~~~" + s.getAge());
}
}
}

或者:

 import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; class Student{
private String name;
private int age;
Student(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
} 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()));
return num;
} } public class Demo{
public static void main(String[] args) {
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Student("ztq01", 20));
ts.add(new Student("ztq01", 23));
ts.add(new Student("ztq02", 21));
ts.add(new Student("ztq05", 21));
ts.add(new Student("ztq03", 22)); Iterator it = ts.iterator();
while(it.hasNext()){
Student s = (Student)it.next();
System.out.println(s.getName() + "~~~" + s.getAge());
}
}
}

按照字符串长度排序

 import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; class StrLenComparator implements Comparator{
public int compare(Object o1, Object o2){
String s1 = (String)o1;
String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num == 0)
num = s1.compareTo(s2);
return num;
}
} public class Demo{
public static void main(String[] args) {
TreeSet ts = new TreeSet(new StrLenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}

Java笔记(四)的更多相关文章

  1. Java笔记(四)……常量与变量

    常量 常量表示不会改变的数值. Java中常量的分类: 整数常量:所有整数 小数常量:所有小数 布尔型常量:较为特有,只有两个数值,true false 字符常量:将一个数字字母或者符号用单引号(' ...

  2. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  3. Java学习笔记四---打包成双击可运行的jar文件

    写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...

  4. Java加密与解密笔记(四) 高级应用

    术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...

  5. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  6. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  7. Thinking in Java 笔记

    大二就买了这本书,如今再看这本书,看到了一些以前没看的细节,也有了不同的体会.本文使用第4版,整理每章的笔记心得.老外的书有个特点,他会花费大量的文字去阐述一个概念,这比堆代码强多了. 第 1 章 对 ...

  8. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  9. Java笔记 —— 继承

    Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...

  10. Java笔记 —— 初始化

    Java笔记 -- 初始化 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red !impo ...

随机推荐

  1. JAVA微信开发:[17]如何获取所有关注用户

    该方法获取所有关注公共账号的微信用户的openId集合, 再通过openId集合既可以获取所有的用户的信息.   /** * 获取所有的关注用户 * * @return */ public  List ...

  2. iOS开发 ----- 加载动画之牛顿摆的实现

    牛顿摆动画 自己看动画有一段时间了,但是还是不是很能理解其中的一些属性方法之类的东西,琢磨了一下午写了一个牛顿摆的动画,这里记录一下,一遍以后查看先上图 先说下思路 说下牛顿摆的大致运动过程 根据牛顿 ...

  3. git 使用及常用命令

    git在团队项目中的使用流程 1.首先从一个git远程仓库中clone项目到本地 ? 1 git clone 仓库地址 2.创建开发分支 一般我们写代码不会在master分支上面写,而是新建一个分支 ...

  4. 浅谈PropertyChanged是如何被初始化的?

    http://www.cnblogs.com/wpcockroach/p/3909081.html

  5. Android SQLite性能分析

    作为Android预置的数据库模块,对SQLite的深入理解是很有必要的,能够从中找到一些优化的方向. 这里对SQLite的性能和内存进行了一些測试分析.对照了不同操作的运行性能和内存占用的情况,粗略 ...

  6. 小胖学PHP总结4-----PHP的字符串操作

    1.字符串连接 字符串是通过半角句号"."来连接的.能够把两个或两个以上的字符串连接成一个字符串. 2.去除字符串首尾空格和特殊字符 PHP中提供了trim()函数去除字符串左右两 ...

  7. Django-Rest-Framework部分源码流程分析

    class TestView(APIView): ''' 调用这个函数的时候,会自动触发authentication_classes的运行,所以会先执行上边的类 ''' authentication_ ...

  8. About me --- Connecting the dots

    在这个难以入眠的夜里,乔布斯年在斯坦福的演讲里说的“Connecting the dots”又萦绕耳际,即当我们往回看,就清楚了 自己曾经的生活和现在甚至将来是串联在一起的,这些经历决定了我们事业.生 ...

  9. 2016最新手机号码正则、身份证JS正则表达式

    js最新手机号码.身份证正则表达式   身份证正则: //身份证正则表达式(15位) isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1] ...

  10. 用python编写的无线AP扫描器

    代码如下: #coding=utf-8 import os import sys import subprocess from scapy.all import * RSN = 48 #管理帧信息元素 ...