我是靠谱客的博主 时尚发箍,最近开发中收集的这篇文章主要介绍黑马程序员——java基础-集合,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

  第一节:集合的概述
一、集合的简述:
1、集合的由来:
我们学习的是Java -->面向对象 -->操作很多对象 -->存储 -->容器(数组和StringBuffer) -->数组而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们使用
2、集合特点:
(1)、用于存储对象的容器。 
(2)、集合的长度是可变的。 
(3)、集合中不可以存储基本数据类型值。  
3、集合和数组的区别:
(1)、长度区别
数组固定
集合可变
(2)、内容区别
数组可以是基本类型,也可以是引用类型
集合只能是引用类型
(3)、元素内容
数组只能存储同一种类型
集合可以存储不同类型(其实集合一般存储的也是同一种类型)
二、集合的继承体系结构
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,
我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet
第二节:Collection
一、Collection的功能的简述:
1、添加: 
boolean add(Object obj): 添加一个元素
boolean addAll(Collection coll): 添加一个集合
2、删除: 
boolean remove(object obj): 移除一个元素
boolean removeAll(Collection coll); 移除一个集合
void clear(); 清空
3、判断: 
boolean contains(object obj): 是否包含一个元素
boolean containsAll(Colllection coll); 是否包含一个集合
boolean isEmpty():判断集合中是否有元素。 
4、获取: 
int size(): 集合的长度
Iterator iterator():取出元素的方式:迭代器。 
迭代器:
(1)、该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。所以该迭代器对象是在容器中进行内部实现的。   
(2)、对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可, 也就是iterator方法。
(3)、Iterator接口就是对所有的Collection容器进行元素取出的公共接口。把它可以想象成抓娃娃游戏机中的夹子! 
5、其他: 
boolean retainAll(Collection coll);取交集。 
Object[] toArray():将集合转成数组。
第三节:List
一、简述:
1、有序的 collection(也称为序列)。
2、此接口的用户可以对列表中每个元素的插入位置进行精确地控制。
3、用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
4、与 set 不同,列表通常允许重复的元素。
二、List:特有的常见方法:
1、添加 :
void add(index,element); 根据角标添加元素
void add(index,collection); 根据角标添加集合
  2、删除; 
Object remove(index): 根据角标删除集合的元素
3、修改: 
Object set(index,element); 根据角标替换元素
4、获取: 
Object get(index); 根据角标获取元素
int indexOf(object); 根据元素获取第一次角标,否则返回-1
int lastIndexOf(object); 获取最后出现元素的角标
List subList(form,to);获取部分对象元素
注:有一个共性特点就是都可以操作角标
5、其他
ListIterator listIterator();获取特有的迭代器
迭代器:
(1)、并发修改异常
(1).1:出现的现象
迭代器遍历集合,集合修改集合元素
(1).2:原因
迭代器是依赖于集合的,而集合的改变迭代器并不知道。
(1).3:解决方案
(1).3.1:迭代器遍历,迭代器修改(ListIterator)
元素添加在刚才迭代的位置
(1).3.2:集合遍历,集合修改(size()和get())
元素添加在集合的末尾
(2)、ListIterator是List集合特有的迭代器,它是Iterator的子接口。
(3)、ListIterator的常用方法
void add(obj);增加
void set(obj);修改为obj
boolean hasPrevious();判断前面有没有元素
Object previous();取前一个元素
三、List子类的特点
1、ArrayList:
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
2、Vector:
底层数据结构是数组,查询快,增删慢
线程安全,效率低
3、LinkedList:
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
四、集合ArrayList
1、此集合的没有特有的功能需要学习,因为它的功能与List一样。
2、案例
(1) ArrayList存储字符串并遍历,并保证元素的唯一性

