集合2--毕向东java基础教程视频学习笔记
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基础教程视频学习笔记的更多相关文章
- 多线程--毕向东java基础教程视频学习笔记
目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) 多线程运行的安 ...
- 集合3--毕向东java基础教程视频学习笔记
Day 15 集合框架01 TreeSet02 TreeSet存储自定义对象03 二叉树04 实现Comparator方式排序05 TreeSet练习06 泛型概述07 泛型使用08 泛型类09 泛型 ...
- 集合1--毕向东java基础教程视频学习笔记
Day14 集合框架01 体系概述02 共性方法03 迭代器04 List集合共性方法05 ListIterator06 List集合具体对象特点07 Vector中的枚举 01 体系概述 集合类为什 ...
- IO流05--毕向东JAVA基础教程视频学习笔记
Day20 10 创建java文件列表11 Properties简述12 Properties存取13 Properties存取配置文件14 Properties练习15 PrintWriter16 ...
- IO流01--毕向东JAVA基础教程视频学习笔记
提要 01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通过缓冲区复制文本文件)04 IO流(readLine的原理)05 IO流(MyBuffer ...
- 网络编程4--毕向东java基础教程视频学习笔记
Day24 06 自定义浏览器-Tomcat服务端07 自定义图形界面浏览器-Tomcat服务端08 URL-URLConnection09 小知识点10 域名解析 06 自定义浏览器-Tomcat服 ...
- 网络编程3--毕向东java基础教程视频学习笔记
Day24 01 TCP上传图片02 客户端并发上传图片03 客户端并发登录04 浏览器客户端-自定义服务端05 浏览器客户端-Tomcat服务端 01 TCP上传图片 import java.net ...
- 网络编程2--毕向东java基础教程视频学习笔记
Day 23 08 Udp接收端09 Udp键盘录入数据方式10 Udp聊天11 TCP传输12 TCP传输213 TCP练习14 TCP复制文件 08 Udp接收端 需求:定义一个应用程序,用于接收 ...
- IO流04--毕向东JAVA基础教程视频学习笔记
Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...
随机推荐
- 微服务实战(二):使用API Gateway--转
原文地址:http://dockone.io/article/482 [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选 ...
- machine learning基础与实践系列
由于研究工作的需要,最近在看机器学习的一些基本的算法.选用的书是周志华的西瓜书--(<机器学习>周志华著)和<机器学习实战>,视频的话在看Coursera上Andrew Ng的 ...
- AngularJS源码分析之依赖注入$injector
开篇 随着javaEE的spring框架的兴起,依赖注入(IoC)的概念彻底深入人心,它彻底改变了我们的编码模式和思维.在IoC之前,我们在程序中需要创建一个对象很简单也很直接,就是在代码中new O ...
- struts2学习笔记--使用Validator校验数据
我们在进行一些操作是需要对用户的输入数据进行验证,比如网站的注册,需要对各个数据项进行数据校验,Struts2提供了一些默认的校验器,比如数字的检测,邮箱的检测,字符串长度的检测等等. 常用的Vali ...
- mybatis入门基础(八)-----查询缓存
一.什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 1.1. 一级缓存是sqlSession级别的缓存.在操作数据库时需要构造 ...
- Centos6 yum安装openldap+phpldapadmin+TLS+双主配置
原文地址:http://54im.com/openldap/centos-6-yum-install-openldap-phpldapadmin-tls-%E5%8F%8C%E4%B8%BB%E9%8 ...
- Net设计模式实例系列文章总结
1 什么是设计模式 设计模式是对在软件设计过程中重复出现的问题提出了一种比较好的解决方案.正如一位专家所说:设计模式是对程序设计人员经常遇到的设计问题的可再现的解决方案(The Smalltalk C ...
- HTTP2特性预览和抓包分析
背景 近年来,http网络请求量日益添加,以下是httparchive统计,从2012-11-01到2016-09-01的请求数量和传输大小的趋势图: 当前大部份客户端&服务端架构的应用程序, ...
- 一款基于jQuery日历插件的开发过程
这个插件的设置选项,所有样式都设置成自定义,提供回调函数,方便在外部进行扩展 css设置是可变的 也就是说 日历的样式是定制的: /******************************** ...
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...