Collection类,泛型
Collection(接口)
	所有超级接口: 
			Iterable<E> 
一.集合
	  1.集合的介绍&集合和数组的区别
		    什么是集合:java中的一种容器
		    什么是数组:java中的一种容器
		    区别:
			      数组的长度是固定的,如果增加长度,只能创建另一个数组
			      集合的长度是可变的,数据可以理论无限调价,自动扩容
		    小区别:
			      数组的元素必须是同一种类型。例子:int[] nums=new int[10];
			      集合的元素可以不同类型。例子:ArrayList<Obiect> nums=new ArrayList<Interfger>();
	  2.集合框架的介绍
		    在JDK1.1的时候,只有一种集合Vector<泛型>
		    在JDK1.5的时候,出现集合框架(一大堆类在一起)
				    集合框架顶层接口:Collection<E>
				    子接口:	List<E> :列表	        		Set<E>集	        			Queue<E>
						      有序,有下标,可重复	      	无序(LinkedHashSet除外),无下标,不可重复
				    实现类:ArrayList,LinkedList,Vector    HashSet	  	TreeSet
						        数组列表,链式列表,	    		哈希集	 linkedHashSet
																                            链式哈希集
	  3.collection中的通用方法:
		    增:public boolean add(E e);------E的意思是泛型
		    删:public void remove(E e);
		    改:无(需要下标)
		    查:无
		    其他:
			      public void clear();//清空,删除集合中的所有元素
			      public int size();//获取集合的长度(元素个数)
			      public boolean contains(E e);//判断当前集合中是否包含了给定的对象
			      public boolean isEmpty();//判断当前集合是否有元素
			      public Object[] toArray();//转成数组
		    注:
			      集合直接打印为数组。
			      数组直接打印为地址值
三.集合的通用遍历方式--------迭代器
	  1.集合迭代器的原理:
		    仓库管理员(迭代器对象)-----Iterator
		    获取迭代器对象:调用集合.iterator()
/*
public static void main(String[] args) {
Collection<String> collection=new ArrayList<String>();
collection.add("a");
collection.add("b");
collection.add("c");
collection.add("d");
//迭代器遍历集合
//1.找到迭代器
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
System.out.println(next);
} // //2.判断是否有下一个元素
// boolean b = iterator.hasNext();
// if (b){
// String next = iterator.next();
// System.out.println(next);
// }
}
*/
  借助了指针,只有next会让指针动。
		  hasNext只是用来判断
		  注意:
			    必须先判断,元素存在,再取出元素
	  2.集合迭代器的介绍和使用
		     所谓的集合迭代器就是用来遍历集合的
		   标准遍历代码:
Iterator<集合的泛型> iterator=集合.iterator();
while (iterator.hasNext()) {
集合的泛型 next = iterator.next();
System.out.println(next);
}
  3.增强for循环:
		    语法糖:格式的省略版本,但是底层原理不变
			  例子:
int[] nums=new int[]{1,2,3,4,5};
存在栈中	存在堆(new)中
int[] nums={1,2,3,4,5};
迭代器的语法糖:是增强for循环:
格式:
for(数据类型 变量名:数组/集合){
System.out.println(变量名);
}
  注意:
    迭代器遍历时,不能在遍历的过程中,对集合的元素进行添加和删除
报错:
ConcurrentModificationException
原因:
迭代,在获取时会记录集合的长度(记忆长度)
如果我们在遍历的过程中修改了集合的长度(添加,删除)
这时候迭代器就是比较记忆长度==舞台的实际长度
  快捷键:
			    集合/数组.for 回车
三.泛型
	  1.什么是泛型
		    ArrayList<Integer> nums=new ArrayList<Integer>();
		    可以消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
		  泛型:
			    一种不确定的类型
		  格式;
			    一个泛型:<E>
			    两个泛型:<K,V>
	  2.泛型的好处:
		    a.不使用泛型(前提想要取相同的类型,进行遍历)
			      1.需要手动的向下转型
			      2.编译时不报错,运行时直接崩溃,并出现类型转换异常
				      Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
			      例子:
ArrayList arrayList=new ArrayList();
arrayList.add("dad");
arrayList.add(11);
arrayList.add(3.14F);
arrayList.add(true);
for (Object o : arrayList) {
String s =(String) o;
System.out.println(s);
}
}
    运行结果:
					      dad
				      Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
					       at day02.demo04.main(demo04.java:13)
      Process finished with exit code 1	
		   b.使用泛型
			    1.不需要手动向下转型
			    2.把运行时异常	转译到 编译时报错
		      JDK1.5之后强烈建议使用泛型。
	    3.泛型的定义和使用:
		       a.泛型类
			          格式:
				            public class 类名<E>{
					            既可以使用E:E e
					            public void setE(E newE){
						            this.e=new E;
					              }
				            }
			          例子:
public class GenericClass <E>{
private E a;
public E getA() {
return a;
}
public void setA(E a) {
this.a = a;
    }
}
    使用:
				      类名<Interger> 对象名=new 类名<Interger>();
		  2.泛型方法:泛型使用在方法上
				    格式:	
					       public <T> void 方法名(F f){
      }	
				    例子:
					      public <String> void Generic(String s){
      }
				    使用:
					      对象.方法名(具体的参数)
					      此时泛型方法中泛型确定了,是我们传入具体参数的类型
		  3.泛型接口
				    格式:
					    public interface 接口名<E>{
						    public abstract void show(E e)
					    }
				    注意:	
					      public abstract(抽象类中不能省略)
				    使用:
