容器的概念
来源:互联网 发布:农商银行柜员工资知乎 编辑:程序博客网 时间:2024/04/30 02:50
1136
一个图(下二)
一个类
Collections
三个知识点
增强for循环
泛型Generic
Auto-boxing/unboxing
六个接口
CollectionSet List
Map
Iterator
Comparable
一、容器的概念
容器: Java API 所提供的一系列类的实例,用于在程序中存放对象。
二、容器 API
1. J2SDK所提供的容器API位于 java.util 包内。
2. 容器API的类图结构如下图所示:
通过这个图可以了解到JDK到底给我们提供了什么样的容器。java.util中提供了非常多的容器,要把他们的组织关系弄清楚,就要把这个图弄清楚。
Collection 接口定义了存取一组对象的方法,其子接口 Set 和 List分别定义了存储方式。
Set 中的数据对象没有顺序且不可以重复。
List 中的数据对象有顺序且可以重复。(重复就是指两个对象互相 equals)
Map 接口定义了存储“键(key)-值(value)映射对”的方法
*如何选择数据结构
◇衡量标准:读的效率和改的效率
◇Array: 读快改慢
◇Linked:改快读慢
◇Hash: 两者之间
三、Collection 接口
1. Collection 接口中所定义的方法:
int size( ) ;
boolean is Empty( ) ;
void clear( ) ;
boolean contains(Object element)
boolean add(Object element)
boolean remove(Object element)
Iterator iterator( );
boolean containsAll(Collection c);
boolean addAll(Collection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
Object[] toArray( );
2. Collection 方法举例
例一
import java.util.*;public class Test1 {public static void main(String[] args) {Collection c = new ArrayList(); /* 可以放入不同类型的对象不直接用ArrayList c = new ArrayList()是因为往下用的时候通过父类Collection的引用是访问不了子类对象特有的东西的。如果以后想换成LinkedList的话可以直接改,其他地方都不用变,提供最大的灵活性。*/c.add("hello");c.add(new Integer(100));System.out.println(c.size());System.out.println(c);}}/*输出结果: 2 [hello, 100]*/
例二
import java.util.*;public class BasicContainer {public static void main(String[] args) {Collection c = new HashSet();c.add("hello");c.add(new Name("f1","l1"));c.add(new Integer(100));c.remove("hello");//取出容器中的每一个对象看是不是equalsSystem.out.println(c.remove(new Name("f1","l1")));//无法删除,因为没有重写equals,比较的是引用的地址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;}}
●容器类对象在调用 remove 、contains 等方法时需要比较对象是否相等,这会涉及到对象类型的 equals 方法和 hashCode方法;对于自定义的类型,需要 重写 equals 和hashCode 方法 以实现自定义的对象相等规则。 (重写equals就要重写hashCode )
注意: 相等的对象应该具有相等的hash codes。
●增加Name类的 equals 和 hashCode 方法如下:
import java.util.*;public class BasicContainer {public static void main(String[] args) {Collection c = new HashSet();c.add("hello");c.add(new Name("f1","l1"));c.add(new Integer(100));c.remove("hello");System.out.println(c.remove(new Name("f1","l1")));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) {//判断obj是否是Name或其子类的一个实例Name name = (Name) obj;return (firstName.equals(name.firstName))&& (lastName.equals(name.lastName));}return super.equals(obj); //交给父类Object处理,判断是否是一个对象}public int hashCode() {return firstName.hashCode();} }}
四、Iterator 接口
1. 所有实现了 Collection 接口的容器类都有一个 iterator 方法用以返回一个实现了Iterator接口的对象。
2. Iterator 对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
3. Iterator接口定义了如下方法:
●boolean hasNext ( ) ;//判断游标右边是否有元素
●Object next ( ) ;//返回游标右边的元素并将游标移动到下一个位置
●void remove ( ) ;//删除游标左边的元素,在执行完next之后该操作只能执行一次
例一
import java.util.*;public class Test {public static void main(String[] args) {Collection c = new HashSet();c.add(new Name("f1","l1"));c.add(new Name("f2","l2"));c.add(new Name("f3","l3"));Iterator i = c.iterator();while(i.hasNext()) {//next()的返回值为object类型,需要转换为相应类型Name n = (Name)i.next();System.out.print(n.getFirstName()+" ");}}}//输出结果: f1 f2 f3 每个人的可能不一样,因为HashSet是没顺序的
Iterator 对象的remove方法是在迭代过程中删除元素的位唯一的安全方法。
Collection c = new HashSet();c.add(new Name("fff1","lll1"));c.add(new Name("f2","l2"));c.add(new Name("fff3","lll3"));for(Iterator i = c.iterator();i.hasNext();) {//第三个语句被省略Name name = (Name)i.next();if(name.getFirstName().length()<3) {i.remove();//如果换成c.remove(name);会产生例外//不能调用容器自身的remove方法,因为在Iterator循环的内部会执行锁定。}}System.out.println(c);//输出结果:[fff3 lll3, fff1 lll1]
五、Set 接口
◆Set 接口是 Collection 的子接口,Set接口没有提供额外的方法,但实现 Set 接口的容器类中的元素是没有顺序 的,而且不可以重复。
◆Set 容器可以与数学中“集合”的概念相对应。
◆J2SDK API中所提供的的 Set 容器类有 HashSet,TreeSet 等。
Set方法举例:
import java.util.*;public class Test {public static void main(String[] args) {Set s1 = new HashSet();Set s2 = new HashSet();s1.add("a");s1.add("b");s1.add("c");s2.add("d");s2.add("a");s2.add("b");//Set和List容器类都具有Constructor(Collection c)构造方法用以初始化容器类Set sn = new HashSet(s1);sn.retainAll(s2);Set su = new HashSet(s1);su.addAll(s2);System.out.println(sn);System.out.println(su);}}输出结果:[a,b] [a,b,c,d]
六、List 接口
◆List是 Collection 的子接口,实现 List 接口的容器类中的元素是有顺序的,而且可以重复。
◆List 容器中 的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
◆J2SDK 所提供的 List 容器类有 ArrayList, LinkedList 等。
Object get ( int index ) ;
Object set ( int index, Object element ) ;
void add ( int index, Object element) ;
Object remove ( int index ) ;
int indexOf ( Object o ) ;
int lastIndexOf ( Object o ) ;
例1:
import java.util.*;public class Test1 {public static void main(String[] args) {List l1 = new LinkedList();for(int i = 0; i<=5;i++) {l1.add("a"+i);}System.out.println(l1);l1.add(3,"a100");System.out.println(l1);l1.set(6,"a200");System.out.println(l1);System.out.print((String)l1.get(2)+" ");System.out.println(l1.indexOf("a3"));l1.remove(1);System.out.println(l1);}}/*输出结果:[a0, a1, a2, a3, a4, a5][a0, a1, a2, a100, a3, a4, a5][a0, a1, a2, a100, a3, a4, a200]a2 4[a0, a2, a100, a3, a4, a200]*/
List 常用算法
◆类 java.util.Collections 提供了一些静态方法实现了基于 List容器的一些常用算法。
void sort (List)对List容器内的元素排序
void shuffle (List)对List容器内的对象进行随机排列
void reverse (List)对List容器内的对象进行逆序排列
void fill (List,Object)
用一个特定的对象重写整个List容器
void copy (List dest, List src)
将src List容器内容拷贝到dest List容器
int binarySearch (List, Object)
对于顺序的List容器,采用折半查找的方法查找特定对象
例
import java.util.*;public class Test1 {public static void main(String[] args) {List l1 = new LinkedList();List l2 = new LinkedList();for(int i=0; i<=9; i++) {l1.add("a"+i);}System.out.println(l1);Collections.shuffle(l1);//随机排列System.out.println(l1);Collections.reverse(l1);//逆序排列System.out.println(l1);Collections.sort(l1);//排序System.out.println(l1);System.out.println(Collections.binarySearch(l1,"a5"));//折半查找}}/*输出结果:[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9][a1, a4, a0, a8, a5, a9, a3, a6, a2, a7][a7, a2, a6, a3, a9, a5, a8, a0, a4, a1][a0, a1, a2, a3, a4, a5, a6, a7, a8, a9]5*/
七、Comparable 接口
◆问题:上面的算法根据什么确定容器中对象的“大小”顺序?
◆所有可以“排序”的类都实现了 java.lang.Comparable 接口,Comparable 接口中只有一个方法
public int compareTo( Object obj )
该方法:
●返回 0 表示this == obj
●返回正数表示this > obj
●返回负数表示this < obj
◆实现了Comparable 接口的类通过实现compareTo 方法从而确定该类对象的排序方式。
下面改写之前使用的 Name 类让其实现 Comparable 接口,其 compareTo 方法定义为:
public int compareTo(Object o) {Name n = (Name)o;int lastCmp = lastName.compareTo(n.lastName);return (lastCmp !=0 ? lastCmp : firstName.compareTo(n.firstName));}
八、Map 接口
◆ 实现 Map 接口的类用来存储键-值 对。
◆Map 接口的实现类有 HashMap 和 TreeMap 等。
◆Map 类中存储的 键-值 对通过键来标识,所以键值不能重复。(所以前面才规定了重写equals方法就要重写hashcode方法)
Object put (Object key,Object value);
Object get (Object key);
Object remove (Object key);
Object containsKey (Object key);
Object containsValue (Object value);
int size ( );
boolean isEmpty ( );
void putAll (Map t);
void clear ( );
例
import java.util.*;public class Test2 {public static void main(String[] args) {Map m1 = new HashMap();Map m2 = new TreeMap();m1.put("one",new Integer(1));m1.put("two",new Integer(2));m1.put("three",new Integer(3));m2.put("A",new Integer(1));m2.put("B",new Integer(2));System.out.println(m1.size());//3System.out.println(m1.containsKey("one"));//trueSystem.out.println(m2.containsValue(new Integer(1)));//trueif(m1.containsKey("two")) {int i = ((Integer)m1.get("two")).intValue();System.out.println(i);//2}Map m3 = new HashMap(m1);m3.putAll(m2);System.out.println(m3);//{A=1, B=2, two=2, three=3, one=1}}}
Auto-boxing/unboxing
在合适的时机自动打包,解包(JDK1.5后支持)
自动将基础类型转换为对象
自动将对象转换为基础类型
上面例子中的整型全都用了 New Integer 创建对象。因为Map规定了,两边都得是对象。更麻烦的时候,拿出来时还需要进行强制转换。
例如,上例代码可以进行这样的修改,结果不变:
m1.put("one",1);m1.put("two",2);m1.put("three",3);m2.put("A",1);m2.put("B",2);System.out.println(m1.size());System.out.println(m1.containsKey("one"));System.out.println(m2.containsValue(1));if(m1.containsKey("two")) {int i = (Integer)m1.get("two");//这里必须加强转,因为get得到的是一个Object//转换成Integer对象以后,会自动解包成int类型System.out.println(i);}
- 容器的概念
- Servlet容器的概念
- 容器的概念理解
- Java 容器的概念
- 容器的概念理解
- java的容器概念
- Servlet容器的概念
- 容器的概念
- 容器的概念
- C++ 容器的概念
- Servlet容器的概念
- 容器的初级概念
- servlet容器与web容器的概念
- servlet容器与web容器的概念
- servlet容器与web容器的概念
- J2EE的概念以及容器概念总结
- spring 父子容器的概念(springmvc做父,子?容器)
- 巧妙解析JAVA中容器的概念
- BigDecimal从单位元转换为分,并四舍五入取整
- Jdk 环境安装
- 七牛云存储____官方SDK集成开发
- 往内部存储写文件
- 监听UIAlertView
- 容器的概念
- adb shell top 命令中几个内存信息的解释 【RSS,PSS,USS,VSS】 native,dalvik内存
- Openstack容器项目之Magnum
- java 反编译 支持泛型 luyten
- Android面试知识点总结(2)——安卓基础知识篇
- spring aop ioc
- POJ 3639 Exchange Rates 再想想
- mac终端配置设置
- java视频入口