集合框架和泛型(详解)

目录

1.集合框架

ArrayList常用方法

LinkedList常用方法

Set接口

迭代器Iterator

Map接口

泛型集合

Collections算法类

总结


内容仅供学习交流,如有问题请留言或私信!!!!!

有空您就点点赞


1.集合框架

        如果并不知道程序运行时会需要多少对象,或者需要 更复杂方式存储对象——可以使用Java集合框架

        包含的内容:

  • Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。
  • Collection 接口存储一组不唯一,无序的对象。
  • List 接口存储一组不唯一有序(插入顺序)的对象。
  • Set 接口存储一组唯一无序的对象。
  • Map 接口存储一组键值对象,提供key到value映射

list接口实现的类:

  • ArrayList:实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高(内部使用数组实现,查询效率高,增删效率低)
  • LinkedList:采用链表存储方式,插入、删除元素时效率比较高(内部使用双向链表实现,增删效率高,查询效率低)

-----------------------------------------------------------------------------------------------------------------------

ArrayList常用方法

方法名

说明

boolean add(Object o)

在列表的末尾顺序添加元素,起始索引位置从0开始

void add(int index,Object o)

在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间

int size()

返回列表中的元素个数

Object get(int index)

返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换

boolean contains(Object o)

判断列表中是否存在指定元素

boolean remove(Object o)

从列表中删除元素

Object remove(int index)

从列表中删除指定位置元素,起始索引位置从0开始

        Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()

import java.awt.List;
import java.util.ArrayList;
import java.util.Arrays;

public class Test {

	public static void main(String[] args) {

		ArrayList list = new ArrayList();
		list.add("a");//向后新增值
		list.add("b");
		list.add(1, "c");//指定位置插入
		list.add(1, "d");
		list.add("e");
		list.add("f");
		System.out.println(Arrays.toString(list.toArray()));
		System.out.println("获得集合长度===="+list.size());
		System.out.println("根据下标获得值===="+list.get(3));
		boolean bool =  list.contains("a");  
		System.out.println("判断列表中是否存在指定元素===="+bool);
		System.out.println("根据内容删除元素===="+list.remove("a"));
		System.out.println(Arrays.toString(list.toArray()));
		System.out.println("根据下标删除元素===="+list.remove(1));
		System.out.println(Arrays.toString(list.toArray()));


	}

}

-----------------------------------------------------------------------------------------------------------------------

LinkedList常用方法

方法名

说明

void  addFirst(Object o)

在列表的首部添加元素

void  addLast(Object o)

在列表的末尾添加元素

Object  getFirst()

返回列表中的第一个元素

Object  getLast()

返回列表中的最后一个元素

Object  removeFirst()

删除并返回列表中的第一个元素

Object  removeLast()

删除并返回列表中的最后一个元素

使用方法同ArrayList。

-----------------------------------------------------------------------------------------------------------------------

Set接口

  • Set接口存储一组唯一,无序的对象
  • HashSet是Set接口常用的实现类
  • Set中存放对象的引用

无序、唯一性测试:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

//无序、唯一性测试
public class test {

	public static void main(String[] args) {
		Set sets = new HashSet();
//		String s1 = "张三";
//		String s2 = s1;
//		String s3 = "王五";
	//----------------------------
		String s1 = new String("张三");
		String s2 = new String("张三");
		String s3 = "王五";
		sets.add(s1);
		sets.add(s2);
		sets.add(s3);

		System.out.println(Arrays.toString(sets.toArray()));
		
	}

}

Set接口如何判断加入对象是否已经存在呢?

        采用对象的equals()方法比较两个对象是否相等

Set set=new HashSet();

String s1=new String("java");

String s2=s1;

String s3=new String ("java");

set.add(s1);

set.add(s2);

set.add(s3);

System.out.println(set.size());

HashSet是Set接口常用的实现类

Set newsTitleSet = new HashSet();

NewTitle car = new NewTitle(1, "汽车", "管理员");

//增加元素

newsTitleSet.add(car);

//获取元素个数

System.out.println("新闻标题数目为:" + newsTitleList.size() + "条");

Set接口不存在get()方法,通过迭代器增强for循环来进行。

迭代器Iterator

        当集合内容很大时使用迭代器(效率较高)

  • 方法1:通过迭代器Iterator实现遍历
  • 获取Iterator :Collection 接口的iterator()方法
    • Iterator it = sets.iterator();
  • Iterator的方法
    • boolean hasNext(): 判断是否存在另一个可访问的元素
    • Object next(): 返回要访问的下一个元素
      • while (it.hasNext()) {
                    //判断下一个是否有值
                    System.out.println(it.next());    
                }
  • 方法2:增强型for循环

  for( 元素的数据类型 变量名  :  数组名/集合名 ){

        }

-----------------------------------------------------------------------------------------------------------------------

eg:

