Java基础_泛型与集合

Day_15 泛型与Collection应用

一.泛型
1.定义:泛型常用来和集合对象一起使用,在学习集合之前,必须先了解什么是泛型,泛型的概念十分重要,它是程序的增强器,也是目前主流的开发方式。泛型是JDK1.5的一个新特性,本质上就是编译器为了提供更好的可读性而提供的一种小手段,小技巧。虚拟机层面是不存在所谓泛型的概念的。

2.作用
<1>通过泛型的语法定义,约束集合元素的类型,进行安全检查,把错误显示在编译期。
<2>代码的通用性更强。
<3>泛型可以提升程序代码的可读性,但仅仅是一个语法糖(编译后这样的东西被删除,不出现在最终的源代码中),对于JVM运行时的性能是没任何影响的。

3.声明:泛型可以在接口,方法,返回值上使用。

4.优点
<1>规定了数据的类型,不能想放什么数据就放什么数据,要遵守泛型规定的数据类型。
<2>如果类型不对,把运行时期才报的错误直接在编译时期报出。
<3>泛型的数据类型只能是引用类型,非基本类型。

二.Collection
1.定义:用来存放对象的数据结构,其中长度可变,而且集合中可以存放不同类型的对象,并且提供了一组成批对象的方法。数组的缺点,即长度是固定不变的,访问方式单一,插入删除操作繁琐。

三.List接口
1.定义:有序的collection,也成为了序列。此接口的用户可以对列表中的每个元素插入位置进行精确的控制。用户可以根据元素的证书索引(在列表中的位置)访问元素,并搜索列表中的元素。

2.特点:
<1>数据有序。
<2>允许存放重复的元素。
<3>元素都有索引。

3.ArrayList:存在于java.util包中,内部用数组存放数据,封装了数组的操作,每个对象都有下标。内部数组默认初始容量为10,如果不够会以1.5倍容量增长。查询的速度快,但是增删数据效率低。

4.LinkedList:双向链表,底层由数组和链表实现。下标遍历效率低,迭代器遍历效率高。

四.List常用方法

import java.util.ArrayList;
public class Practice {
    
    

	public static void main(String[] args) {
    
    
		
		ArrayList list = new ArrayList();
		
		list.add("aaa");
		list.add(123);
		list.add("ccc");
		list.add("ddd");
		
		System.out.println(list);
		System.out.println(list.size());
		System.out.println(list.get(1));
		System.out.println();
		
		System.out.println(list.remove(2));
		System.out.println(list);
		
		for(int i = 0;i<list.size();i++)
		{
    
    
			System.out.println(list.get(i));
			System.out.println();
		}

	}

}

五.Map常用方法

import java.util.*;
import java.util.Map;

public class Map_ {
    
    

	public static void main(String[] args) {
    
    
		
		Map map = new HashMap();
		map.put("001","钢铁侠");
		map.put("002","蜘蛛侠");
		
		//如果此映射包含指定键的映射关系,则返回true。
		System.out.println(map.containsKey("001"));
		
		//如果此映射将一个或者多个键映射到指定值,则返回true。
		System.out.println(map.containsValue("美国队长"));
		
		//如果此映射未包含键值映射关系,则返回true。
		System.out.println(map.isEmpty());
		
		//返回指定键所映射的值,如果不存在则返回null。
		System.out.println(map.get("001"));
		
		//如果存在一个键的映射关系,则将其从此映射中移除。
		System.out.println(map.remove("001"));
		
		System.out.println(map.containsValue("钢铁侠"));
		
		System.out.println(map.size());
		
		Map map2 = new HashMap();
		
		map2.put("999", "刘德华");
		
		//复制map2到map中。
		map.putAll(map2);
		
		System.out.println(map);
		
		System.out.println(map2);
		
	}

}

六.ArrayList扩容
ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间。当第一次插入元素时才分配10个对象空间。(默认)假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10,之后扩容会按照1.5倍增长,也就是当添加第11个数据的时候,ArrayList继续扩容为15。当添加第16个数据时,继续扩容变为22个。
ArrayList没有对外暴露其容量个数,查看源码我们可以知道,实际的值存放在elementData对象数组中,那我们只需要拿到这个数组的长度,观察其值变化了几次就知道其扩容了多少次,如何获取,就只能运用反射技术了。

