Java笔记(四)
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笔记(四)的更多相关文章
- Java笔记(四)……常量与变量
常量 常量表示不会改变的数值. Java中常量的分类: 整数常量:所有整数 小数常量:所有小数 布尔型常量:较为特有,只有两个数值,true false 字符常量:将一个数字字母或者符号用单引号(' ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Java学习笔记四---打包成双击可运行的jar文件
写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...
- Java加密与解密笔记(四) 高级应用
术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- Thinking in Java 笔记
大二就买了这本书,如今再看这本书,看到了一些以前没看的细节,也有了不同的体会.本文使用第4版,整理每章的笔记心得.老外的书有个特点,他会花费大量的文字去阐述一个概念,这比堆代码强多了. 第 1 章 对 ...
- java笔记整理
Java 笔记整理 包含内容 Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...
- Java笔记 —— 继承
Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...
- Java笔记 —— 初始化
Java笔记 -- 初始化 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red !impo ...
随机推荐
- 【转】supervisord使用
Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...
- C 标准库 - <limits.h>
C 标准库 - <limits.h> 简介 limits.h 头文件决定了各种变量类型的各种属性.定义在该头文件中的宏限制了各种变量类型(比如 char.int 和 long)的值. 这些 ...
- log4j:WARN Please initialize the log4j system properly解决的方法
要解决问题很easy,建立LOG4J 的配置文件就可以. 在src 文件夹下创建配置文件,选 一.择菜单File > New > File,文件名称输入log4j.properties,文 ...
- react 获取 input 的值
1.通过 onChange -- e.target.value class App extends Component { state = { username: '张三' }; // 用户名 get ...
- C中參数个数可变的函数
一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...
- FastDFS的配置、部署与API使用解读(6)FastDFS配置详解之Storage配置(转)
1 基本配置 disabled #func:该配置文件是否生效 #valu: ## true:无效 ## false:生效 disabled=false group_name #func:本stora ...
- 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)
系列目录 kubernetes简介 Kubernetes节点架构图: kubernetes组件架构图: 准备基础环境 我们将使用kubeadm部署3个节点的 Kubernetes Cluster,整体 ...
- Scrapy爬虫入门系列1 安装
安装python2.7 参见CentOS升级python 2.6到2.7 安装pip 参见CentOS安装python setuptools and pip 依赖 https://docs.scra ...
- C# - Garbage Collection
The .NET Framework's garbage collector manages the allocation and release of memory for your appl ...
- html中设置透明遮罩层的兼容性代码
说明:下面遮罩层的height视实际情况自行修改,要求显示的div层的样式需加上position:relative,位于遮罩层层div的下面一行.<div id="ceng" ...