//用list集合添加字符串 要保证元素的唯一性
/*
由于字符串中的equals来自object它只比较两个元素的地址值 没有比较两个元素。
1、创建一个list集合对象 添加元素 要有重复的元素
2、在创建一个新的集合对象 用迭代器进行对老的集合中的元素进行遍历 并且存储到新的集合当中去,在存储的过程当中如果遇到重复的就不存储了。
3、再把老集合清空
4、在把新集合中的元素添加到老集合当中去
5、清空老集合
6、再打印集合查看元素


*/
import java.util.*;
class Demo
{
	public static void main(String[] args)
	{
		//创建一个ArrayList类的对象
	ArrayList<String>list=new ArrayList<String>();
	//添加元素
	list.add("a");
	list.add("abc");
	list.add("a");
	//把数据传入函数中,并返回一个集合
	ArrayList<String>lis=getList(list);
	//打印集合中的元素
	System.out.println(lis);
	}
	public static ArrayList<String>getList(ArrayList<String> list)
	{
		//在创建一个集合
	ArrayList<String>list1=new ArrayList<String>();
	//对集合中的元素进行遍历
	for (String str:list)
	{
		//如果list1集合中不包含这个元素,就添加这个集合到list1集合当中去
		if (!list1.contains(str))
		{
			list1.add(str);
		}
	}
	//把list集合清空
	list.clear();
	//把list1集合中的元素全部添加到list集合中
	list.addAll(list1);
	//把list1集合进行清空
	list1.clear();
	//返回list集合
	return list;	
	}
}

(2) ArrayList存储自定义对象并遍历,并保证元素的唯一性

//在list集合当中添加自定义对象并且保证元素的唯一性
/*
思路:
1、写一个学生类 有姓名 年龄属性并覆盖toString方法和equals方法(保证元素的唯一性)
2、在main方法中创建学生类对象 并添加元素
3、看是否有重复元素

*/
import java.util.*;
class Demo1
{
	
	public static void main(String[] args)
	{
		//创建一个ArrayList类的对象
	ArrayList<Student>list=new ArrayList<Student>();
	//往集合中添加元素
	list.add(new Student("张三",23));
	list.add(new Student("小三",3));
	list.add(new Student("大三",13));
	list.add(new Student("中三",23));
	list.add(new Student("张三",23));
	//把集合传入到一个函数当中去,并把返回的机会赋值给list
	list=equals1(list);
	//打印list集合中的元素
	System.out.println(list);
	}
	public static ArrayList<Student>equals1(ArrayList<Student>list)
	{
		//在创建一个集合
		ArrayList<Student>lis=new ArrayList<Student>();
		//对集合中的元素进行遍历
		for(Student st:list)
		{
			//如果list1集合中不包含这个元素,就添加这个集合到list1集合当中去
			if (!(lis.contains(st)))
			{
				lis.add(st);
			}
		
		}
		//把list集合清空
		list.clear();
		//把lis集合中的元素全部添加到list集合中
		list.addAll(lis);
		//lis集合清空
		lis.clear();
	return list;
	}
	
	
}
//定义一个学生类
class Student
{
	//私有学生类的属性
	private String name;
	private int age;
	Student(String name,int age)
	{
	this.name=name;
	this.age=age;
	}
	//并提供对外访问方式
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	//覆盖Object中的equals方法
	public boolean equals(Object obj)
	{
		if (this==obj)
		return true;
		//如果不是学生类就抛出异常
		if (!(obj instanceof Student))
		{
			throw new RuntimeException("类型转换异常");
		}
		//进行强转
		Student stu=(Student)obj;
		//进行比较如果是name与age都相同的话,就是同一个人
	return this.name.equals(stu.name)&&this.age==stu.age;
	}
	//覆盖Object中的toString方法
	public String toString()
	{
	return "name="+name+"......age="+age;
	}
}


五、集合Vector
1、特有的功能:
(1) 添加
void addElement(E obj) -->add()
(2) 获取
public E elementAt(int index) --> get()
public Enumeration<E> elements() -->  iterator()
2、枚举 Enumeration
(1)、它是Vector特有的获取方法,
(2)、枚举与迭代器的功能是一样的,由于它和方法的名称过长,就被迭代器代替了。
六、集合 LinkedList
1、特有的功能
(1) 添加
addFirst()
addLast()
jdk1.6 
offerFirst(); 
offetLast();
(2) 删除
removeFirst()获取并移除,如果链表为空,抛出NoSuchElementException. 
removeLast()
jdk1.6 
pollFirst();获取并移除,如果链表为空,返回null. 
pollLast(); 
(3) 获取
getFirst()获取但不移除,如果链表为空,抛出NoSuchElementException. 
getLast()
jdk1.6 
peekFirst();获取但不移除,如果链表为空,返回null. 
peekLast(): 
2、两种数据结构
(1)堆栈:先进后出 First In Last Out  FILO   
(2)队列:先进先出 First In First Out FIFO 
(3)用LinkedList来模拟一个堆栈或者队列数据结构。
代码体现

