集合:能够将众多具有相同性质的元素汇聚成一个整体的一个对象,本身是一个对象,里边可以存放其它的对象。
数组与集合的区别:
数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。
具体如下:
1)数组的效率高于集合类.
2)数组能存放基本数据类型和对象,而集合类中只能放对象。
3)数组容量固定且无法动态改变,集合类容量动态改变。
4)数组无法判断其中实际存有多少元素,length只告诉了array的容量。
5)集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。
6)集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
Collection接口: 提供了一组操作成批对象的方法。
1)它提供了一些基本的操作如添加和删除。
2)它也支持查询操作如是否为空isEmpty()方法等。
3)为了支持对Collection进行独立操作,Java的集合框架给出了一个Iterator,它使得你可以泛型操作一个Collection,而不需知道这个Collection的具体实现类型是什么。
List接口:对Collection进行了简单的扩充。
1)它的具体实现类常用的有ArrayList和LinkedList:
2)你可以将任何东西放到一个List容器中,并在需要时从中取出。
3)ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快。
4)LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。
Set接口:也是Collection的一种扩展。
1)与List不同的是,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。
2)它的常用具体实现有HashSet和TreeSet类:
2.1)HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。
2.2)TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。
Map: 是一种把键对象和值对象进行关联的容器,一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。
1) 对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性。
2) Map有两种比较常用的实现:HashMap和TreeMap。
2.1)HashMap也用到了哈希码的算法,以便快速查找一个键。
2.2)TreeMap则是对键按序存放。
List集合的特点: 有序
代码:
List h; //声明一个集合属性是字符串 List是有序集合 <>表示泛型
h =new ArrayList();
//向集合中添加元素
h.add("Hello World!");
h.add("天涯何处无芳草");
h.add("自挂东南枝");
h.add("山水有相逢");
h.add("自挂东南枝");
//删除集合中的元素
h.remove(0);
//查询集合长度
System.out.println(h.size());
//输出集合所有元素方法一
System.out.println("这是方法一输出的值");
for(int i=0;i it = h.iterator(); //创建迭代器
while(it.hasNext()) { //hasNext()从集合头部开始依次判断下一位是否有数值;
//返回值是布尔型数据;
String Data = it.next(); //得到指针指向的下一个数据
System.out.println("----"+Data+"----");
}
Set集合的特点:Set是无序集合;重复数据不允许添加 ;多用Set判断数据是否存在。
代码:
//创建日期数据
Date a = new Date(1575263112870L);
Date b = new Date(1575253112870L);
Date c = new Date(1575243112870L);
Date d = new Date(1575233112870L);
Date e = new Date(1575223112870L);
Date f = new Date(1575213112870L);
//声明Set集合,里边的元素全是时间 Set是无序集合,重复数据不允许添加 多用Set判断数据是否存在
Set Time;
Time = new HashSet();
//向集合中添加元素
Time.add(a);
Time.add(b);
Time.add(c);
Time.add(d);
Time.add(e);
Time.add(f);
Time.add(a);
Time.add(a);
Time.add(a);
//输出集合所有元素方法一
System.out.println("这是方法一输出的值");
for(Date date : Time)
System.out.println(date);
//输出集合所有元素方法二 迭代器
System.out.println("这是方法二输出的值");
Iterator it = Time.iterator();
while(it.hasNext()) {
Date dt = it.next();
System.out.println(dt);
}
Map集合的特点:Map是一种包含键值对元素的集合;Map不能包含重复的键;每个键最多映射一个值。
代码:
//创建Map
Map price = new HashMap();
//向Map中添加元素
price.put("普通苹果",5.0);
price.put("红富士苹果",10.0);
price.put("进口苹果",30.0);
System.out.println(price);
System.out.println(price.get("普通苹果"));
//输出Map中所有键值对方法一
System.out.println("这是方法一输出的值");
Set> ens = price.entrySet();
for(Entry en : ens) {
System.out.println("键:"+en.getKey()+" 值:"+en.getValue());
}
//输出所有键值对方法二
System.out.println("这是方法二输出的值");
Set> s = price.entrySet();
Iterator> it = s.iterator();
while(it.hasNext()) {
Entry en = it.next();
System.out.println(en);
}
//判断键是否存在
System.out.println(price.containsKey("普通苹果"));
System.out.println(price.containsKey("超级无敌进口苹果"));
//判断值是否存在
System.out.println(price.containsValue(5.0));
System.out.println(price.containsValue(100.0));
代码:
//创建人物对象
Person p1 = new Person();
p1.setName("哪吒");
p1.setAge(10);
Person p2 = new Person();
p2.setName("龙王三太子");
p2.setAge(15);
//创建亲子关系表
Map p = new HashMap();
//往Map表中输入Key和Value
p.put(p1, "陈塘关李靖之子");
p.put(p2, "东海龙王之子");
//对比
//创建亲子关系表
Map pe = new HashMap();
//get的返回值是Object,所以存的是字符串也不能赋值给字符串
Object obj = pe.get(p1);
//这样就会报错 想不报错就要进行强制类型转换(向下转型)
String s = p.get(p1);
//强制类型转换以后又会有一堆黄线,所以不推荐这样
String s = (String) pe.get(p1);
System.out.println(p1.getName()+"是"+p.get(p1));
总结: 泛型一定要写,不写默认就是Object类,很麻烦