Java学习-第18天

package _01_Collection._03_Set;

import java.util.HashSet;
/**
 * 散列表结构 可以理解为 数组中保存的是链表的首节点,用来保存k和v 键值对操作
 * 
 * hash算法 : 是一种加密机制,可以把不定长的数据转换为定长数据,并且不能保证其唯一性,又叫哈希冲突
 * 
 * 在java中 值的就是 hashCode方法
 * 
 * 对一个对象生成多次hash值,值一定相同, 多个对象也可能生成相同的hash值,叫哈希冲突
 * 
 * k不可以重复,v可以重复
 * 
 * 添加过程: 
 			1 根据要添加的key,调用他的hashCode方法,生成hash值
 			2 通过一定的算法,根据hash值生成数组的下标
 			3 判断该下标中, 是否有数据 如果没有数据就把该键值对银蛇关系保存到数组中
 			4 如果该下标中 有数据 则调用key的equals方法,和对应的所有数据进行比较,如果不相等,则添加到尾部即可
 			5 如果对应的链表中,通过equals方法比较的时候,发现了相同的数据,那么key不再天剑,只是value的值会替代原来的value值
 			
 	通过添加过程得知,会自动调用该对象的hashCode和equals,所以在保存自定义类型的时候,需要注意方法覆写
 	
 	在1.8中有个新改动,为了提高查询效率,引入了红黑树和扩容的优化
 			因为链表在查询性能上较差,所以每个数组中的链表个数如果大于7,则会把该链表转化为红黑树
 			数组默认初始化容量为16
 	在java中 没有散列表的概念,把散列表封装为了HashMap和HashTable
 * 
 * @author SEC90
 * @Date 2022年1月20日下午7:11:20
 */
public class HashSet_01 {
	@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
	public static void main(String[] args) {
		HashSet set = new HashSet();
		set.add(1);
		set.add("asd");
		set.remove("asd");
		System.out.println(set.size());
		System.out.println(set.isEmpty());		
				for (Object object : set) {
			
		}
	}
}
package _02_Map;


import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;


/**
 * Map是无序的 并且保存的是K-V键值对映射关系,其中K不能重复,V可重复
 * 
 * HashMap : 底层是散列表
 * 
 * TreeMap : 底层是红黑数 元素必须安照一定的规则进行排序
 * 
 * 映射关系 : 比如商品和购买数量 或者数据统计 
 *  "ashfoiuholisknafgdf" 统计每个字符出现的次数 使用HashMap进行存储 字符做K 次数做V
 * 
 * @author SEC90
 * @Date 2022年1月20日下午2:11:53
 */
public class Map_01 {
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) {
		HashMap map = new HashMap();
		map.put("A", "one");
		//key重复不添加 value替换
		map.put("A", "2222");
		map.put("B", "two");
		map.put("C", "three");
		map.put(65, 100);
		//char 不是引用数据类型,会转化为对应的包装类
		map.put('A', "1234");
		//支持K和V都为NULL,但是没有意义
		map.put(null, null);
		//个数
		System.out.println(map.size());
		//根据key 获取value
		System.out.println(map.get("A"));
		//判断是否包含某个key
		System.out.println(map.containsKey("A"));
		//判断是否包含某个value
		System.out.println(map.containsValue("one"));
		根据key删除该映射关系 返回对应的value
		map.remove(65);
		//获取所有的value,并放到集合中返回
		Collection values = map.values();
		for	(Object object : values) {
			System.out.println(object);
		}
		System.out.println("================");
		//keySet: 获取所有的key 封装到set对象中并返回
		Set keys = map.keySet();
		for(Object object : keys){
			System.out.println(object + " : "+map.get(object));
		}
		//把map转化为set
		//Entry 类中 保存了K和V两个变量,把map中的k和v转换为entry类的对象进行存储
		//所以我们值需要保存entry对象,就等于保存了k和v
		Set set= map.entrySet();
		for(Object object :set){
			//C=three
			System.out.println(object);
			//转换为entry类型
			 Entry entry = (Entry) object;
			//获取k和v
			System.out.println(entry.getKey() +" : " + entry.getValue()
					);
		}
	}
}
package _02_Map;

import java.util.Properties;

public class Map_02 {
	public static void main(String[] args) {
		//特殊的map,k和v 都必须是字符串
		Properties properties = new Properties();
		//添加数据
		properties.setProperty("asd", "1243");
		//获取value
		properties.getProperty("asd");
	}
}
package _02_Map;

import java.util.Comparator;
import java.util.TreeMap;



/**
 * TreeMap 保存的元素会按照一定规则排序 底层是红黑数
 * 
 * Comparable 和 Comparator
 * @author SEC90
 * @Date 2022年1月20日下午3:11:30
 */
