Collection

首先Java中的collection都是支持泛型和类型安全
由于Java单根继承, 所以不指定, 可以在collection里面放任何对象, collection会都当作object对象, 当然这样处理, 在对象取出时, 需要自己向下转型

ArrayList apples = new ArrayList(); //默认为object
apples.add(new Apple());
Apple a = (Apple)apples.get(0); //手动转型

当然也可以指定类型, 类似c++模板语法, 编译器会默认知道存放的是Apple

ArrayList<Apple> apples = new ArrayList<Apple>();

Collection接口提供的函数,

boolean add(Object obj)  //添加一个Object元素
boolean addAll(Collection c)
boolean contains(Object obj) //判断obj是否是调用collection的一个元素(属于)
boolean containsAll(Collection c) //判断c是否是调用collection的子集(包含)
boolean equals(Collection c) //判断c是否与调用collection相等
int hashCode() //返回collection的hash code
boolean removeAll(Collection c) //从调用collection中去掉所有c中包含的元素(差集)
boolean retainAll(Collection c) //交集
Object[] toArray() //返回collection的元素组成的数组
void clear()
boolean isEmpty()
int size()

完整的类图,

 

迭代器(Iterator)

提供对collection统一的访问方式,

Iterator iterator = collection.iterator();//得到一个迭代器
while (iterator.hasNext()) {//遍历
Object element = iterator.next();
System.out.println("iterator = " + element);
}

上面已经显示iterator(), hasNext(), next()的使用方式

还有remove(), 删除由next方法返回的最后一个元素, 即先调用next, 再调用remove删除刚返回的element

Foreach

对iterator的封装, 底层仍然是调用iterator, 所以任意实现了Iterable接口的class对象, 都可以使用Foreach

Collection<String> cs = new LinkedList<String>();
for(String s : cs)
System.out.print("‘" + s + "‘ ");

ListIterator

专门用于处理list的iterator, 支持双向遍历和element更新

public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious(); //支持向前遍历
E previous();
int nextIndex(); //对位置index的支持
int previousIndex();
void remove();
void set(E e); //更新最后遍历到的元素
void add(E e); //在最后遍历到的元素后add element
}

 

List

可见对于List, 有比较老的版本, Vector和Stack, 是线程安全的, 但相应的效率较低

对于新版本, ArrayList, 基于数组实现; LinkedList, 基于链表实现, 非线程安全, 相应的效率较高, 这样当你需要考虑线程安全的时候自己加上, 更为合理.

和collection的基类相比, 增加对于位置序号的操作

void add(int index, Object element) //添加对象element到位置index上
boolean addAll(int index, Collection collection) //在index位置后添加容器collection中所有的元素
Object get(int index) //取出下标为index的位置的元素
int indexOf(Object element) //查找对象element在List中第一次出现的位置
int lastIndexOf(Object element) //查找对象element在List中最后出现的位置
Object remove(int index) //删除index位置上的元素
Object set(int index, Object element) //将index位置上的对象替换为element 并返回老的元素
List subList (int start, int end) //取出子list

LinkedList

除了支持标准的List接口, 还可以用于实现队列和栈

stack

public class Stack<T> {
private LinkedList<T> storage = new LinkedList<T>();
public void push(T v) { storage.addFirst(v); }
public T peek() { return storage.getFirst(); }
public T pop() { return storage.removeFirst(); }
public boolean empty() { return storage.isEmpty(); }
public String toString() { return storage.toString(); }
}

queue

Queue<Integer> queue = new LinkedList<Integer>(); //LinkedList是Queue的子类,已经包含queue的接口
offer() //插入element到队尾
peek(), element() //不移除,返回队头,区别是为空时, peek返回null, 而element会抛异常
poll(), remove() //移除并返回队头,同样为空时, poll返回null, 而remove会抛异常

PriorityQueue, 接口相同, 只不过基于最小堆实现

deque, 双向队列

public class Deque<T> {
private LinkedList<T> deque = new LinkedList<T>();
public void addFirst(T e) { deque.addFirst(e); }
public void addLast(T e) { deque.addLast(e); }
public T getFirst() { return deque.getFirst(); }
public T getLast() { return deque.getLast(); }
public T removeFirst() { return deque.removeFirst(); }
public T removeLast() { return deque.removeLast(); }
public int size() { return deque.size(); }
public String toString() { return deque.toString(); }
}

 

Map

Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map mapping) //将另外一个Map中的元素存入当前的Map中 Object get(Object key)
boolean containsKey(Object key) //判断Map中是否存在某键(key)
boolean containsValue(Object value) //判断Map中是否存在某值(value) public Set keySet() //返回所有的键(key), 用set, 不可重复
public Collection values() //返回所有的值(Value),用Collection, 可以重复
public Set entrySet() //返回一个实现 Map.Entry 接口的元素 Set

 

