- 浏览: 72513 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
须等待:
强烈同意。。。。这个编辑器简直太不好用了!
对于在Ubuntu下的Eclipse上安装SVN客户端插件Subclipse的补充 -
nudtgk2000:
flysnail 写道 思路挺好,
谢谢鼓励,还是初学者,不 ...
重写CountDownLatch以实现线程状态监视 -
flysnail:
思路挺好,:)
重写CountDownLatch以实现线程状态监视
容器
概念
Java API 所提供的用于在程序中存放对象的一系列类的实例。
数组其实也是一种容器, 不过其他容器类都不用也不能指定大小。
容器API
- 位于 java.util 包内;
- 类图结构如下:
-
Collection 接口 —— 定义了存取一个一个对象的方法,其子接口 Set 和 List 分别定义了存储方式
- Set 中的数据对象无序且不重复;
- List ... 有序且可重复;
- “重复”的定义:互相equals()。
- Map 接口 —— 定义了存储 "key - value 映射对" 的方法。
Collection<E> 接口
方法
int size(); boolean isEmpty();
boolean contains(E element)//依据equals, add(...), remove(...); void clear();
boolean containsAll(Collection c), addAll(...), removeAll(...), retainAll(...)//保留交集;
E[] toArray(); Iterator<E> iterator();
import java.util.*; ... Collection c = new ArrayList(); // 父接口引用子类对象 // 可以存入不同类型的对象,但必须是对象,因为基本数据类型位于Stack里随时可被清空 c.add("Hello"); c.add(new Name("f1", "l1")); c.add(new Integer(200)); System.out.println(c.size()); System.out.println(c); // ArrayList的toString()方法 ... /** 输出: * 3 * [hello, fi1 l1, 100] */
- 容器类对象在调用 remove、contains 等方法时需要比较对象是否相等,这就涉及到对象类型的 equals 及 hashCode 方法[注1]:对自定义类,需要重写 equals 及 hashCode 方法[注2]以实现自定义的相等规则。
- 注1:hashCode方法因为同时具有索引的特性,会在 Map 型容器中对key对象的比较中被用到;
- 注2:equals 为 true,hashCode 也要为相等,好比同一个人不该有多个住址就没法找了。一个住址可以住多人,但是找个人效率会降低,应尽量避免这样,即设计hashCode方法应尽量让hashcode相等的对象也相等;
- hashCode方法设计比较难,可以调用API类的方法。
Iterator<E>接口
所有实现了 Collection 接口的容器类都有一个 iterator() 方法用以返回一个实现了 Iterator 接口的对象;
Iterator 对象称作迭代器,用以方便地实现对容器内元素的遍历操作;
Iterator 接口内定义了三个方法:
boolean hasNext(); E next();
void remove(); // 删除指针前一个元素,(一定有机制保存了前一个元素的引用)所以在执行完 next() 之后只能 remove() 一次(那个保存前一个的引用删掉失效了)。Iterator的remove() 是在迭代过程中删除容器元素(不只是迭代器里的元素)的唯一安全方法,此时不能用容器类提供的remove,会产生例外,因为Iterator对象内部对容器对象做了线程锁定。
Tips:JDK5.1增强的for循环
缺陷:1. 不适用数组 —— 不能方便地访问下标
2. 对于集合 —— 该for结构内部也是调用Iterator,但与Iterator相比却不能方便地删除集合中的元素(原因在上文)
结论:除了简单遍历读取元素外,不建议使用
Set<E>接口
对应数学中的“集合”概念
无序,无重复
HashSet,TreeSet 等
Tips:Set 和 List 类都具有以 Collection接口类 为参数的构造方法
List<E>接口
有序,可有重复
像数组 —— 元素对应整型的索引,可按索引访问;又不同于数组 —— 不限大小,自动扩容
ArrayList,LinkedList 等
特有方法
get(index); remove(index);
indexOf(E), lastIndexOf(...);
E set(index, element); void add(index, element)
java.util.Collections类 提供了一组静态方法实现基于List容器的常用算法
void sort(List) // 借助于Comparable接口; void shuffle(List); void reverse(List); void filll(List, E); void copy(List dest, List src); int binarySearch(List, E) // 先排序再查找
Comparable<T>接口
所有可“排序”的类都实现了 java.lang.Comparable接口
只包含一个方法:public int compareTo(T o); 0: ==, +: this > obj, -: <。
Comparable接口的实现类通过实现 compareTo 方法确定该类对象的排序依据。Note: 实现该方法同重写equals()一样,要先检查类型, SDK1.5引进泛型后就不用了
class Name implements Comparable { ... ... public int compareTo(Object o) { // 强调:实现/重写的方法头部要copy自接口/父类 Name n = (Name) o; // 类型检查或强制转换 int lastCmp = lastName.compareTo(n.lastName); return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName)); } }
如何选择*
看应用
Array 读快改慢;
Linked 改快读慢;
Hash 两者之间。
Map<K, V>接口
键-值对, key和value都是对象
以Key标识,key不可重复,依据 hashCode 比较
HashMap类(Hash表实现),TreeMap类(红黑树)
特有方法
V put(K key, V value); // 如果发生了替换,返回旧的value
V get(key), V remove(key); // value对象以Object类型输出,所以要再按原有类型强制转换
boolean containsKey(key), containsValue(value);
int size(); boolean isEmpty(); void clear();
void putAll(Map<K, V> t);
Auto-boxing/unboxing 机制
基础数据类型<->封装类 自动转换(JDK1.5后)
import java.util.* ... Map m1 = new HashMap(); m1.put("one", 1); // 并不是存在 put(Object, int) 方法,而是自动打包机制将int转换成Integer传给put方法 int i = (Integer) m1.get("one"); // Integer类型的对象可以自动解包成int,但是这里是以Object类型输出的,不强制转换成Integer型就不会启用自动解包机制 ...
泛型Generic(after JDK1.5)
起因:JDK1.4 以前类型不明确
- 装入集合的类型都被当成Object对待,从而失去自己的实际类型;
- 从集合中取出时往往需要转型,效率低,容易出错。
解决办法:在定义集合的时候同时定义集合中对象的类型
格式:Collection<E>, Iterator<E>, Comparator<T> , Map<K, V>等凡是API中这样定义的接口、类;
使用:把指定的类型填进<>,见TestArgsWords.zip
优点:增强程序的可读性和稳定性
Summary —— 一一三六
- 一个图
- 一个类 —— java.util.Collections
- 三个知识点
- 增强for (不好)
- Generic
- Auto-boxing / unboxing
- 六个接口
- Collection<E>
- Iterator<E>
- Set<E>
- List<E>
- Map<K, V>
- Comparable<T>
发表评论
-
Weka 3.6.9 加载libsvm类包的正解
2014-05-24 10:59 5920Weka 3.6.9本身不带libsvm的类包,百度网上铺天 ... -
【转】常用的系统属性
2012-11-21 17:02 776获取类文件所在的绝对路径 写道 "Jav ... -
用Log4j实现线程独立日志
2012-11-04 22:53 8177需求: 在一个项目里,我使用Log4j生成日志, ... -
重写CountDownLatch以实现线程状态监视
2012-11-04 20:25 1504需求:管理线程需要及时知道工作线程全部处于等待状态,并满足等待 ... -
byte型检查
2012-09-09 21:14 798byte b; //... ... // 范围检查,确保只 ... -
【转】Dom4j的使用(全而好的文章)
2012-08-07 15:09 937java解析xml汇总, 结论就是Dom4j比其他几种好 ... -
【转】正则表达式的一些资料
2012-08-07 15:07 846JAVA 正则表达式 (超详细)http://blog.csd ... -
【转摘】Exception in thread "main" java.lang.OutOfMemoryError: Java heap space解决方法
2012-08-04 18:02 14915摘自http://hi.baidu.com/61919 ... -
【转】java解析xml汇总
2012-07-31 20:53 16java解析xml汇总 -
java.io.InputStream.mark(int readlimit) 方法的个人理解
2012-05-16 16:04 0在马士兵java课程的IO这一章[1]中遇到 java.io ... -
马士兵课程笔记(续7) —— 流
2012-03-20 18:51 0Java 流式输入/输出原理 ... -
走了一段值得的弯路
2012-03-16 21:27 1043class C { int i; S ... -
马士兵课程笔记(续5)
2012-03-09 19:28 1439常用类 字符串相关类(String, StringBuff ... -
马士兵课程笔记(续4)
2012-02-28 21:58 1122数组 数组可以看成是多个相同类型数据组合,对这些数据的统一 ... -
马士兵课程笔记(续3)
2012-02-22 16:47 1488抽象类 关键字abstract 含有抽象方法的类必须声明 ... -
马士兵课程笔记(续2)
2012-01-03 15:50 1128J2SDK中主要的包介绍 位置%JAVAHOME%\jr ... -
马士兵课程笔记
2011-11-14 07:47 1259J2EE框架 EJB (Enterprise Ja ... -
Porter Stemmer 波特词干算法
2011-10-26 08:17 6759/* Porter ... -
Linux命令收集罐
2011-10-23 16:54 916查看系统进程——ps 要对 ... -
JAVA中 @Override 的作用(转)
2011-10-22 22:44 2560<!-- @pa ...
相关推荐
【标题】"马士兵课程笔记(续5)"主要聚焦在编程和软件开发的某一特定领域,结合了“源码”和“工具”的概念。这可能是关于解析、分析或利用源代码,以及使用特定工具来提升开发效率或理解复杂系统的主题。马士兵是一...
【标题】"马士兵课程笔记(续4)"主要聚焦于编程知识,特别是通过代码实例来深化理解。马士兵是一位知名的IT教育专家,他的课程通常涵盖了广泛的编程主题,旨在帮助学员深入掌握技术。在这个部分,他可能继续讲解了...
### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...
马士兵JAVA笔记(全) 本资源是马士兵的JAVA笔记,涵盖了JAVA语言的基础知识,包括标识符、常量、变量、数据类型、运算符、控制流语句等。 标识符是JAVA中的一种符号,用于命名变量、方法、类等。标识符由字母、...
马士兵oracle笔记,浅显易懂。
jvm java虚拟机 调优 马士兵 笔记 让你对java虚拟机调优有初步的认识
Spring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).doc
马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...
马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **MyBatis安装与环境搭建**:首先,你需要配置Java开发环境,并了解Maven或Gradle构建工具,因为MyBatis通常与这些工具结合使用来管理依赖。然后,...
马士兵Spring课堂笔记(超级详细版) 本资源主要讲解了Spring框架的基础概念和应用,涵盖了面向接口编程、IOC/DI、AOP、Spring应用IOC/DI、Spring应用AOP、Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合、Spring...
马士兵Spring课堂笔记(详细版) 马士兵spring视频笔记
JAVA就业班笔记【马士兵说】.nyf
"JAVA笔记(根据马士兵的java视频整理)" 本资源是根据马士兵的JAVA视频整理的笔记,涵盖了JAVA的基础知识、数据结构、面向对象编程、Java Web编程、J2EE、J2ME等方面的知识点。 在基础知识方面,本资源涵盖了变量...
以下是对马士兵多线程笔记的详细解析。 1. **多线程基础**:多线程是指一个应用程序中同时执行多个线程(即任务)的能力。这种并发执行可以提高系统资源的利用率,提升程序的响应速度和执行效率,特别是在多核...
### Java SE - 马士兵笔记精要 #### 第1章 Java概述 - **Java语言的特点**: - **面向对象**:Java是一种完全支持面向对象编程的语言。 - **平台无关性**:通过Java虚拟机(JVM),Java可以在任何安装了JVM的...
马士兵Springboot课堂笔记