Day14

08 LinkedList
09 LinkedList练习
10 ArrayList练习
11 ArrayList练习2

12 HashSet
13 HashSet存储自定义对象
14 HashSet判断和删除的依据

08 LinkedList

LinkedList特有的方法:
addFirst() addLast()

getFirst() getLast()
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException。

removeFirst() removeLast()
获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException。

在JDK1.6中出现了替代方法。
offerFirst() offerLast()

peekFirst() peekLast()
获取元素,但不删除元素。如果集合中没有元素,会返回null.

pollFirst() pollLast()
获取元素,并删除元素。如果集合中没有元素,会返回null。

 import java.util.*;

 class LinkedListDemo
{
public static void main(String[] args)
{
LinkedList link=new LinkedList(); link.addFirst("java01");
link.addFirst("java02");
link.addFirst("java03");
link.addFirst("java04"); sop(link.getLast());
sop("size:"+link.size()); sop(link.removeLast());
sop("size:"+link.size()); //用自己的方法取出元素
while(!link.isEmpty())
{
sop(link.removeFirst());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}

09 LinkedList练习

使用LinkedList模拟堆栈或者队列的数据结构
堆栈:先进后出

 import java.util.*;
class myStack
{
private LinkedList link;
public myStack()
{
link=new LinkedList();
} public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
return link.removeFirst();
}
public boolean isNull()
{
return link.isEmpty();
}
}
class LinkedListTest
{
public static void main(String[] args)
{
myStack s=new myStack();
s.myAdd("java01");
s.myAdd("java02");
s.myAdd("java03");
s.myAdd("java04"); while(!s.isNull())
{
System.out.println(s.myGet());
} }
}

队列:先进先出

 import java.util.*;
class myQueue
{
private LinkedList link;
public myQueue()
{
link=new LinkedList();
} public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
return link.removeLast();
}
public boolean isNull()
{
return link.isEmpty();
}
}
class LinkedListTest
{
public static void main(String[] args)
{
myQueue q=new myQueue();
q.myAdd("java01");
q.myAdd("java02");
q.myAdd("java03");
q.myAdd("java04"); while(!q.isNull())
{
System.out.println(q.myGet());
} }
}

10 ArrayList练习

去掉ArrayList中的重复元素

基本思想:拿一个新的容器,分别取出原ArrayList中的元素,每拿一个便检查新容器中有没有与之相同的元素。

如果有,就把此元素丢掉,如果没有,就把此元素放到新容器中。遍历完成后,新容器中就是原ArrayList去掉重复元素后的结果了。

 //去掉ArrayList中的重复元素
import java.util.*;
class ArrayListTest
{
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); }
}
/*
注意,循环中只能调用一次next,就用hasNext判断一次,
否则,会出现错误。
while(it.hasNext())
{
sop(it.next()+"......"+it.next());
}
*/
return newAl; }
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java03");
al.add("java01");
al.add("java03");
al.add("java01");
al.add("java02");
sop(al); sop(singleElement(al)); }
}

11 ArrayList练习2

将自定义对象作为元素存到ArrayList集合中,并去除重复元素
比如,存入人对象,同姓名同年龄,视为同一个人,为重复元素

思路:
1.对人描述,将数据封装进人对象。(姓名、年龄都相同的视为同一个人)
2.定义容器,将人存入
3.取出

List集合判断元素是否相同,依据的是元素的equals方法。

 import java.util.*;
class Person
{
private String name;
private int age;
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{return name;}
public int getAge()
{return age;}
//重写父类的equals方法
public boolean equals(Object obj)
{
if(! (obj instanceof Person))
return false;
Person p=(Person)obj;
System.out.println(this.name+"..."+p.name);//输出语句,显示equals的调用过程
//此语句中调用的是String 中的equals方法
return this.name.equals(p.name) && this.age==p.age; }
} class ArrayListTest2
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl=new ArrayList();
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
//contains底层调用的是对象的equals方法
//但是原equals方法比较的是对象的地址
//并不知道,我们想要的比较方法
//所以,要在Person类中重写父类的equals方法
if(!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl; }
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add(new Person("java01",12));//al.add(Object obj) //Object obj=new Person("java01",12)
al.add(new Person("java02",22));
al.add(new Person("java01",32));
al.add(new Person("java03",22));
al.add(new Person("java02",22)); //如果注释掉重写的equals方法,remove的调用结果就是false,即找不到要移除的对象
//这说明remove底层调用的也是对象的equals方法。
sop("remove:"+al.remove(new Person("java03",22))); al=singleElement(al); Iterator it=al.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
sop(p.getName()+"----"+p.getAge()); } }
}

12 HashSet

|--Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层的数据结构是哈希表
|--TreeSet:
Set集合的功能和Collection是一致的。

 import java.util.*;
class HashSetDemo
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
//验证Set无序,不可重复的特点
HashSet hs=new HashSet();
hs.add("java01");
hs.add("java01");
//sop(hs.add("java01"));sop(hs.add("java01")); 第一个是true 第二个是false
hs.add("java03");
hs.add("java04");
hs.add("java05"); Iterator it=hs.iterator(); while(it.hasNext())
{
sop(it.next());
} }
}


13 HashSet存储自定义对象

HashSet是如何保证唯一性的呢?
是通过元素的两个方法,hashCode和equals
如果元素的hashCode值相同,才会判断equals是否为true
如果元素的hashCode不同,直接存入,不会调用equals。

在项目中,描述一个类,并且需要把它的对象装入集合时,一般都需要复写该类的hashCode方法和equals方法。