//自定义一个队列的结构
/*
思路:
1 先定义一个类 在构造函数当中创建一个List对象
2 在定义一个添加元素的方法
3 在定义一个一下获取元素的方法


*/
import java.util.*;
class Demo2
{
	public static void main(String[] args)
	{
		//创建队列类的元素
	Queu<String> q=new Queu<String>();
	//并添加元素
	q.add("张三");
	q.add("王五");
	q.add("李四");
	q.add("周七");
	q.add("赵八");
	//获取元素
	q.get();
	
	}
}
//自定一个队列类
class Queu<String>
{
	//把创建LinkedList集合的对象进行私有
	private LinkedList<String> list=list=new LinkedList<String>();
	//进行添加元素
	public void add(String str)
	{
		//用的是list对象的进行添加元素
		list.addLast(str);
	
	}
	//获取元素
	public void get()
	{
		//对集合中元素进行遍历并删除
		while (!list.isEmpty())
		{
			//并打印被删除的元素
			System.out.println(list.removeFirst());
		}
	
	}
}

3、在集合中常见的数据结构
  (1)ArrayXxx:底层数据结构是数组,查询快,增删慢
  (2)LinkedXxx:底层数据结构是链表,查询慢,增删快
  (3)HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
  (4)TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
第四节:Set
一、简述:
1、不包含重复元素的集合,不保证顺序。
2、而且方法和Collection一致。
3、Set集合取出元素的方式只有一种:迭代器。
二、Set子类的特点
1、HashSet集合
(1)底层数据结构是哈希表(是一个元素为链表的数组)
(2)哈希表底层依赖两个方法:hashCode()和equals()
 执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
返回true:元素重复了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
(3)如何保证元素唯一性的呢?
由hashCode()和equals()保证的
(4)开发的时候,代码非常的简单,自动生成即可。
(5)HashSet存储字符串并遍历,并且保证元素的唯一。

//保证hashSet集合的元素唯一
/*
思路:
1 定义一个hashset集合的对象 并添加元素
2 进行对集合遍历 看是否有重复元素
string类型已经覆盖了hashcode方法了和equals方法了

*/
import java.util.*;
class Demo3
{
	public static void main(String[] args)
	{
		//创建HashSet集合对象
	HashSet<String>hs=new HashSet<String>();
	//往集合中添加元素
	hs.add("a");
	hs.add("ab");
	hs.add("ab");
	hs.add("abc");
	//并对集合中的元素进行遍历
	for (String s:hs )
	{
		//打印集合中的元素
		System.out.println(s);
	}
	
	
	}
}

(6)HashSet存储自定义对象并遍历。并保证元素的唯一性。

//自定义一个类用hashset集合去存储要保证元素的唯一性
/*
1、自定义一个类有姓名 年龄 属性 并且要覆盖hashcode方法和equals方法
2、创建hashset集合的对象 并添加元素
3、取出元素看是否有重复


*/
import java.util.*;
class Demo4
{
	public static void main(String[] args)
	{
		//创建HashSet集合对象
		HashSet<Student>hs=new HashSet<Student>();
		//往集合中添加元素
		hs.add(new Student("张三",34));
		hs.add(new Student("周七",13));
		hs.add(new Student("李四",12));
		hs.add(new Student("李四",12));
		hs.add(new Student("赵六",54));
		hs.add(new Student("王五",21));
		//并对集合中的元素进行遍历
		for (Student st:hs)
		{
			//打印集合中的元素
			System.out.println(st);
		}
	
	}
}
//定义一个学生类
class Student
{
	//私有学生类的属性
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	//并提供对外访问方式
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	//覆盖Object中的hashCode方法
	public int hashCode()
	{
	return name.hashCode()+age;
	}
	//覆盖Object中的equals方法
	public boolean equals(Object obj)
	{
		if (this==obj)
		return true;
			//如果不是学生类就抛出异常
		if (!(obj instanceof Student))
		{
			throw new RuntimeException("类型转换异常");
		}
			//进行强转
		Student stu=(Student)obj;
		//进行比较如果是name与age都相同的话,就是同一个人
		return this.name.equals(stu.name)&&this.age==stu.age;
	
	}
	//覆盖Object中的toString方法
	public String toString()
	{
	
	return "name="+name+"age="+age;
	}
}

2、TreeSet集合
(1)底层数据结构是红黑树(是一个自平衡的二叉树)
(2)保证元素的排序方式
(2).1自然排序(元素具备比较性)
让元素所属的类实现Comparable接口 覆盖CompareTo()方法
(2).2比较器排序(集合具备比较性)
让集合构造方法接收Comparator的实现类对象 覆盖Compare()方法
代码体现

