`
dupengtao
  • 浏览: 32945 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

黑马程序员_基础复习六(集合)

 
阅读更多

----------------------------android培训java培训、期待与您交流!----------------------------------

 

 

 

感想:

1.学到了很多细节的地方,现在不仅知道了如何去运用集合,而且对它们的底层细节又有了很多的了解!

 

 

总结:

1.常用方法:

 

去交集:boolean retainAll(Collection<?> c)

 

仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。换句话说,移除此 collection 中未包含在指

 

定 collection 中的所有元素。

 

2.iterator

 

是集合中的私有的内部类,通过暴露出方法来操作它。

 

3.List

 

特有方法,凡是可以操作角标的方法都是该体系的特有方法。 set(int index, E element)用指定元素替换列

 

表中指定位置的元素(可选操作)。

 

参数: index - 要替换的元素的索引 element - 要在指定位置存储的元素 返回: 以前在指定位置的元素

 

重点:

 

 

  • List集合特有的迭代器。ListIterator是Iterator的子接口。

 

在迭代时,不可以通过集合对象的方法操作集合中的元素。 因为ConcurrentModificationException


异常。 所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的, 只能对元素进行判断,取出,删


除的操作, 如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。 该接口只能通过List集合的


listIterator方法获取。

 

 

  • ArrayList 不是线程同步的


 

  • Vector 是线程同步的 但是最好也不要用,可以用ArrayList 加锁


 

  • ArrayList 构造出一个长度为10的空列表

 

LinkedList:特有方法:

addFirst(); addLast();getFirst();getLast();

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

removeFirst();removeLast();

获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法。

offerFirst();offerLast();
peekFirst();peekLast();

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

pollFirst();pollLast();

获取元素,但是元素被删除。如果集合中没有元素,会返回null。




/*
使用LinkedList模拟一个堆栈或者队列数据结构。

堆栈:先进后出  如同一个杯子。
队列:先进先出 First in First out  FIFO 如同一个水管。



*/

import java.util.*;
class DuiLie
{
	private LinkedList link;

	DuiLie()
	{
		link = new LinkedList();
	}
	
	public void myAdd(Object obj)
	{
		link.addFirst(obj);
	}
	public Object myGet()
	{
		return link.removeFirst();//队列
		return link.removeLast();//堆栈
	}
	public boolean isNull()
	{
		return link.isEmpty();
	}

}



class  LinkedListTest
{
	public static void main(String[] args) 
	{
		DuiLie dl = new DuiLie();
		dl.myAdd("java01");
		dl.myAdd("java02");
		dl.myAdd("java03");
		dl.myAdd("java04");

		while(!dl.isNull())
		{
			System.out.println(dl.myGet());
		}
	}
}
 

 

import java.util.*;

/*
将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。


思路:
1,对人描述,将数据封装进人对象。
2,定义容器,将人存入。
3,取出。



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

所以要重写Person类的equals方法



*/



class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public boolean equals(Object obj)
	{

		if(!(obj instanceof Person))
			return false;

		Person p = (Person)obj;
		//System.out.println(this.name+"....."+p.name);

		return this.name.equals(p.name) && this.age == p.age;
	}
	/**/
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
}
class ArrayListTest2 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		ArrayList al = new ArrayList();

		al.add(new Demo());

		al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
		//al.add(new Person("lisi02",32));
		al.add(new Person("lisi02",32));
		al.add(new Person("lisi04",35));
		al.add(new Person("lisi03",33));
		//al.add(new Person("lisi04",35));

		
		//al = singleElement(al);

		sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。


		Iterator it = al.iterator();


		while(it.hasNext())
		{
			Person p = (Person)it.next();
			sop(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;
	}
}



 

 

 

 

|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。

 

|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

 

HashSet是如何保证元素唯一性的呢?

 

是通过元素的两个方法,hashCode和equals来完成。

 

如果元素的HashCode值相同,才会判断equals是否为true。

 

如果元素的hashcode值不同,不会调用equals。

 

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

 

 

|--TreeSet:

 

Set集合的功能和Collection是一致的。

 

重点:

 

arraylist删除元素依赖于equals

         

HashSet删除元素依赖于hashcode和equals


 

 

import java.util.*;

/*
Set:无序,不可以重复元素。
	|--HashSet:数据结构是哈希表。线程是非同步的。
				保证元素唯一性的原理:判断元素的hashCode值是否相同。
				如果相同,还会继续判断元素的equals方法,是否为true。

	|--TreeSet:可以对Set集合中的元素进行排序。
				底层数据结构是二叉树。
				保证元素唯一性的依据:
				compareTo方法return 0.

				TreeSet排序的第一种方式:让元素自身具备比较性。
				元素需要实现Comparable接口,覆盖compareTo方法。
				也种方式也成为元素的自然顺序,或者叫做默认顺序。

				TreeSet的第二种排序方式。
				当元素自身不具备比较性时,或者具备的比较性不是所需要的。
				这时就需要让集合自身具备比较性。
				在集合初始化时,就有了比较方式。

需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。


记住,排序时,当主要条件相同时,一定判断一下次要条件。


*/

class TreeSetDemo 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();

		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));
		//ts.add(new Student("lisi007",20));
		//ts.add(new Student("lisi01",40));

		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = (Student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}
	}
}


class Student implements Comparable//该接口强制让学生具备比较性。
{
	private String name;
	private int age;

	Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public int compareTo(Object obj)
	{

		//return 0;
		
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s = (Student)obj;

		System.out.println(this.name+"....compareto....."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
		/**/
	}

	public String getName()
	{
		return name;

	}
	public int getAge()
	{
		return age;
	}
}

 

 

 

 

 



import java.util.*;

/*
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序都存在时,以比较器为主。

定义一个类,实现Comparator接口,覆盖compare方法。


*/
class Student implements Comparable//该接口强制让学生具备比较性。
{
	private String name;
	private int age;

	Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public int compareTo(Object obj)
	{

		//return 0;
		
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s = (Student)obj;

		//System.out.println(this.name+"....compareto....."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
		/**/
	}

	public String getName()
	{
		return name;

	}
	public int getAge()
	{
		return age;
	}
}
class TreeSetDemo2 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();

		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi02",21));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi06",18));
		ts.add(new Student("lisi06",18));
		ts.add(new Student("lisi007",29));
		//ts.add(new Student("lisi007",20));
		//ts.add(new Student("lisi01",40));

		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = (Student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}
	}
}

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()));
			/*
			if(s1.getAge()>s2.getAge())
				return 1;
			if(s1.getAge()==s2.getAge())
				return 0;
			return -1;
			*/
		}

		
		return num;

	}
}
 

 

 

 

//泛型类定义的泛型,在整个类中有效。如果被方法使用,

 

//那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。

//

//为了让不同方法可以操作不同类型,而且类型还不确定。

 

//那么可以将泛型定义在方法上。

 

 

/*

特殊之处:

 

静态方法不可以访问类上定义的泛型。

 

如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

 

 

? 通配符。也可以理解为占位符。

 

泛型的限定;

 

? extends E: 可以接收E类型或者E的子类型。上限。

 

? super E: 可以接收E类型或者E的父类型。下限

 

Map

 

|--HashMap:底层是哈希表。非同步。可以允许null作为键值。

 

|--TreeMap:底层是二叉树,非同步。可以对map集合中键进行排序 。

 

|--Hashtable:哈希表。同步。被HashMap替代了。不允许null作为键值。

看到Array:就是数组结构。

 

看到link:就是链表。

 

看到hash:就是哈希表结构。就要想到hashCode和equals方法。

 

看到tree:就要想到二叉树,就要想到排序。就要想到Comparable 和Comparator接口。

 

什么时候用map集合?当对象间存在映射关系时,就要想要map集合。

 

hashmap

 

public V put(K key,V value)在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替

 

换。 

 

返回:

 

与 key 关联的旧值;如果 key 没有任何映射关系,则返回 null。(返回 null 还可能表示该映射之前将 null 与 key 关

 

联。)

 

 

 

 

 

 

 

 

----------------------------android培训java培训、期待与您交流!----------------------------------

 

分享到:
评论

相关推荐

    黑马程序员_Java基础辅导班教程课件[第01期]第4天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第4天"中,我们可以推测这是针对初学者的Java编程课程,旨在帮助学员掌握Java的基础知识。 在课程的第4天,可能讲解了以下核心概念: 1. **类(Class)**:`Demo.class...

    Java-集合的例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar

    本资料包是黑马程序员提供的详细教程,涵盖了Java集合的例题、源码以及配套的PPT教学文档,旨在帮助学习者深入理解和掌握Java集合的使用。 首先,我们来探讨Java集合框架的基本概念。Java集合框架包括接口和实现类...

    黑马程序员笔记自己复习Java

    Java基础知识点总结 本文将对Java基础知识点进行总结,涵盖了变量、数据输入、数组、方法、封装、API、字符串、ArrayList、继承、多态等方面的重要概念。 变量和数据输入 在Java中,变量是存储数据的容器。变量的...

    黑马程序员java面试宝典 完整版PDF.rar

    《黑马程序员Java面试宝典》是一本...通过《黑马程序员Java面试宝典》的学习,你可以系统地复习和掌握这些知识点,提高自己的面试竞争力。书中的问题和解答将帮助你更好地理解Java编程的本质,提升在面试中的自信心。

    《Java基础入门(第3版)》(Java):课后答案-docx文档

    《Java基础入门(第3版)》是一本针对Java初学者的教材,其课后答案文档提供了对书中习题的解答,旨在帮助读者巩固所学知识。Java是一种面向对象的编程语言,具备跨平台性,由Java虚拟机(JVM)负责解释执行。Java...

    黑马程序员JAVA面试宝典2018年5月最新版

    《黑马程序员JAVA面试宝典2018年5月最新版》是一本专门为Java开发者准备的面试指南,它集合了2018年5月时最新的面试知识点和业界趋势,旨在帮助Java程序员在求职过程中更好地应对各类技术面试。这本书可能涵盖了Java...

    javaweb复习资料,黑马程序员视频

    这个复习资料主要涵盖了Eclipse的使用、程序的断点调试、Eclipse常用快捷键、JUnit测试框架、Java 5的新特性(静态导入和自动装箱拆箱)以及增强for循环和可变参数等知识点。 1. **Eclipse的使用**: Eclipse是一...

    黑马程序员面试宝典(java).7z

    通过学习《黑马程序员面试宝典》,开发者不仅可以深入理解Java的核心概念和技术,还能了解企业在招聘时关注的热点问题,从而有针对性地进行复习和准备。这份资料提供的面试真题解析更是能帮助开发者模拟实战,提前...

    黑马程序员入学Java知识

    ### 黑马程序员入学Java知识 #### Java概述与基础知识 1. **何为编程?** - 编程是通过特定的计算机语言来编写指令,让计算机执行一系列任务的过程。 2. **Java语言概述,历史、特点** - **概述**:Java是一种...

    Python学习资料整理

    首先,Python的基础知识是理解其语法结构,包括变量、数据类型(如整型、浮点型、字符串、布尔型、列表、元组、字典和集合)、流程控制(如条件语句、循环语句、异常处理)以及函数的使用。Python的模块化设计允许...

    2018-2019年黑马最新版Java程序员面试宝典+题库pdf

    《2018-2019年黑马最新版Java程序员面试宝典+题库pdf》是一份集合了近年来Java编程领域重点知识和面试常见问题的综合资源。这份资料主要针对初级Java程序员,旨在帮助他们巩固基础知识,掌握面试技巧,以便在求职...

    java视频教程_黑马Java零基础辅导班[第二期]11天课件源码

    在Java开发的世界里,扎实的基础是每一位程序员的基石。本篇将围绕"java视频教程_黑马Java零基础辅导班[第二期]11天课件源码"这一主题,深入探讨在学习Java过程中所涉及的重要知识点,通过分析提供的课件源码,旨在...

    传智播客PPT

    【传智播客PPT】是一份集合了多种IT技术领域的教学资料,主要涵盖了Java基础、JDBC数据库操作以及SSH(Struts、Spring、Hibernate)三大框架等内容。这些PPT资源是传智播客教育机构精心制作的,旨在帮助学习者深入...

    黑马视频笔记集锦

    【标题】:“黑马视频笔记集锦”是一份针对Android开发者的资源集合,它包含了大量从黑马程序员教育平台精心整理的视频学习笔记。这份资源旨在帮助Android爱好者高效地掌握编程技能,减少在学习过程中的摸索时间,...

    java黑马基础资料+本人自己整理笔记+哔哩哔哩+java入行者 和 复习者可以观看第一次发作品 请多多提建议

    本文将为你提供一份详尽的Java基础知识概述,适合初学者和有经验的开发者作为复习材料。 1. Java基础语法 Java的基础语法是编程的基础,理解和掌握它至关重要。 1.1 注释 注释是程序员为了方便理解和维护代码而...

    传智播客-黑马32期Java视频

    传智播客是知名的IT教育品牌,其“黑马程序员”系列课程在行业内享有较高的声誉,为许多初学者和进阶者提供了丰富的学习资源。 【描述】"市面最新,请各位慢用" 暗示这是一套较新的Java教学资料,涵盖了最新的技术...

    黑马入学测试题

    结合上下文,我们可以推测这是“黑马程序员”或其他类似机构的入学测试题目集合。 【文件内容】:由于给出的压缩包文件列表只有一个名为“测试.txt”的文件,我们可以假设这是一份文本文件,其中包含了具体的测试...

    hadoop课后题带答案

    本文主要针对Hadoop相关知识进行总结,涵盖了大数据的基本特征、Hadoop组件、Hadoop集群...以上内容是对Hadoop及其生态系统相关知识的概述,涵盖了从基础概念到具体操作的多个方面,是Hadoop期末复习的重要参考资料。

    《JavaWeb程序设计任务教程(第2版)》(Java):课后答案-docx文档

    《JavaWeb程序设计任务教程(第2版)》课后答案-docx文档是一份针对该教程中课后习题的详细解答集合。该文档以Microsoft Word的.docx格式呈现,包含了教程中每一章节后的练习题及其相应的解答。 二、适用人群 学生...

Global site tag (gtag.js) - Google Analytics