因为,原有的方法不能比较我们需要比较的内容。

 /*
对象存入HashSet,先调用自己的hashCode方法计算哈希值,看哈希表中是否有和自己哈希值相同的元素
如果哈希值相同,再调用对象的equals方法来比较,
如果结果仍然相同,就不会存入Hashset;
如果不同就在哈希值相同的元素后,顺延一个位置存入。
*/
import java.util.*;
class HashSetTest
{
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a2",12));
hs.add(new Person("a1",13));
hs.add(new Person("a3",11)); Iterator it=hs.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
sop(p.getName()+"::"+p.getAge());
} }
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Person
{
private String name;
private int age;
public int hashCode()
{
//return 60;
//为了避免再调用对象的equals方法进行比较,应该尽量使对象的hashCode值不同
return name.hashCode()+age*39; }
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{return name;}
public int getAge()
{return age;}
//重写父类的equals方法
public boolean equals(Object obj)
{
if(! (obj instanceof Person))
return false;
Person p=(Person)obj;
System.out.println(this.name+"...equals..."+p.name);//输出语句,显示equals的调用过程
//此语句中调用的是String 中的equals方法
return this.name.equals(p.name) && this.age==p.age; }
}


14 HashSet判断和删除的依据

注意,对于hashSet判断元素是否存在(contains()方法)或者删除元素(remove()方法)依赖的方法是HashCode和equals方法。

如果,hashCode值不同,直接可知道该元素不存在;

如果相同,再用equals方法判断。

集合2--毕向东java基础教程视频学习笔记的更多相关文章

  1. 多线程--毕向东java基础教程视频学习笔记

    目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) 多线程运行的安 ...

  2. 集合3--毕向东java基础教程视频学习笔记

    Day 15 集合框架01 TreeSet02 TreeSet存储自定义对象03 二叉树04 实现Comparator方式排序05 TreeSet练习06 泛型概述07 泛型使用08 泛型类09 泛型 ...

  3. 集合1--毕向东java基础教程视频学习笔记

    Day14 集合框架01 体系概述02 共性方法03 迭代器04 List集合共性方法05 ListIterator06 List集合具体对象特点07 Vector中的枚举 01 体系概述 集合类为什 ...

  4. IO流05--毕向东JAVA基础教程视频学习笔记

    Day20 10 创建java文件列表11 Properties简述12 Properties存取13 Properties存取配置文件14 Properties练习15 PrintWriter16 ...

  5. IO流01--毕向东JAVA基础教程视频学习笔记

    提要 01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通过缓冲区复制文本文件)04 IO流(readLine的原理)05 IO流(MyBuffer ...

  6. 网络编程4--毕向东java基础教程视频学习笔记

    Day24 06 自定义浏览器-Tomcat服务端07 自定义图形界面浏览器-Tomcat服务端08 URL-URLConnection09 小知识点10 域名解析 06 自定义浏览器-Tomcat服 ...

  7. 网络编程3--毕向东java基础教程视频学习笔记

    Day24 01 TCP上传图片02 客户端并发上传图片03 客户端并发登录04 浏览器客户端-自定义服务端05 浏览器客户端-Tomcat服务端 01 TCP上传图片 import java.net ...

  8. 网络编程2--毕向东java基础教程视频学习笔记

    Day 23 08 Udp接收端09 Udp键盘录入数据方式10 Udp聊天11 TCP传输12 TCP传输213 TCP练习14 TCP复制文件 08 Udp接收端 需求:定义一个应用程序,用于接收 ...

  9. IO流04--毕向东JAVA基础教程视频学习笔记

    Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...

随机推荐

  1. MySQL的分页优化

    今天下午,帮同事重写了一个MySQL SQL语句,该SQL语句涉及两张表,其中一张表是字典表(需返回一个字段),另一张表是业务表(本身就有150个字段,需全部返回),当然,字段的个数是否合理在这里不予 ...

  2. Hive Tutorial(上)(Hive 入门指导)

    用户指导 Hive 指导 Hive指导 概念 Hive是什么 Hive不是什么 获得和开始 数据单元 类型系统 内置操作符和方法 语言性能 用法和例子(在<下>里面) 概念 Hive是什么 ...

  3. 使用Windows EFS(怎么给文件夹加密)进行文件加密

    和Windows BitLocker一样,Encrypting File System(EFS,加密文件系统)是Windows内置的一套基于公共密钥的加密机制,可以加密NTFS分区上的文件和文件夹,能 ...

  4. AOP的实现机制--转

    原文地址:http://www.iteye.com/topic/1116696 1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前 ...

  5. ajax调用本地wcf中的post和get

    我们可以通过jQuery调用本地或者远程的wcf服务,本文讲解的是对本地wcf服务的post和get调用方式. post和get到底有什么区别呢?此处不作详述. 但是,post对请求的数据格式更为严格 ...

  6. git取消跟踪文件

    取消跟踪文件: $git rm --cached FILENAME 取消跟踪目录: $git rm --cached FILENAME -r

  7. 关于JavaScript变量提升的理解

    废话不说,直接上代码(这是在JavaScript面对对象编程指南上面看到的一个例子) var a=123; function f(){ alert(a); var a=1; alert(a); } f ...

  8. 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段

    创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...

  9. AngularJs $q promise

    angularjs提供的$q服务是对Promises规范的一个实现.$q服务可以把一段异步的代码封装成同步的样式. 为啥是样式,因为异步还是异步,它并不会柱塞代码,只是看起来像同步代码. $q.whe ...

  10. 纯css3手机页面图标样式代码

    全部图标:http://hovertree.com/texiao/css/19/ 先看效果: 或者点这里:http://hovertree.com/texiao/css/19/hoverkico.ht ...