1、对TreeSet集合进行遍历,并保证元素的唯一性

//创建TreeSet集合对象,并添加元素并保证元素的唯一性(String 类型)
/*
思路:
1、创建TreeSet集合对象并添加元素
2、取出集合中的元素

*/
import java.util.*;
class Demo5
{
	public static void main(String[] args)
	{
		//创建TreeSet集合对象
	TreeSet<String>set=new TreeSet<String>();
	//并添加元素
	set.add("a");
	set.add("ab");
	set.add("ac");
	set.add("ab");
	//用迭代器进行对集合中的元素遍历
	for (Iterator<String>irr=set.iterator();irr.hasNext() ; )
	{
		//打印集合中的元素
		System.out.println(irr.next());
	}
	
	}

}

2、TreeSet集合存储自定义对象并遍历,并保证元素的唯一性

//自定义一个类并创建TreeSet集合对象添加元素并保证元素的唯一性
/*
思路:
1、 自定义一个类实现Comparable接口 覆盖compareTo方法 并定义自己姓名年龄属性
2、创建集合Treeset对象 添加元素
3、取出元素看看元素是否唯一
4、有时比较的并不是我们想要的结果 这时我们自己可以自定义一个比较器Comparator接口覆盖compare方法
*/
import java.util.*;
class Demo6
{
	public static void main(String[] args)
	{
		//创建TreeSet集合对象的同时也传入一个比较器的对象
		TreeSet<Student> set=new TreeSet<Student>(new MyComparator());
		//往集合中添加元素
		set.add(new Student("张三",23));
		set.add(new Student("王五",13));
		set.add(new Student("赵六",3));
		set.add(new Student("赵六",3));
		set.add(new Student("李四",93));
		//用迭代器进行对集合中的元素遍历
		for (Iterator<Student>irr=set.iterator();irr.hasNext() ; )
		{
			//打印集合中的元素
			System.out.println(irr.next());
		}
	
	}
}
//自定义一个学生类并实现了Comparable接口
class Student implements Comparable<Student>
{
	//私有学生类的属性
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
		//并提供对外访问方式
	public String getName()
	{
	
	return name;
	}
	public int getAge()
	{
		return age;
	}
	//覆盖接口中的CompareTo方法
	public int compareTo(Student stu)
	{
		//看看name是否相同
		int temp=this.name.compareTo(stu.name);
		//当name和age相同时为同一个人
		return temp==0?this.age-stu.age:temp;
	}
	//覆盖Object中的toString方法
	public String toString()
	{
	return "name="+name+".....age="+age;
	}
}
//自定义一个比较器类并实现了Comparator接口
class MyComparator implements Comparator<Student>
{
	//覆盖compare方法
	public int compare(Student s,Student s1)
	{
		int temp=s1.getName().compareTo(s.getName());
		//当name和age都相同为同一人
		return temp==0?s.getAge()-s1.getAge():temp;
	}
}

第五节 Map集合
一、简述:
    1、将键映射到值的对象
    2、一个映射不能包含重复的键
    3、每个键最多只能映射到一个值
二、Map接口和Collection接口的不同
1、Map是双列的,Collection是单列的
2、Map的键唯一,Collection的子体系Set是唯一的
3、Map集合的数据结构值针对键有效,跟值无关
4、Collection集合的数据结构是针对元素有效
三、Map接口常见的功能
1、 添加功能
(1) V put(K key,V value);添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。
        (2) v oidputAll(Map <? extends K,? extends V> m);添加一个集合
2、 删除功能
(1) void clear();清空
        (2) V remove(Object key);删除指定键值对
3、判断功能
(1) boolean containsKey(Object key);判断键是否存在
        (2) boolean containsValue(Object value)判断值是否存在
        (3) boolean isEmpty();判断是否为空
4、获取功能
(1)V get(Object key);通过键获取对应的值
(2)Collection<V>value();获取Map集合中所以得值,返回一个Collection集合
    5、长度功能
(1) int size();获取集合的长度
6、Map集合的遍历
(1)键找值 Set<K> keySet();
(1).1获取所有键的集合
(1).2遍历键的集合,得到每一个键
(1).3根据键到集合中去找值
(2)键值对对象找键和值 Set<Map.Entry<K,V>> entrySet();
(2).1获取所有的键值对对象的集合
(2).2遍历键值对对象的集合,获取每一个键值对对象
(2).3根据键值对对象去获取键和值
代码体现

