栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

List集合&Set集合&Map集合

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

List集合&Set集合&Map集合

List集合&Set集合&Map集合

List集合&Set集合&Map集合
  • List集合&Set集合&Map集合
  • 一、List集合
    • 1.1.1增删改查
    • 1.1.2 Arrylist与LinkedList的区别
  • 1.2、List集合的三种遍历方式
  • 1.3、Linkedlist 中堆栈及队列
  • 1.4、List集合去重
  • 1.5、List集合增长因子论证、List集合如何去优化
  • 二、Set集合
    • 2.1.1Set集合的基本特点
    • 2.1.2遍历方式
  • 2.2、Set集合的去重原理
  • 2.3、自然排序接口及比较器接口
    • 2.4.案例
  • 三、Map集合
    • 3.1.1.Map集合的特点
    • 3.1.2.Map集合的增删改查及遍历方法
  • 3.2、HashMap的实际开发
    • 3.2.1.统计随机生成的字符出现的次数
  • 3.3、泛型
    • 3.3.1.为什么要使用泛型


一、List集合 1.1.1增删改查
package com.tft.temp;

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

public class Demo01 {
	public static void main(String[] args) {
		//创建一个list集合
		List list =new ArrayList<>();
		//给集合里面增加值
		list.add("zs");
		list.add("li");
		list.add("tft");
		list.add("ww");
		list.add("pp");
		//输出
		System.out.println("增加后的集合:"+list);
		//修改
		list.set(0, "hh");
		System.out.println("修改后的集合"+list);
		//删除
		String remove = list.remove(1);
		System.out.println("根据下标被删除的内容"+remove);
		System.out.println("删除后的内容"+list);
	}
}

1.1.2 Arrylist与LinkedList的区别
  1. Arrylist:特点: ArrayList底层是数组
  2. LinkedList:特点:Linkedlist的底层是链表
1.2、List集合的三种遍历方式

注意:遍历里面不能进行remove删除 ,会报当前改变异常

public class Demo01 {
	public static void main(String[] args) {
		//创建一个list集合
		List list =new ArrayList<>();
		//给集合里面增加值
		list.add("zs");
		list.add("li");
		list.add("tft");
		list.add("ww");
		list.add("pp");
		//第一种方式:for循环输出
		for (int i = 0; i < list.size(); i++) {
			System.out.println("使用for循环输出:"+list.get(i));
		}
		//第二种方式:for循环加强方式输出
		for (String str : list) {
			System.out.println("使用for循环加强输出:"+str);
		}
		//第三种方式:Iterator迭代器输出
		Iterator iterator = list.iterator();
		//判断是否有下一个值
		while(iterator.hasNext()) {//代表有就执行下一步
			System.out.println("迭代器输出:"+iterator.next());//输出
		}
	}
}

1.3、Linkedlist 中堆栈及队列
  1. 堆栈:特点: 先进后出
  2. 队列:特点:先进先出
public class Demo03 {
	public static void main(String[] args) {
		//开始测试  队列
		duilie dl=new duilie(new LinkedList<>());
		//调用增加的方法
		dl.push("zs");
		dl.push("ls");
		dl.push("hh");
		dl.push("dd");
		//开始取出
		System.out.println("================");
		System.out.println(dl.pop());
		System.out.println(dl.pop());
		System.out.println(dl.pop());
		System.out.println(dl.pop());
		//开始测试 堆栈
		duizhan dz=new duizhan(new LinkedList<>());
		//调用增加的方法
		dz.push("zs1");
		dz.push("ls1");
		dz.push("we1");
		dz.push("mz1");
		//开始取出
		System.out.println("================");
		System.out.println(dz.pop());
		System.out.println(dz.pop());
		System.out.println(dz.pop());
		System.out.println(dz.pop());
	}
	
	
	
}
//创建一个队列类
	class duilie{
		private LinkedList list;
		//增加元素的方法
		public void push(String list) {
			this.list.add(list);
		}
		//移除元素的方法(取出/出去)
		public String pop() {
			return this.list.remove();
		}
		
		public LinkedList getList() {
			return list;
		}
 
		public void setList(LinkedList list) {
			this.list = list;
		}
 
		public duilie(LinkedList list) {
			super();
			this.list = list;
		}
 
		@Override
		public String toString() {
			return "duilie [list=" + list + "]";
		}
		public duilie() {
		}
	}
	
	//创建一个堆栈类
		class duizhan{
			private LinkedList list;
			//增加元素的方法
			public void push(String list) {
				this.list.add(list);
			}
			//移除元素的方法(取出/出去)
			public String pop() {
				return this.list.removeLast();//从最后一个开始取出即可(删除的对象)
			}
			
			public LinkedList getList() {
				return list;
			}
 
			public void setList(LinkedList list) {
				this.list = list;
			}
			public duizhan(LinkedList list) {
				super();
				this.list = list;
			}
			@Override
			public String toString() {
				return "duilie [list=" + list + "]";
			}
			public duizhan() {
				super();
			}

}


1.4、List集合去重

注意:底层是是重写eq方法来执行去重元素

public class Demo04 {
	public static void main(String[] args) {
		
		//案例一 创建集合 增加五个元素 要求去重并且只输出去重后的元素
		List list=new ArrayList<>();
		//新增一个集合 来保存去重后的元素
		List oldList=new ArrayList<>();
		//开始增加
		list.add("张三");
		list.add("李四");
		list.add("王二");
		list.add("张三");
		System.out.println("去重前"+list);
		//开始去重
		//遍历
		for (String string : list) {
			//判断如果新集合不包含老集合的元素就增加到新集合
			if(!oldList.contains(string)) {
				oldList.add(string);
			}
		}
		System.out.println("去重后"+oldList);
	}
}