for(Object obj : sets) {
            System.out.println(obj);
        }

-----------------------------------------------------------------------------------------------------------------------

Map接口

        存储一组键值对象,提供keyvalue的映射。

  • Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作。
    • 常用的是HashMap。
    • put(key,value)//存放
    • get(key)   //获得键值
    • size( )   //获取键值对对数

Map接口常用方法:

方法名

说明

Object put(Object key, Object val)

以“键-值”对的方式进行存储

Object get(Object key)

根据键返回相关联的值,如果不存在指定的键,返回null

Object remove(Object key)

删除由指定的键映射的“键-值对”

int size()

返回元素个数

Set keySet()

返回键的集合

Collection values()

返回值的集合

boolean containsKey(Object key)

如果存在由指定的键映射的“键-值对”,返回true

常用方法测试如下: 

package dh02;

import java.util.HashMap;
import java.util.Map;

/*
 * map
 * 国家中英文名称信息对照
 * 
 * 中国-China
 * 美国-USA
 * 日本-Japan
 * 
 */
public class CountriesInfo {

	public static void main(String[] args) {
		// 创建集合对象,并将国家信息键值放入集合
		Map countries = new HashMap();
		countries.put("China", "中国");
		countries.put("USA", "美国");
		countries.put("Japan", "日本");

		// 获取集合中存储的元素个数(键值对对数)
		System.out.println(countries.size());

		// 获取结合中特定的key对应的value--object返回值类型,需要强制数据类型转换

		String country = (String) countries.get("China");
		System.out.println(country);

		// 获取结合中特定的key对应的value,如果找不到,则返回null
		String country1 = (String) countries.get("Australia");
		System.out.println(country1);

		//判断集合中是否存在某一个国家
		System.out.println("国家列表中是否存在China:"+countries.containsKey("China"));
		System.out.println("国家列表中是否存在Australia:"+countries.containsKey("Australia"));
		
		//删除某个特定的key对应的键值对
		System.out.println("国家列表中是否存在USA:"+countries.containsKey("USA"));
		countries.remove("USA");
		System.out.println("国家列表中是否存在USA:"+countries.containsKey("USA"));
		System.out.println(countries.size());
		
		//获取键的集合,值的集合,键值对的集合
		System.out.println(countries.keySet());
		System.out.println(countries.values());
		System.out.println(countries);
		
		
	}

}

遍历Map集合

  • 方法一:遍历key,通过key > value
    • 方法1:通过迭代器Iterator实现遍历

      // 方法一:迭代器Iterator遍历key的集合(Set)

      Iterator it = keys.iterator();
      while (it.hasNext()) {
                  String key = (String) it.next();// 获取到了map中的每一个key
                  String value = (String) countries.get(key);// 根据map中的每个key去获取对应的value
                  System.out.println(key + "-----" + value);

              }

    • 方法2:增强型for循环

      // 遍历Map 思路一:遍历key(set),通过key > value
      // 方法一:增强for遍历key的集合(set)

      Set keys = countries.keySet();// 获取到了Map中的所有key
      for (Object obj : keys) {
                  String key = (String) obj;// 获取到了map中的每一个key
                  String value = (String) countries.get(key);// 根据map中的每个key去获取对应的value
                  System.out.println(key + "-----" + value);
              }

  • 方法二:遍历key-value对

    // 遍历Map 思路二:获取map中的所有键值对,然后再键值对中分别获取key和value

    Set set = countries.entrySet();// 获取map中的键值对
    // 遍历键值对的集合,把每个键值对(obj)---Map.Entry(键值对的类型)拿出来
    for (Object obj : set) {
                Map.Entry me = (Map.Entry) obj;
                String key = (String)me.getKey();// 获取键值对中的键
                String value = (String)me.getValue();// 获取键值对中的值
                System.out.println(key + "-----" + value);
            }

练习:根据学生英文名查看是否在map中

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

//测试学生信息
public class TestStudent {

	public static void main(String[] args) {
		Student stu1 = new Student("张三", "男");
		Student stu2 = new Student("李明", "男");
		Student stu3 = new Student("王小华", "女");
		
		Map stuMap = new HashMap();
		stuMap.put("Buck",stu1);
		stuMap.put("Jack",stu2);
		stuMap.put("Jession",stu3);
		
		//输出几名学生进入外企
		System.out.println("一共有"+stuMap.size()+"名学生进入");
		System.out.println("---------------他们是---------------");
		Set set = stuMap.entrySet();
		for (Object object : set) {
			Map.Entry me = (Map.Entry)object;
			String key = (String)me.getKey();
			Student student = (Student)me.getValue();
			System.out.println(key+"-"+student.getName()+"-"+student.getSex());
		}
		//实现特定英文名称对应的学生信息
		System.out.println("*********************************");
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入您要查询的学生英文名:");
		String name = sc.next();
		if (stuMap.containsKey(name)) {
			//在map中找到了相应的key,则根据key去获取相应的value(学生对象)
			Student student = (Student)stuMap.get(name);
			System.out.println("该学生的全部信息如下:");
			System.out.println(name+"-"+student.getName()+"-"+student.getSex());
		}
		else {
			System.out.println("对不起,没有该名学生!!!!!");
		}

		
	}

}

