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. awk如何区分shell脚本传进来的参数和自身的参数?awk如何获取shell脚本传进来的参数;awk中如何执行shell命令

    问题:对于shell脚本,$0表示脚本本身,$1表示脚本的第一个参数,$2……依次类推:对于awk,$1表示分割后的第一个字段,$2……依次类推.那么对于shell脚本中的awk如何区分两者呢? 答案 ...

  2. [剑指Offer]2.变态跳台阶

    题目 一仅仅青蛙一次能够跳上1级台阶,也能够跳上2级--它也能够跳上n级. 求该青蛙跳上一个n级的台阶总共同拥有多少种跳法. 思路 用Fib(n)表示青蛙跳上n阶台阶的跳法数,设定Fib(0) = 1 ...

  3. Windows10系统修复

    sfc /scannow 命令将扫描所有受保护的系统文件,并用位于 %WinDir%\System32\dllcache 的压缩文件夹中的缓存副本替换损坏的文件. %WinDir% 占位符代表Wind ...

  4. Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]

    1. 设定屏幕方向 当指定了屏幕的方向后(非SCREEN_ORIENTATION_UNSPECIFIED),屏幕就不会自己主动的旋转了 有2中方式控制屏幕方向: 1.1 改动AndroidManife ...

  5. at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:)

    错误提示 错误原因 參考链接 错误提示: at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:) 在Andro ...

  6. PJSIP 调用的GUID库

    PJSIP库产生随机序列串用到GUID库,针对不同的平台使用的方式不同:Windows平台下使用的是Windows系统API CoCreateGuid,在方法 pj_generate_unique_s ...

  7. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  8. C#文件操作与编程

    一:驱动器System.IO 软盘,优盘,光盘,硬盘 DriveInfo/DriveType DriveInfo:确定有关驱动器的信息:盘符,类型,可用空间 DriveType:确定DriveInfo ...

  9. MEMS--微机电系统

    http://baike.baidu.com/view/95221.htm?fromtitle=MEMS&fromid=686299&type=search 微机电系统 编辑   您检 ...

  10. Mataplotlib绘图和可视化

    Mataplotlib是一个强大的python绘图和数据可视化工具包 安装方法:pip install matplotlib 引用方法:import matplotlib.pyplot as plt ...