Java基础之集合和泛型的总结

221 阅读5分钟

什么是集合

集合是一种容器,就是用来存储数据的,存储数据立马就想到了数组,同样是存储数据集合和数组有什区别吗?还是有的
1 数组的长度是不能改变的,一旦创建之后长度就不能改变了,而集合的长度是可以改变的
2 数组的存储类型是单一的,而且是都是基础数据类型,但是集合不同,集合的存储类型必须是对象,对象的类型可以不一致(int 封箱为integer)

集合类

按存储结构分为list集合和set集合,list集合中用的最多的就是Arraylist集合了,网上有很多的集合的分类,可以自行查找。	
而有一个	Collection集合是所有单列集合的父类接口,其中有很多的方法是通用其他的单列集合的了
例如:
public boolean add(E e) : 把给定的对象添加到当前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e) : 把给定的对象在当前集合中删除。
public boolean contains(E e) : 判断当前集合中是否包含给定的public boolean isEmpty() : 判断当前集合是否为空。
public int size() : 返回集合中元素的个数。
public Object[] toArray() : 把集合中的元素,存储到数组中。

有了集合了,如何使用集合呢?首先是循环便利集合啊

而这里有一个专门的遍历集合的接口叫迭代器Iterator
问题是什么叫迭代?感觉好像挺高深的,
官方解释:迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

其实不难发现根据上面解释,我知道了两点一个是获取之前先判断,第二个是取元素,然后分别对应了Iterator里面的两个方法,分别是:
1 hasNext()  返回 true如果迭代具有更多的元素。返回类型为boolean类型 
2 next() 返回迭代中的下一个元素。 
3 如何创建迭代器,其实每个集合都有自己的迭代器,集合直接.就行了	


public class IteratorDemo {
 public static void main(String[] args) {
	// 使用多态方式 创建对象
	Collection<String> coll = new ArrayList<String>();
	// 添加元素到集合
	coll.add("串串星人");
	coll.add("吐槽星人");
	coll.add("汪星人");
		//遍历
	//使用迭代器 遍历 每个集合对象都有自己的迭代器
	Iterator<String> it = coll.iterator();
	// 泛型指的是 迭代出 元素的数据类型
	while(it.hasNext()){ //判断是否有迭代元素
	String s = it.next();//获取迭代出的元素
	System.out.println(s);
	}
}
}

主要解释一下hasNext方法 就是类似于指针,指向这个对象或者元素,然后判断这个元素是否为true,如果为true表示有下一个元素,相反如果没有为false,然后指针通过next方法进行往下移动,然后继续判断,再循环判断

泛型是什么?

将未知的数值类型然后指定成已知的数据类型,理论是collection集合可以存储任何数据类型,因为在存储数据的时候,他把其他类型都转换成了object类型,然后再存储的时候可以直接存储,但是在取出来的时候,必须准换成一种确定的数据类型,如果再转错误的时候就会发生java.lang.ClassCastException。异常

泛型也就是多种类型都可以进行存储

简单的说一下泛型的几种使用的情况

1 首先是类的使用
修饰符 class 类名<代表泛型的变量>{}

class ArrayList<E>{
	public boolean add(E e){ }
	public E get(int index){ }
	....
}

用法就是什么时候用,什么时候确定类型,例如
ArrayList<String> list = new ArrayList<String>();

class ArrayList<String>{
	public boolean add(String e){ }
	public String get(int index){ }
	...
}

ArrayList<Integer> list = new ArrayList<Integer>();
class ArrayList<Integer> {
	public boolean add(Integer e) { }
	public Integer get(int index) { }
	...
}

还有一种自己造类型的
public class MyGenericClass<MVP> {
//没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型
	private MVP mvp;
	public void setMVP(MVP mvp) {
	this.mvp = mvp;
	}
	public MVP getMVP() {
	return mvp;
	}
}

   public class GenericClassDemo {
	public static void main(String[] args) {
		//也就是假设MVP是String类型的数据
		MyGenericClass<String> my = new MyGenericClass<String>();
		// 调用setMVP
		my.setMVP("大胡子登登");
		// 调用getMVP
		String mvp = my.getMVP();
		System.out.println(mvp);
		//同理,创建一个泛型为Integer的类
		MyGenericClass<Integer> my2 = new MyGenericClass<Integer>();
		my2.setMVP(123);
		Integer mvp2 = my2.getMVP();
	}
	}

		**含有泛型的方法**
		public class MyGenericMethod {
			public <MVP> void show(MVP mvp) {
			System.out.println(mvp.getClass());
			}
			public <MVP> MVP show2(MVP mvp) {
			return mvp;
			}
		}
		就是用什么就是什么格式
		public static void main(String[] args) {
		// 创建对象
		MyGenericMethod mm = new MyGenericMethod();
		// 演示看方法提示
		mm.show("aaa");//String
		mm.show(123);//int
		mm.show(12.45);//double
		}
  ------------------------------------------------------------------------------------------------

		含有泛型的接口

        1.在定义实现类的时候确定泛型的类型
		public interface MyGenericInterface<E>{
			public abstract void add(E e);
			
			public abstract E getE();
		}
		
		实现类
        public class myclass implements MyGenericInterface<String>{
        @Override
			public void add(String e) {
				// 省略...
		}
			@Override
			public String getE() {
			return null;
		}
		}

        2,始终不确定数据类型的,在创建对象的时候直接使用
		public class MyImp2<E> implements MyGenericInterface<E> {
		@Override
		public void add(E e) {
		// 省略...
		}
		@Override
		public E getE() {
		return null;
		}
		}

		//使用的时候直接是
		public class domain(){
         public static void main(String[] args){
        MyImp2<String> my = new MyImp2<String>();
		my.add("aa");
		}
		}

由此开始我的java学习之路,本人大三学生一个,希望以后自己让自己放光发亮。 第一次写文章哪里不好请多指教。