1.5、List集合增长因子论证、List集合如何去优化
  • list集合底层是数组
  • list集合底层数组的初始化容量是10、增长因子是0.5
  • list集合进行优化、只需要扩大初始化容量、减少扩容的次数、进一步提到性能
  • 数组的长度是不可变的、可list集合为何能无限制的添加元素? 答:数组容量达到上限会进行扩容

二、Set集合 2.1.1Set集合的基本特点
  1. 容器中是不会出现重写的元素
  2. set相对于List集合,是没有下标的
2.1.2遍历方式
  1. 增强的for
  2. 迭代器
2.2、Set集合的去重原理
  • hashSet底层,与hashcode,equals方法相关
  • hashset底层去重:就是与hashcode和equals方法相关(重写hashcode和equals方法)
    2、优先执行hashcode,再执行equals。当hashcode相同且equals为true,才会判定为相同元素
    注:① hashcode相同,才会执行equals
    ② hashlode不同,不会执行equals
2.3、自然排序接口及比较器接口
  • treeset相较于hashset是可以进行排序的
  • treeSet中的元素想要排序,那么必须实现java.lang.Comparable接口
2.4.案例
public class Demo3 {

	public static void main(String[] args) {
		
		
		//1.需求 按照字母来排序
		treeset相较于hashset是可以进行排序的
//		TreeSet set = new TreeSet<>();
//		
//		set.add("zs");
//		set.add("pz");
//		set.add("tfz");
//		set.add("jmh");
//		System.out.println(set);
		
		
		//2. 排序的不是string属性,而是对象person
		   //treeSet中的元素想要排序,那么必须实现java.lang.Comparable接口
		
//		TreeSet set =new TreeSet<>();
//		person p1= new person("张三", 11,7000);
//		person p2= new person("李四", 28,9000);
//		person p3= new person("王五", 22,4000);
//		set.add(p1);
//		set.add(p2);
//		set.add(p3);
//		for (person ps : set) {
//			System.out.println(ps);
//		}
		
		
		//针对不同的模块,有不同排序规则,相互之间互不干扰,针对于同一批数据
		//注意 当比较器参与排序,那么此时自然排序接口java.lang.Comparable接口就失效了
		
		//用户管理模板
//		TreeSet set = new  TreeSet<>(new Comparator() {
//			@Override
//			public int compare(person o1, person o2) {
//				return o1.getName().compareTo(o2.getName());
//			}
//		});//用户管理模板
		
		
	//左边:接口实现方法的参数列表-> 右边:实现方法的方法体
//		TreeSet set =new TreeSet<>((o1,o2)-> (int) (o2.getSalary()-o1.getSalary()));//薪资模块
		TreeSet set =new TreeSet<>((x,y)->x.getAge()-y.getAge());//储备干部管理模块
		person p1= new person("张三", 11,7000);
		person p2= new person("李四", 28,9000);
		person p3= new person("王五", 22,4000);
		set.add(p1);
		set.add(p2);
		set.add(p3);
		
		for (person ps : set) {
			System.out.println(ps);
		}
		
	}
}

class person implements Comparable{
	private String name;
	private int age;
	private float salary;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public float getSalary() {
		return salary;
	}
	public void setSalary(float salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "person [name=" + name + ", age=" + age + ", salary=" + salary + "]";
	}
	public person(String name, int age, float salary) {
		super();
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	
	public person() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public int compareTo(person o) {
		return (int) (this.salary - o.salary);
	}	
}

三、Map集合 3.1.1.Map集合的特点

特点:保存的方式,是以键值对的形式存在

3.1.2.Map集合的增删改查及遍历方法
public class Demo1 {

	public static void main(String[] args) {
		
		HashMap map = new HashMap<>();
		//增加
		map.put("张三",15);
		map.put("李四",16);
		map.put("王五",17);
		map.put("老刘",18);
		
		System.out.println(map);
		
		//删除
		Object remove = map.remove("老刘");
		System.out.println(remove);
		
		
		//修改 修改的本质就是通过key的键去覆盖之前value值 
		Object put = map.put("张三",11);
		System.out.println(put+"");
		
		//遍历map集合的方式
		
		//方式一:先获取map集合中的key键,然后在将其遍历得到单个key,最后通过单个key拿到对应的值
		Set set = map.keySet();
		for (String s : set) {
			System.out.println("key的键是"+s+"value的值是"+map.get(s));
		}
		
		//方式二:先拿到map集合对应的映射关系entry对象,然后通过entry对象,挨个拿到key以及value的值
		Set> entrySet = map.entrySet();
		for (Entry entry : entrySet) {
			System.out.println("当前key的键为"+entry.getKey()+"当前value的值为"+entry.getValue());
		}
	}
}

3.2、HashMap的实际开发 3.2.1.统计随机生成的字符出现的次数
  • 将字符转化为字符数组
  • 遍历字符数组,将遍历的字符当做key,在map集合找对应的值
  • 值为空,代表这个字符从来没有在这个map容器中出现过,给容器map赋值为1
  • 值不为空,代表曾经出现过,那么给原有对应值+1,覆盖原有的值
3.3、泛型 3.3.1.为什么要使用泛型
  1. 没有使用之前:编译通过的代码可能会在运行时产生异常,代码健壮性差
  2. 使用之后:将代码运行时的异常转换为编译期的错误,增强了代码的健壮性

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999548.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号