-----------------------------------------------------------------------------------------------------------------------

泛型集合

  • 如何解决以下强制类型转换时容易出现的异常问题?
    • List的get(int index)方法获取元素
    • Map的get(Object key)方法获取元素
    • Iterator的next()方法获取元素 
  • 通过泛型
    • JDK5.0使用泛型改写了集合框架中的所有接口和类

泛型:将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。

        本质上是参数化类型(以数据类型作为参数进行传递)。

有了泛型,不再需要进行强制类型转换

泛型集合:

  • 泛型集合可以约束集合内的元素类型
  • 典型的泛型集合ArrayList<E>、HashMap<k,v>
    • <E>、<K,V>表示该泛型集合中的元素类型
    • 泛型集合中的数据不再转换为Object
  • 除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样

-----------------------------------------------------------------------------------------------------------------------

Collections算法类

  • Java集合框架将针对不同数据结构算法的实现都保存在工具类中
  • Collections类定义了一系列用于操作集合的静态方法

Collections类常用方法:

  • Collections和Collection不同,前者是集合的操作类,后者是集合接口
  • Collections提供的常用静态方法
    • sort():排序
    • max()\min():查找最大\最小值
    • reverse():反转元素顺序
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

//Collections的常用方法
public class CollectionsUseDemo {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>(); 
		list.add("ant");
		list.add("bear");
		list.add("pen");
		list.add("zoo");
		list.add("apple");
		list.add("candy");
		list.add("zookeeper");
		
		System.out.println("**********************");
		for (String s : list) {
			System.out.println(s);
		}
		
		System.out.println("**********************");
		//使用Collections对集合进行升序排列
		Collections.sort(list);
		for (String s : list) {
			System.out.println(s);
		}
		//查找集合元素的最大、最小值
		System.out.println("**********************");
		System.out.println("集合中的最大元素:"+Collections.max(list));
		System.out.println("集合中的最小元素:"+Collections.min(list));
		//查找集合中的特定元素(必须进行排序)
		System.out.println("**********************");
		System.out.println(Collections.binarySearch(list, "candy"));
		
		//反转集合元素的顺序
		Collections.reverse(list);
		System.out.println("**********************");
		for (String s : list) {
			System.out.println(s);
		}
		
		
	}
}

-----------------------------------------------------------------------------------------------------------------------

Collections排序:

  • Collections类可以对集合进行排序、查找和替换操作
  • 实现一个类的对象之间比较大小
    • 第一步:该类要实现Comparable接口
    • 第二步:重写compareTo()方法,自定义比较规则

eg:

第一步&第二步

package dh02;
//学员类
public class Student implements Comparable{
	private int no;//学号
	private String name;
	private String sex;
	
	public Student() {
	}
	public Student(String name, String sex) {
	    this.name = name;
		this.sex = sex;
	}
	public Student(int no, String name, String sex) {
		this.no = no;
		this.name = name;
		this.sex = sex;
	}
	//--------------------------
	//重写方法:定义学生对象的比较规则
	//比较规则:按学号比,大的往后排
	//比较对象:当前学生对象(this)和Object o
	public int compareTo(Object o) {
		Student student = (Student)o;
		if (this.no == student.no) {
			return 0;//学号相同,两个学生对象一样大
		}
		else if (this.no > student.no) {
			return 1;//当前学生对象学号大于比较的学生对象学号
		}
		else {
			return -1;//当前学生对象学号小于比较的学生对象学号
		}
	}
	//--------------------------
	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}


}

测试类

package dh02;

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

//Collections的常用方法
public class CollectionsStudent {
	public static void main(String[] args) {
		List<Student> list = new ArrayList<Student>();
		Student stu1 = new Student(1, "张三", "男");
		Student stu2 = new Student(7, "李四", "男");
		Student stu3 = new Student(3, "王小花", "女");
		Student stu4 = new Student(9, "王五", "男");
		list.add(stu1);
		list.add(stu2);
		list.add(stu3);
		list.add(stu4);
		System.out.println("**********************");
		for (Student stu : list) {
			System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex());
		}
		System.out.println("**********************");
		// 使用Collections对集合进行升序排列
		Collections.sort(list);
		for (Student stu : list) {
			System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex());
		}

	}
}


总结

        练习题跳转链接:请点击这里!!!        

补充:

  • ArrayList数组初始容量为:0
  • 如何进行扩容?通过copyof
  • 每次扩容多少?1.5倍
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚人钊呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值