public class Map_03_TreeMap {
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) {
		// 添加自定义类型,并且Product实现了Comparable接口
		TreeMap map = new TreeMap();
//		map.put(new Product("苹果", 5.3), 10);
//		map.put(new Product("香蕉", 5.6), 10);
//		System.out.println(map);
//		System.out.println(map.size());
		// /添加已有类型 且该类型实现了Comparable接口,Interger默认升序
		// 如果没有实现Comparable接口,或者我们想要降序,则需要Comparator
		map = new TreeMap(new Comparator() {
			@Override
			public int compare(Object o1, Object o2) {
				Integer i1 = (Integer) o1;
				Integer i2 = (Integer) o2;
				return i2-i1;
			}
		});
		map.put(11, "a");
		map.put(2, "a");
		map.put(24, "a");
		map.put(3, "a");
		System.out.println(map.size());
		System.out.println(map);
	}
}

@SuppressWarnings("rawtypes")
class Product implements Comparable {
	@SuppressWarnings("unused")
	private String name;
	private double price;
	public Product(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}

	@Override
	public int compareTo(Object o) {
		if (o instanceof Product) {
			Product product = (Product) o;
			if (this.price > product.price) {
					return 1;
			}else if (this.price < product.price) {
				return -1;
			}
		}
		return 0;
	}
}
package _02_Map;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;



/**
 * 泛型 : 在编译过程中检测数据类型是否匹配
 * 
 * 泛型 必须是引用类型,不能使用基本类型
 * 
 * 优点 : 统一了数据类型 ,减少了类型转换
 * 
 * 缺点 :只能保存同一种类型
 * @author SEC90
 * @Date 2022年1月20日下午3:22:40
 */
public class Map_04_Generic_01 {
	@SuppressWarnings({ "unchecked", "unused" })
	public static void main(String[] args) {
		@SuppressWarnings("rawtypes")
		//没有使用泛型
		List list =  new ArrayList();
		//添加声明类型都行
		list.add(new A());
		//取得时候拿到的是Object
		for (Object object : list){
			//需要进行判断和向下转型才行
			if(object instanceof A){
			A a = (A ) object;
			a.m1();
			}
		}
		//使用泛型 规定 该集合中只能保存A类型
		List<A> list2 = new ArrayList<A>();
		list2.add(new A());
		//添加其他报错,且是编译错误
		//list2.add(2);
		
		//使用的时候 ,拿到的直接就是A类型不会出啊先类型转换异常
		//因为只要能运行就一定有A
		for(A a : list2){
			a.m1();
		}
		//泛型 不能写基本类型 只能写引用类型
		//如果想要保存基本类型 ,则需要编写对应的包装类类型
		//List<int> list 3 = new ArrayList<int>();
		List<Integer> list3 = new ArrayList<Integer>();
		
		//如果 需要保存多种数据 则不需要使用 泛型
		//但是如果需要保存同一种类型数据,则一定要使用泛型,这样方便操作
		
		//set和map使用泛型
		Set<String> set = new HashSet<String>();
		Map<String, Integer> map = new HashMap<String, Integer>();
	}
}

class A{
	public void m1() {
		System.out.println("m1");
	}
}
package _02_Map;
/**
 * 定义泛型 使用大写字母A-Z表示,写什么都一样,都只是占位符而已,只不过 某些字符也有一些特殊的含义
 * 		E: Element 一般表示元素,而集合中的数据 我们叫元素,所以在集合中出现的泛型一般使用E表示
 * 		K: key 表示键
 * 		V: value 表示值 K和V一般在散列表中出现
 * 		T: Type 表示一个java类型
 * 		N: 表示Number
 * 		?: 表示不确定的类型
 * 
 * 如果规定了泛型但是使用的地方没有指定泛型,则默认为Object 类型
 * @author SEC90
 * @Date 2022年1月20日下午3:42:42
 */
public class Map_04_Generic_02 {
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) {
		//不指定类型,默认Object
		MyClass myClass = new MyClass();
		myClass.m1(1);
		myClass.m1("asdadas");
		//指定类型
		MyClass<String> x = new MyClass<String>();
		x.m1("sadad");
//		x.m1(123);
	}
}
//自定义类型,T就是占位符
class MyClass<T>{
	public void  m1(T o) {
		System.out.println(o);
	}
}
package _02_Map;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

/**
 * Map以Value进行排序
 * 
 * Map 是没有办法按照value排序的 因为源码中写死了 使用key进行排序
 * 
 * 所以只能保存到List数组中进行排序
 * @author SEC90
 * @Date 2022年1月20日下午4:18:45
 */
public class Map_05 {
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void main(String[] args) {
		Map<String, Integer> map = new TreeMap<String, Integer>();
		map.put("b",11);
		map.put("a",21);
		map.put("c",145);
		map.put("d",41);
		map.put("e",15);
		System.out.println(map);
		//把map封装到entry中并保存到set中
		Set set = map.entrySet();
		//把set保存到list中,通过ArrayList的有参构造可以直接把set转换为list
		List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
		//排序
		Collections.sort(list,new Comparator<Entry<String, Integer>>() {
			@Override
			public int compare(Entry<String, Integer> o1,
					Entry<String, Integer> o2) {
				return o1.getValue()-o2.getValue();
			}
		});
		System.out.println(list);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值