JavaSE学习笔记之-----集合
来源:互联网 发布:期货交易行情软件 编辑:程序博客网 时间:2024/04/19 14:40
一、什么是集合
二、Iterator 接口
三、Set接口和List接口
四、Comparable接口
五、Map接口、泛型
一、什么是集合
我的理解是1、用来装很多元素进去,便于管理,比如可以对其排序,添加删除,元素查找起来很快等等;2、集合就是一个特殊的类,是实现了一些集合接口的特殊类,那既然是类,无非就是提供的方法比较针对集合的特点,但始终就是个类,这样一来就很好理解什么是集合了。
Java中有几类集合,各有特点,如下图:
集合的根上的接口是Collection接口,然后有Set、List、和map。HashSet集合存储的元素是没有顺序不可重复的,List是有顺序可以重复,而map里面存放的是键值对(Key、Value),一个Key对应一个Value值。往Map里面存元素的时候,如果Key值重复了,就会把该Key值对应的Value替换掉,所以Map当中也是没有重复元素的。
注意:在做添加和删除等方法的时候,元素对象必须要重写Object的equals和hashCode方法,否则无法对对象进行比较。上例当中的String类和Integer类都已经重写了equals和hashCode方法。
二、Iterator 接口
所有实现了Collection接口的容器类都有一个叫做iterator的方法, 这个方法的返回值是一个对象,是Iterator类型的对象:
API文档的描述(HashSet):
import java.util.*;public class IteratorTest {public static void main(String[] args) {Name n1 = new Name("f1","h1");Name n2 = new Name("f2","h2");Name n3 = new Name("f3","h3");Set c1 = new HashSet();c1.add(n1);c1.add(n2);c1.add(n3);Iterator a = c1.iterator();System.out.println(c1);/****以下测试迭代器的删除功能****///每进行一次a.next,迭代器向右移动一个元素//迭代器的remove方法,是删除现在迭代器所指向的元素(对象)while(a.hasNext()) {Name n = (Name)a.next();if(n.getFirstName().equals("f2")) {a.remove();}}System.out.println(c1);}}class Name { private String firstName,lastName; public Name(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public String toString() { return firstName + " " + lastName; } public boolean equals(Object obj) { if (obj instanceof Name) { Name name = (Name) obj; return (firstName.equals(name.firstName)) && (lastName.equals(name.lastName)); } return super.equals(obj);}public int hashCode() { return firstName.hashCode();}}
三、Set接口和List接口
例子1:
import java.util.*;public class ListTest {public static void main(String[] args) {List n1 = new LinkedList();for(int i=0;i<=5;i++) {n1.add("a"+i);}System.out.println(n1);n1.add(3,"a100");System.out.println(n1);n1.add(6,"a200");System.out.println(n1);System.out.print((String)n1.get(2)+" ");System.out.println(n1.indexOf("a3"));n1.remove(1);System.out.println(n1);}}
例子2:
import java.util.*;public class ListTest { public static void main(String[] args) { List n1 = new LinkedList(); for(int i=0;i<=9;i++) { n1.add("a"+i); }System.out.println(n1);Collections.shuffle(n1);//随机排序System.out.println(n1);Collections.reverse(n1);//逆序System.out.println(n1);Collections.sort(n1); //排序System.out.println(n1);System.out.println(Collections.binarySearch(n1,"a5"));//折半查找}}
四、Comparable接口
所有可以进行排序的类,都实现了java.lang.Comparable接口,该接口当中只有一个方法:
public int comparaTo(Object obj);
如果this对象与obj对象比较结果是相等的,返回0;this > obj ;返回正数;this < obj ;返回负数。
实现了Comparable接口的类通过实现comparaTo方法从而确定该类对象的排序方式。
import java.util.*;public class BasicContainer { public static void main(String[] args) { List c = new LinkedList(); c.add(new Name("Karl","M")); c.add(new Name("Steven","Lee")); c.add(new Name("Tim","sar")); c.add(new Name("Leo","ok")); System.out.println(c); System.out.println(); Collections.sort(c); System.out.println(c); }}class Name implements Comparable { private String firstName,lastName; public Name(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public String toString() { return firstName + " " + lastName; } public boolean equals(Object obj) { if (obj instanceof Name) { Name name = (Name) obj; return (firstName.equals(name.firstName)) && (lastName.equals(name.lastName)); } return super.equals(obj);}public int hashCode() { return firstName.hashCode();}public int compareTo(Object o) { Name n = (Name)o; int lastCmp = lastName.compareTo(n.lastName); return (lastCmp!=0 ? lastCmp : firstName.compareTo(n.firstName)); }}
所实现的compareTo方法用来比较Name对象的大小,比较规则在具体实现里面。
五、Map接口、泛型
该接口是用来存储键值对的(Key、Value),实现类包括HashMap、TreeMap等,键值不能重复。
import java.util.*;public class MapTest {public static void main(String[] args) {Map<String,Integer> m1 = new HashMap<String,Integer>();Map<String,Integer> m2 = new HashMap<String,Integer>();m1.put("one", 1); m1.put("two", 2); m1.put("three", 3); m2.put("four", 4); m2.put("five", 5); m2.put("three", 3); System.out.println(m1); System.out.println(m1.size()); System.out.println(m1.containsKey("one")); Map<String,Integer> m3 = new HashMap<String,Integer>(m1); System.out.println(m3); m3.putAll(m2); System.out.println(m3);}}
1、泛型。本来往容器里面添加的元素只要是对象就可以了,但是这样无法限制这个容器里面不产生错放的对象,比如,我这个容器时用来存放“狗”这个对象的,结果被放进一个“衣服”这个对象,如果不使用泛型的话,这个错误就不会被发现,(在编译的时候不会被编译器发现)而且每一次从容器里面拿东西出来,都要进行类型的强制转换才保险。泛型的使用方法很简单,就是在接口和类后面添加尖括号<>,指明往容器里面添加的对象的类型。在上例当中可以看到使用方法。
2、在合适的时机自动打包解包
本来添加键值后面的数字1、2、3等等,需要把数字封装成对象才能添加到容器里面,所以正常的方法,添加的时候应该是:Integer(1)、Integer(2)等等,但是现在写程序不用这样写,直接写1、2、3,编译器会自动打包解包。
- javaSE学习笔记之集合
- JAVASE学习笔记之集合
- JavaSE学习笔记之-----集合
- [JavaSe学习笔记-集合框架]
- JavaSE学习笔记--集合框架
- Javase笔记之集合类
- Javase基础学习笔记之集合(1)
- Javase基础学习笔记之集合(2)
- Javase基础学习笔记之集合(3)
- Javase基础学习笔记之集合(4)
- JavaSE基础学习笔记-集合框架1
- JavaSE基础学习笔记-集合框架2
- JAVASE学习笔记:第十二章 集合
- JavaSE学习笔记_12:Java集合框架
- 【JavaSE学习笔记】集合01_Collection,List
- 【JavaSE学习笔记】集合02_Set
- javaSE学习笔记之数据类型
- javaSE学习笔记之反射
- eclipse 点击 ctrl+鼠标左键看不了源码问题解决
- android sqlite增删改查语句
- pull解析请求网络的数据(带分页加载,刷新) xlistview HttpUtils
- 55.A+B Problem III
- 关于java多线程访问html卡死的问题
- JavaSE学习笔记之-----集合
- Delphi下EasyGrid使用体会
- Activity数据更新,及时通知下面的Fragment
- IOS中XML解析之libxml2
- Sting中方法举例
- 56.谁是最好的Coder
- JAVA开发工程师面试题
- Fork/Join由浅入深
- 广东移动实习前期