Java 常用语法和数据结构

简介:

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>();

image

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()

完整的类图,

image

 

迭代器(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

image

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的静态方法

image image

 

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);

方法

image image


本文章摘自博客园,原文发布日期:2013-09-30

目录
相关文章
|
2天前
|
缓存 安全 Java
全面解读ConcurrentHashMap:Java中的高效并发数据结构
全面解读ConcurrentHashMap:Java中的高效并发数据结构
7 2
|
2天前
|
算法 Java 索引
12.12_黑马数据结构与算法笔记Java
12.12_黑马数据结构与算法笔记Java
12 1
|
2天前
|
存储 Java
震惊!关系运算符在 Java 基本语法中竟然这么重要!
【6月更文挑战第14天】Java 中的关系运算符在编程中扮演关键角色。通过案例展示了它们的用法:比较数值大小、判断字符串相等、执行多重关系判断、在循环和条件语句中的应用,以及与其他运算符结合使用。理解并熟练运用这些运算符,能有效控制程序流程,实现复杂逻辑,是构建 Java 代码基础的重要部分。
|
2天前
|
Java
哇塞!Java 基本语法的运算符,你真的懂了吗?算术运算符篇
【6月更文挑战第14天】Java中的算术运算符是编程基础,包括加法`+`(用于数字相加和字符串拼接)、减法`-`、乘法`*`、除法`/`(需防除数为零)和取余`%`。它们在计算位移、周期性问题等场景中广泛应用。理解并熟练掌握这些运算符,能提升编程效率和代码质量。现在就开始实践,发掘它们的更多可能性吧!
|
2天前
|
算法 Java 程序员
厉害了!算术运算符,让 Java 基本语法大不同!
【6月更文挑战第14天】Java中的算术运算符是编程基础,如加法&quot;+&quot;不仅用于数字相加,也可拼接字符串。减法&quot;-&quot;、乘法&quot;*&quot;、除法&quot;/&quot;(注意除数非零)、取余 &quot;%&quot; 在各种计算中扮演重要角色。例如,乘法可计算物体移动距离,取余用于数据分组,加减法在复杂公式中必不可少。熟练运用这些运算符能提升代码效率和逻辑性,助力成为更出色的Java程序员。
|
2天前
|
Java 数据安全/隐私保护
尖叫!逻辑运算符如何重塑 Java 基本语法!
【6月更文挑战第14天】Java编程中的逻辑运算符(&&, ||, !)是构建复杂逻辑的关键。与运算符要求两边表达式均真,或运算符只需一侧为真,非运算符则对布尔值取反。在实际应用如登录检查、条件判断中,这些运算符组合使用能实现灵活的控制流程。理解并熟练运用逻辑运算符,能增强程序的逻辑处理能力,为编程带来广阔的可能性。探索和实践,让逻辑运算符在代码中释放更大潜力!
|
2天前
|
Java
恐怖!不懂算术运算符,还敢说懂 Java 基本语法?
【6月更文挑战第14天】Java中的算术运算符是编程基础,包括加法`+`、减法`-`、乘法`*`、除法`/`和取余`%`。它们不仅用于基本数学计算,还在复杂程序逻辑中扮演重要角色。例如,计算图形面积、游戏得分管理等场景。理解并熟练运用这些运算符是成为Java高手的关键,它们构成程序的基础并赋能复杂计算。不断深化对算术运算符的掌握,将助力我们编写更高效、精准的Java程序。
|
2天前
|
Java
惊人!关系运算符对 Java 基本语法的影响超乎想象!
【6月更文挑战第14天】Java中的关系运算符是编程基础的关键,如&quot;==&quot;、&quot;!=&quot;、&quot;&gt;&quot;、&quot;&lt;&quot;、&quot;&gt;=&quot;和&quot;&lt;=&quot;。它们在条件判断中扮演重要角色,控制程序流程并依据数据作出响应。从比较数值到构建复杂的逻辑,如购物车优惠条件或游戏关卡判定,关系运算符在实际项目中广泛应用。理解并熟练使用这些运算符能增强程序的灵活性和智能性,开启更丰富的编程可能。
|
2天前
|
Java
崩溃!Java 逻辑运算符,让你重新认识基本语法!
【6月更文挑战第14天】Java中的逻辑运算符“&&”、“||”和“!”用于构建复杂的逻辑结构。例如,“&&”要求两边操作数均为真,表达式才为真;“||”只需一个操作数为真即为真;“!”是对布尔值取反。通过这些运算符,我们可以编写条件判断和逻辑推理,如示例所示,它们在程序设计中扮演着关键角色,使程序能根据不同条件作出相应反应。理解和熟练使用逻辑运算符对于编写智能灵活的程序至关重要。
|
2天前
|
算法 Java
炸裂!Java 基本语法的运算符世界,等你来探索!算术运算符特辑
【6月更文挑战第14天】Java中的算术运算符是基础关键,如加法&quot;+&quot;用于数字相加和字符串拼接,减法&quot;-&quot;求差,乘法&quot;*&quot;相乘,除法&quot;/&quot;注意整数除法会舍去小数,浮点数则保留,取模&quot;%&quot;)返回除法余数。熟练掌握这些运算符能提升编程效率,构建复杂逻辑。继续探索Java运算符世界,创造更多精彩程序!