什么是集合
集合是一种容器,就是用来存储数据的,存储数据立马就想到了数组,同样是存储数据集合和数组有什区别吗?还是有的
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 coll = new ArrayList();
// 添加元素到集合
coll.add(“串串星人”);
coll.add(“吐槽星人”);
coll.add(“汪星人”);
//遍历
//使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator 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{
public boolean add(E e){ }
public E get(int index){ }
….
}
用法就是什么时候用,什么时候确定类型,例如
ArrayList list = new ArrayList();
class ArrayList{
public boolean add(String e){ }
public String get(int index){ }
…
}
ArrayList list = new ArrayList();
class ArrayList {
public boolean add(Integer e) { }
public Integer get(int index) { }
…
}
还有一种自己造类型的
public class MyGenericClass {
//没有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 my = new MyGenericClass();
// 调用setMVP
my.setMVP(“大胡子登登”);
// 调用getMVP
String mvp = my.getMVP();
System.out.println(mvp);
//同理,创建一个泛型为Integer的类
MyGenericClass my2 = new MyGenericClass();
my2.setMVP(123);
Integer mvp2 = my2.getMVP();
}
}
**含有泛型的方法**
public class MyGenericMethod {
public void show(MVP mvp) {
System.out.println(mvp.getClass());
}
public 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{
public abstract void add(E e);
public abstract E getE();
}
实现类
public class myclass implements MyGenericInterface{
@Override
public void add(String e) {
// 省略…
}
@Override
public String getE() {
return null;
}
}
2,始终不确定数据类型的,在创建对象的时候直接使用
public class MyImp2 implements MyGenericInterface {
@Override
public void add(E e) {
// 省略…
}
@Override
public E getE() {
return null;
}
}
//使用的时候直接是
public class domain(){
public static void main(String[] args){
MyImp2 my = new MyImp2();
my.add(“aa”);
}
}
复制代码
由此开始我的java学习之路,本人大三学生一个,希望以后自己让自己放光发亮。
第一次写文章哪里不好请多指教。