Set, 基于Map实现

和数学上的set概率是相同的, 最大特性是不允许有重复元素

所以可以用来查同, 过滤等, 当然实现机制用hash来实现

Set的接口等同于collection的接口

常用的set操作,

Union, s1.addAll(s2)

Intersection, s1.retainAll(s2)

补集, all.removeAll(set)

几种不同的set实现只是在于遍历顺序不同,

HashSet, 基于HashMap实现

最常见的set, 遍历时无序

TreeSet, 基于红黑树实现

遍历时, 元素有序, 所以成员要求实现Comparable接口,或者使用Comparator构造TreeSet

LinkedHashSet, 基于hash实现, 但是使用链表维护插入顺序

可以以插入序进行遍历

 

Collection Utilities

java.util.Collections的静态方法

 

String

String的不可变性, 任何更改操作, 其实都是创建新的String对象

String和char, int转化

String s = new String("asdfds");
char [] ch = s.toCharArray();
String s1 = ch.toString(); Integer i = new Integer (3);
s1 = i.toString();
int a = Integer.parseInt(s1);

方法

Java 常用语法和数据结构的更多相关文章

  1. [转]详细介绍java中的数据结构

    详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...

  2. 详细介绍java中的数据结构

    详细介绍java中的数据结构 http://developer.51cto.com/art/201107/273003.htm 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个 ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第三周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第三周学习总结 概述 Generalization 本周学习了第五章:队列.主要内容包含队列的处理过程.如何用对例如求解问 ...

  4. 20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...

  5. 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...

  6. 20172302 《Java软件结构与数据结构》实验二:树实验报告

    课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月5日 必修/选修: 必修 实验内容 (1)参 ...

  7. 20172306《Java程序设计与数据结构》第十周学习总结

    20172306<Java程序设计>第十周学习总结 教材学习内容总结 本章主要的讲的是集合有关的知识: 1.集合与数据结构 - 集合是一种对象,集合表示一个专用于保存元素的对象,并该对象还 ...

  8. 20172301 《Java软件结构与数据结构》实验二报告

    20172301 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...

  9. 20172329 2018-2019-2 《Java软件结构与数据结构》实验二报告

    20172329 2018-2019-2 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...

随机推荐

  1. js setInterval()函数 [倒计时用]

    定义和用法:        setInterval() 方法用于在指定的毫秒数后调用函数或计算表达式.它与setTimeout()方法不同的是前者可以无限的循环,不会受调用函数的限制,要想退出此循环可 ...

  2. EM5-PE6B

    1. vocabulay 1.1 scary adj.令人恐怖的 This is a scary thing. you can construct some extremely scary scena ...

  3. eclipse的源代码编辑窗口可以拖出来单独使用的哦

    这在你边阅读文档边写代码的时候非常有用的!整个eclipse窗口吧,太大,挡事,把源代码编辑的标签拖出来,就成为一个单独的窗口了,也就记事本大小,而且代码提示自动补全什么的一样不少~ 虽然这个代码编辑 ...

  4. spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring ...

  5. 在pom.xml文件中自定义JDK版本+阿里maven镜像修改

    在学习和开发中 总是修改jdk版本 但是这些配置文件又不想记 在此记录一下 方便查询: <build> <plugins> <!-- 指定jdk --> <p ...

  6. 解决Deepin每次打开Chome都提示解锁登录密钥环的麻烦

    密钥环是linux系统用于安全保存程序私密数据的模块,可以用于加密保存密码.证书.密钥等安全数据.chrome的密钥环用于保存本地访问站点密码或缓存从google服务器同步下来的访问站点的密码. De ...

  7. JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术

    JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术.从这一点来看,非常类似Microsoft ASP.PHP等技术.借助形式上的内容和外观表现的分 ...

  8. Git—怎样Windows操作系统中安装Git

    介绍一下怎样在Windows操作系统中安装Git: 一.下载Git安装压缩文件:http://download.csdn.net/detail/wangshuxuncom/8035045 二.解压该压 ...

  9. 蓝桥杯 第三届C/C++预赛真题(9) 夺冠概率(手工计算概率)

    足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能. 假设有甲.乙.丙.丁四个球队.根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表: 甲 乙 丙 丁 甲 - 0.1 0.3 0.5乙 ...

  10. 边缘检测算子和小波变换提取图像边缘【matlab】

    Roberts边缘检测算子:根据一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差. 小波变换的方法比较适用于展现夹带在正常信号中的瞬间反常现象,具有方向敏感性.所以可以边缘检 ...