//对Map集合中的元素进行存取 
/*
思路;
1、创建Map集合的对象并添加元素
2、map集合中没有迭代器 有个方法可以获取Set到集合 keySet方法  第二个获取他们之间的关系
3、在用迭代器进行获取键 有了键在根据map集合中的方法获取到值

*/
import java.util.*;
class Demo7
{
	public static void main(String[] args)
	{
		//创建TreeMap集合对象
		TreeMap<String ,Integer>map=new TreeMap<String,Integer>();
		//往集合中添加元素
		map.put("张三",23);
		map.put("王五",23);
		map.put("周七",23);
		//获取集合中的元素第一种方法
		getElement(map);
		//获取集合中的元素第二种方法
		getElement1(map);
	
	}
	public static void getElement1(TreeMap<String,Integer>map)
	{
		//调用TreeSet集合中的方法返回一个集合中键和值之间的关系
		Set<Map.Entry<String,Integer>> sett=map.entrySet();
		//就用迭代器进行对集合中键和值的关系遍历
		for (Iterator<Map.Entry<String,Integer>>irr=sett.iterator();irr.hasNext() ; )
		{
			//拿到每一个键和值的关系
			Map.Entry<String,Integer> meo=irr.next();
			//根据关系中的方法获取集合中的键
			String ss=meo.getKey();
			//然后再获取值
			Integer in=meo.getValue();
			//打印键和值
			System.out.println("key="+ss+"........value="+in);
		}
	
	}

	public static void getElement(TreeMap<String,Integer> map)
	{
		//调用TreeSet集合中的方法返回一个集合中键
		Set<String>set=map.keySet();
		//对集合中的键进行遍历
		for (Iterator<String>irr=set.iterator();irr.hasNext() ; )
		{
			//获取集合中的一个键
			String s=irr.next();
			//在根据键去获取与之对应的值
			System.out.println("key="+s+"......value="+map.get(s));
		}
	
	}
}

7、Map常用的子类特点: 
        |--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。 
          |--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。    
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。 
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。 
8、代码体现

//自定义一个类 创建这个类的对象添加到map集合中去并获取添加的每个元素
/*
思路:
1 自定义一个类 有姓名 年龄 
2 创建map集合对象并添加元素
3 在获取到集合中的元素

*/
import java.util.*;
class Demo8
{
	public static void main(String[] args)
	{
		//创建TreeMap集合对象
		TreeMap<Student,String>map=new TreeMap<Student,String>();
		//往集合中添加元素
		map.put(new Student("张三",23),"上海");
		map.put(new Student("王五",13),"北京");
		map.put(new Student("李四",3),"郑州");
		map.put(new Student("周期",93),"南京");
		//往函数中传入一个Map集合
		getElement(map);
	
	}
	public static void getElement(TreeMap<Student,String>map)
	{
		//调用TreeSet集合中的方法返回一个集合中键和值之间的关系
		Set<Map.Entry<Student,String>>set=map.entrySet();
		//就用迭代器进行对集合中键和值的关系遍历
		for (Iterator<Map.Entry<Student,String>>irr=set.iterator();irr.hasNext() ; )
		{
			//拿到每一个键和值的关系
			Map.Entry<Student,String>en=irr.next();
			//根据关系中的方法获取集合中的键
			Student stu=en.getKey();
			//然后再获取值
			String s=en.getValue();
			//打印键和值
			System.out.println("key="+stu+"............value="+s);
		}
	
	
	}
}
//自定义一个学生类并实现了Comparable接口
class Student implements Comparable<Student>
{
	//私有学生类的属性
	private String name;
	private int age;
	Student(String name,int age)
	{
	this.name=name;
	this.age=age;
	}
	//并提供对外访问方式
	public String getName()
	{
	return name;
	}
	public int getAge()
	{
		return age;
	}
	//覆盖接口中的CompareTo方法
	public int compareTo(Student stu)
	{
		//name之间进行比较
		int temp=this.name.compareTo(stu.name);
		return temp==0?this.age-this.age:temp;
	}
	//覆盖Object中的toString方法
	public String toString()
	{
	
	return "name="+name+"..........age="+age;
	}

}

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

最后

以上就是时尚发箍为你收集整理的黑马程序员——java基础-集合的全部内容,希望文章能够帮你解决黑马程序员——java基础-集合所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部