a.实现类在实现接口时,直接确定泛型
public class 类名 implements 接口名<String>{
public abstract void show(String e);
}
b.实现类在实现接口时,不确定泛型,而是继续保留
public class 类名 implements 接口名<E>{
public abstract void show(E e); }
使用实现类创建对象时,再去确认泛型
类名<String> 对象名=new 类名<String>();
  4.泛型的优点:
			    安全简单,在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的
			    提高代码的重用率
		  5.泛型的通配符:
			    泛型通配符:?
		    例子:
			      当泛型有多种时:
ArrayList<Interger> arr1;
ArrayList<String> arr2;
定义方法。接收这两个集合,需要用到泛型通配符"?"
public static void show(ArrayList<?> arr){ }
  6.泛型的上下限:
			    上限:<? extends Animal>:表示 必须泛型必须是Animal 或者Animal的子类
			    下限:<? super Dog>:表示泛型必须是Dog或者Dog的父类
			    否则会报错
			    注意:	
				      Number是所有包装类的父类
				      Integer extends Number extends Obiect
				      String extends Obiect
四,集合的案例
	斗地主
		实现步骤:
			  1.产生一副牌(54)
			  2.洗牌(打乱集合元素的顺序)
			  3.发牌(剩余3张,作为底牌)
			  4.看牌(遍历集合)
代码实现:
public static void main(String[] args) {
// 1.产生一副牌(54)
ArrayList<String> cardsBox=new ArrayList<String>();
String [] colars={"♠","♥","♣","♦"};
String [] Licensing={"A","2","3","4","5","6","7","8","9","10","j","Q","K"};
for (String colar : colars) {
for (String s : Licensing) {
cardsBox.add(colar+s);
}
}
cardsBox.add("小s");
cardsBox.add("大s");
System.out.println(cardsBox);
// 2.洗牌(打乱集合元素的顺序)
Collections.shuffle(cardsBox);
// 3.发牌(剩余3张,作为底牌)
ArrayList p1=new ArrayList();
ArrayList p2=new ArrayList();
ArrayList p3=new ArrayList();
ArrayList ps=new ArrayList();
for (int i = 0; i < cardsBox.size(); i++) {
String s = cardsBox.get(i);
if(i>=51){
ps.add(s);
}else {
if (i%3==0){
p1.add(s);
}else if (i%3==1){
p2.add(s);
}else {
p3.add(s);
}
}
}
// 4.看牌(遍历集合)
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
System.out.println(ps);
}
小知识点:
		  Collections(工具类)
		方法:
			  public static shuffle(List<?> list) 
				  使用默认随机源对指定列表进行置换。
Collection类,泛型的更多相关文章
- Java基础学习(四)-- 接口、集合框架、Collection、泛型详解
		
接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写. 二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...
 - 【Collection、泛型】
		
[Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个 ...
 - 01 语言基础+高级:1-6 集合_day02【Collection、泛型】
		
day02[Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合 ...
 - Java(232-245)【Collection、泛型】
		
class GenericInterfaceImpl2<I> implements GenericInterface<I> { @Override public void me ...
 - C#:iterator 迭代器/partial class 分布类/泛型
		
C#:iterator 迭代器/partial class 分布类/泛型 iterator 迭代器 写个最简单的迭代,(迭代一个字符串数组): 1.实现接口中的方法: 1 using System; ...
 - C#工具:反射帮助类 泛型反射帮助类
		
反射帮助类 using System; using System.Reflection; using System.Data; using System.Drawing; using System.R ...
 - Collection、泛型
		
Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型
 - Collection类及常用API
		
Collection类及常用API Collection—类集工具类,定义了若干用于类集和映射的算法,这些算法被定义为静态方法,具体查看api文档; a) public static void so ...
 - 02【Collection、泛型】
		
主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合 ...
 
随机推荐
- css: box-sizing
			
border-box 宽度包含了边框 content-box 边框不包含在内容区中,会增加到实际的宽度中
 - TT-付款方式
			
付款方式 一般T/T是可以的,上述客户我们采用的付款方式就是定金加TT,如果是信用证方式,那么需要资信良好的开证行: 中国工商银行 汇丰银行 渣打银行 花旗银行 MUSLIM COMMERCIAL B ...
 - Wordpress 后台更改网址
			
在 `wp_options` 数据库执行下面两条命令 ```sql update wp_options set option_value = 'your_new_url' where option_n ...
 - Retrofit 2.0 上传文件
			
1.用MultipartBody.Part的方式上传文件(单文件上传)(表单方式) @Multipart @POST("xxx/xxx") Call<ResponseBody ...
 - http/2.0与http/1.1的区别
			
http/2是http协议自1999年http1.1发布后的首个更新 主要基于SPDY协议 2.0 采用二进制 而不是文本格式 完全多路复用 而不是有序并阻塞的 只需要一个连接即可实现并行 使 ...
 - 机器学习(四)--------逻辑回归(Logistic Regression)
			
逻辑回归(Logistic Regression) 线性回归用来预测,逻辑回归用来分类. 线性回归是拟合函数,逻辑回归是预测函数 逻辑回归就是分类. 分类问题用线性方程是不行的 线性方程拟合的是连 ...
 - CentOS7升级默认内核
			
安装内核升级镜像源 rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm Yum安装内核 yum --e ...
 - 移值UCOS2到M4核与M3核的区别
			
之前移值过ucos2到stm32f2系列的单片机,这个单片机是属于arm的m3内核的.最近在学习永磁同步电机的控制,对于这个电机的控制,有比较多的数学计算,甚至于还有浮点的运算.所以用到了stm32f ...
 - python ftp 传输文件
			
# -*- coding: utf-8 -*- # 本地bytes 数据上报服务器同时创建文件from ftplib import FTP import time, _io from constant ...
 - js简单的注册页面
			
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...