集合框架(02)List
List的类型和特点:
ArrayList:底层的数据结构使用的是数组结构。特点:查询的速度很快,但是增删稍慢 线程不同步
LinKedList:底层使用的链表数据结构。特点:增删的速度很快,查询稍慢
Vector:底层是数组数据结构,线程同步,被ArrayList替代.特点:枚举是Vector特有的取出方式
枚举
.其实枚举和迭代是一样的,因为枚举的名称以及方法都过长,所以被迭代器取代了,枚举郁郁而终了
LinkedList:
LinkedList:特有的方法 addFirst(),addLast(), getFirst(), getLast(),. removeFirst(), removeLast()
removeFirst():移除并返回第一个元素,如果此列表为空则抛出NoSuchElementException异常
poolFirst():获取并移除此列表的第一个元素,如果此列表为空,则返回null,不抛异常
在JDK1.6出现了替代方法。
offerFirst() , offerLast() , peekFirst() ,peekLast() , pollFirst () , pollLast()
LinkedList方法代码:
package sxy.List;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args){
LinkedList link1= new LinkedList();
link1.addFirst("apple1");
link1.addFirst("apple2");
link1.addFirst("apple3");
link1.addFirst("apple4");
sop(link1);
//“遍历”
while(!link1.isEmpty()){
System.out.println(link1.removeFirst());
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
使用LinkedList模拟一个堆栈或者队列的数据结构。
堆栈:先进后出
队列:先进先出 First In First Out FIFO
典型例子(熟记):
package sxy.List;
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 LinkedListDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DuiLie dl = new DuiLie();
dl.myAdd("apple1");
dl.myAdd("apple2");
dl.myAdd("apple3");
dl.myAdd("apple4");
while(!dl.isNull()){
System.out.println(dl.myGet());
}
}
}
去掉ArrayList的中重复的元素:
package sxy.List; import java.util.ArrayList;
import java.util.Iterator; public class TestArrayList { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub //去除ArrayList中的重复元素
ArrayList al = new ArrayList();
al.add("apple1");
al.add("apple2");
al.add("apple3");
al.add("apple3");
al.add("apple3");
al.add("apple4");
//打印原集合
sop(al);
//打印去重之后的集合
al = SingleElement(al);
sop(al); }
public static void sop(Object obj){
System.out.println(obj);
} public static ArrayList SingleElement(ArrayList al){
ArrayList al2 = new ArrayList();
Iterator it = al.iterator(); while(it.hasNext()){
Object obj = it.next();
if(!al2.contains(obj)){
al2.add(obj);
}
}
return al2;
} }
去除ArrayList中重复自定义对象:
将自定义对象作为元素存到ArrayList集合中,并除去重复元素
比如:存人对象。同姓名同年龄,视为同一个人。为重复元素
思路:
- 对人描述,将数据封装进人对象
- 定义容器,将人存入。
- 取出 、
package CollectionTest; import java.util.ArrayList;
import java.util.Iterator; class Person{
private String name;
private int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
Person(String name,int age){
this.name=name;
this.age=age;
}
Person(){ } @Override
public boolean equals(Object obj) {//重写equals方法
Person per = (Person) obj;
if (per.getName().equals(this.name) && per.getAge() == this.age) {
return true;
}
return false;
}
} public class ArrayListDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Person> al = new ArrayList();
al.add(new Person("lisi1",10));
al.add(new Person("lisi2",20));
al.add(new Person("lisi2",20));
al.add(new Person("lisi3",30));
al.add(new Person("lisi4",40));
al.add(new Person("lisi4",40)); 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 arrNew = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();
//在调用contains方法的时候调用equals方法
if(!arrNew.contains(obj)){
arrNew.add(obj);
}
}
return arrNew;
} }
equals和contains方法的区别:
最近用到了equals和contains两个方法,两个都有对比的意思,但区别呢?在网上找了些资料,似乎大概能分清了。
首先是文档上的内容:
public boolean equals(Object ob指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
● 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
● 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
● 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回true。
● 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
● 对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
contains
public boolean contains(CharSequence s)
当且仅当此字符串包含指定的 char 值序列时,返回 true。
参数:
s - 要搜索的序列
返回:
如果此字符串包含 s,则返回 true,否则返回 false
抛出:
NullPointerException - 如果 s 为 null
似乎有些难懂,尤其是equals的解释,下面是网友的解释内容:
equals是比较两个东西是否等同,这个适用于任何类别的对象
contains是是否包含的意思,那肯定.左边的对象是一个容器了
String现在也有一个contains,那是因为String是一个字符的容器
equals只能判断两个变量的值是否相等。
contains常用与集合中判断某个对象是否含有这个元素
l
List集合判断元素是否相同,依据的元素的equals方法
频繁的增删操作是LinkedList
Set:元素师无序的(存入和取出的顺序不一定一致),元素不可以重复
Set集合的功能和Collection是一致的
------HashSet:底层数据结构是哈希表
是如何保证元素的唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true,如果元素的HashCode的值不相同,不会调用equals
------TreeSet:
集合框架(02)List的更多相关文章
- 阶段01Java基础day16集合框架02
16.01_集合框架(去除ArrayList中重复字符串元素方式1) A:案例演示 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 思路:创建新集合方式 /** * A:案例演示 ...
- Java 集合框架 02
集合框架· LinkedList 和 泛型 去除ArrayList中重复字符串元素 * A:案例演示 * 需求:ArrayList去除集合中字符串的重复值(相同内容的字符串) * 思路:创建新集合方式 ...
- java集合框架02
public class ListTest { public static void main(String[] args) { //创建几个新闻对象 News news1=new News(1, & ...
- java集合框架02——Collection架构与源码分析
Collection是一个接口,它主要的两个分支是List和Set.如下图所示: List和Set都是接口,它们继承与Collection.List是有序的队列,可以用重复的元素:而Set是数学概念中 ...
- 20180826(02)-Java集合框架
Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用 ...
- 十五、Java基础---------集合框架体系以及List
在介绍集合之前先说一下数组,正如我们所知,数组是某一类型数据的集合,强调的是数据,而且必须单一:集合框架的不同之处在于存储的数据类型没有任何限制,既可以存储基本数据类型(会自动提升为相应的包装类)也可 ...
- Java的集合框架
01.为什么要使用集合框架? 解析:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,那么可以使用Java集合框架. 如果启用集合的删除方法,那么集合中所有元素的索引会自动维护. 集合 ...
- Java 集合系列 02 Collection架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- JavaSE_ 集合框架 总目录(15~18)
JavaSE学习总结第15天_集合框架1 15.01 对象数组的概述和使用15.02 对象数组的内存图解15.03 集合的由来及与数组的区别15.04 集合的继承体系图解15.05 Collectio ...
- JavaSE学习总结第15天_集合框架1
15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...
随机推荐
- docker 踩坑笔记之 psql: could not connect to server
最近在用docker跑rails,也遇到了一些坑,这里记录一下. 首先build项目: docker-compose build 然后就开始报错了: psql: could not connect t ...
- springboot08 jdbc
一.JDBC&连接池 1. jdbc介绍 JDBC(Java DataBase Connectivity ,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数 ...
- GDI+实现双缓冲绘图方法一
private void Form5_MouseMove(object sender, MouseEventArgs e) { int intOX = rectDrawArea.X; int intO ...
- PHP的几种遍历方法
PHP常用的遍历方法有三种,foreach,for,list()/each()和while,这三种方法中效率最高的是使用foreach语句遍历数组 一.使用for语句循环遍历数组 值得大家注意的是使用 ...
- [CF482B]Interesting Array
题目大意:构造一个序列$S$,有$m$条限制,每条为$l\;r\;q$,表示$\&_{i=l}^r S_i=q$ 题解:每条限制就把$[l,r]$内的数或上$q$,最后判断就行了 卡点:我又写 ...
- [洛谷P1501][国家集训队]Tree II
题目大意:给一棵树,有四种操作: $+\;u\;v\;c:$将路径$u->v$区间加$c$ $-\;u_1\;v_1\;u_2\;v_2:$将边$u_1-v_1$切断,改成边$u_2-v_2$, ...
- [poj] 2749 building roads
原题 2-SAT+二分答案! 最小的最大值,这肯定是二分答案.而我们要2-SATcheck是否在该情况下有可行解. 对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来 ...
- 2017 多校3 hdu 6061 RXD and functions
2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...
- 《c程序设计语言》读书笔记-4.2-扩充atof函数
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...
- C语言高级应用---操作linux下V4L2摄像头应用程序【转】
转自:http://blog.csdn.net/morixinguan/article/details/51001713 版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://blog ...