七.HashMap扩容
成长因子:static final float DEFAULT_LOAD_FACTOR=0.75f;当空间只有仅仅为10的时候是很容易造成两个对象的hashcode所对应的地址是一个位置的情况。这样就造成两个对象会形成链表。这时就有一个加载因子的参数,默认为0.75,如果hashmap的空间有100,那么当插入了75个元素的时候hashmap就需要扩容了,不然的话会形成很长的散列桶结构,对于查询和插入都会增加时间,因为它需要一个一个的equals比较。但是又不能让加载因子很小,如0.01,这样显然是不合适的,频繁的扩容会大大消耗内存,这时就存在这一个平衡,在jdk中默认是0.75,淡然负载因子也可以根据自己的实际情况进行调整。

八.数组和链表的区别
List是一个接口,它有两个常用的子类,Arraylist和LinkedList,看名字就可以看出一种是基于数组实现,另一个是基于链表实现的。数组插入和删除元素需要重新申请内存,然后拼接结果保存进去,成本很高,例如有100个值日,中检查入一个元素,就需要数组重新拷贝。相反,对于链表来说,改变一下相邻两个元素的指针即可,所以链表在插入元素时性能非常高。实际开发就根据他们各自不同的特点来匹配对应业务的特点,业务一次赋值,不会改变,顺序遍历就采用数组。业务频繁变化,有新增,有删减,则链表更加适合。

九.Set接口
1.定义:一个不包含重复元素的collection,数据无序,是因为set集合没有下标,由于集合中的元素不可重复,常用于元素去重。

2,特点
<1>HashSet的底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然,K不允许重复。
<2>TreeSet底层是TreeMap,红黑树的形式,便于查找数据。
<3>HashMap视线中,当哈希值相同的对象,会在同一个hash值的位置存储不同属性的数据。

十.HashSet
1.定义:此类实现Set接口,由哈希表支持,它不保证set的迭代顺序,特别是它不保证该顺序恒久不变,此类允许使用null元素。

十一.Map接口
1.定义:java.util接口 Map<K,V>。

2.类型参数:K-此映射所维护的键的类型,V-映射值的类型。也叫做哈希表,散列表,常用于存键值对结构的数据,其中的键不能重复,但是值可以重复。例如:key=9527,value=唐伯虎。

3.特点
<1>可以根据键提取对应的值。
<2>键不允许重复,如果重复则值会被覆盖。
<3>存放的都是无序的数据。
<4>初始容量是16,默认的加载因子是0.75。

十二.HashMap
1.定义:基于哈希表的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置,算法hash(key)%n,n就是数组的长度。当计算的位置没有数据时,就直接存放,当计算的位置有数据时,也就是发生hash冲突时,采用链表的方式来解决,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头节点加入。

十三.字符串中的字符统计

import java.util.*;
public class String_Statistics {
    
    

	public static void main(String[] args) {
    
    
		
		System.out.print("请输入一串字符串:");
		String s = new Scanner(System.in).nextLine();
		
		HashMap<Character,Integer> map = new HashMap<>();
		
		for(int i=0;i<s.length();i++)
		{
    
    
			//1.取出字符串中的每个字符。
			char c = s.charAt(i);
			
			//2.拿着字符查个数。
			Integer count = map.get(c);
			if(count==null)
			{
    
    
				map.put(c,1);
			}
			else
			{
    
    
				map.put(c, count+1);
			}
			
		}
		System.out.println(map);

	}

}

十四.Collection工具类常用方法
1.Collection.sort(List<>list):根据元素的自然顺序对指定列表按升序进行排序。
2.Collection.max():根据元素的自然顺序,返回给定collection的最大元素。
3.Collection.min():根据元素的自然顺序,返回给定collection的最小元素。
4.Collection.swap(List,i,j):在指定列表的指定位置交换元素。

十五.Collectiong工具类测试

import java.util.*;
public class Collection_ {
    
    

	public static void main(String[] args) {
    
    
		
		List<String> list = new ArrayList();
		
		//添加多个元素。
		Collections.addAll(list, "3","30","23","15","29","12");
		
		Collections.sort(list);
		System.out.println(list);
		
		System.out.println(Collections.max(list));
		
		System.out.println(Collections.min(list));
		
		Collections.swap(list, 0, 4);
		System.out.println(list);
		
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_41858806/article/details/112261209