`
dupengtao
  • 浏览: 31489 次
  • 性别: 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培训、期待与您交流!----------------------------------

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics