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. 【转】supervisord使用

    Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...

  2. C 标准库 - <limits.h>

    C 标准库 - <limits.h> 简介 limits.h 头文件决定了各种变量类型的各种属性.定义在该头文件中的宏限制了各种变量类型(比如 char.int 和 long)的值. 这些 ...

  3. log4j:WARN Please initialize the log4j system properly解决的方法

    要解决问题很easy,建立LOG4J 的配置文件就可以. 在src 文件夹下创建配置文件,选 一.择菜单File > New > File,文件名称输入log4j.properties,文 ...

  4. react 获取 input 的值

    1.通过 onChange -- e.target.value class App extends Component { state = { username: '张三' }; // 用户名 get ...

  5. C中參数个数可变的函数

    一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...

  6. FastDFS的配置、部署与API使用解读(6)FastDFS配置详解之Storage配置(转)

    1 基本配置 disabled #func:该配置文件是否生效 #valu: ## true:无效 ## false:生效 disabled=false group_name #func:本stora ...

  7. 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)

    系列目录 kubernetes简介 Kubernetes节点架构图: kubernetes组件架构图: 准备基础环境 我们将使用kubeadm部署3个节点的 Kubernetes Cluster,整体 ...

  8. Scrapy爬虫入门系列1 安装

    安装python2.7 参见CentOS升级python 2.6到2.7 安装pip 参见CentOS安装python setuptools and pip‎ 依赖 https://docs.scra ...

  9. C# - Garbage Collection

     The .NET Framework's garbage collector manages the allocation and release of memory for your appl ...

  10. html中设置透明遮罩层的兼容性代码

    说明:下面遮罩层的height视实际情况自行修改,要求显示的div层的样式需加上position:relative,位于遮罩层层div的下面一行.<div id="ceng" ...