[总结]Java语法
Java提供了八种基本数据类型:6种数字类型(4个整数型,两个浮点型),一个字符型、一个布尔型。
- 整型 byte; short; int; long
我们可以通过包装类的MAX_VALUE,MIN_VALUE来得到最大最小值。 - 浮点型 float; double
另外,有三个用于表示溢出和出错情况的特殊的浮点数值。我们可以通过包装类的POSTIVE_INFINITY,NEGATIVE_INFINITY来得到正无穷和负无穷。Double.NaN代表“不是数字”。 - 字符型 char
Java采用Unicode编码,一个char类型2个字节,相当于16位无符号整数 0-65536('\u0000' - '\uFFFF') - 布尔型 boolean
基本数据类型和String之间的相互转化
//基本数据类型转String
int a = 20;
String aa = a+"";
//String转基本数据类型
int bb = Integer.parseInt(aa);
//Char to int
char ch = '8';
int cc = ch - '0';
int number = 9;
char cNumber= (char)(number+'0');
char[] charArray = new char[] { 'a','b','c' };
String str = String.valueOf(charArray); // "abc"
String
Java中String表示字符串类型,属于 引用数据类型,不属于基本数据类型。在JDK当中双引号括起来的字符串,例如:“abc” "def"都是直接存储在“方法区”的“字符串常量池”当中的。
String的常用方法有:
方法名 | 作用 |
---|---|
char charAt(int index) | 返回指定位置的字符 |
int compareTo(String anotherString) | 比较两个字符串。相等返回0;前大后小返回1;前小后大返回-1 |
boolean contains(CharSequence s) | 判断字符串是否包含s |
boolean endsWith(String suffix) | 判断字符串是否以suffix结尾 |
boolean equals(Object anObject) | 判断两个串是否相等 |
boolean equalsIgnoreCase(String anotherString) | 忽略大小写判断两个串是否相等 |
int indexOf(String str) | 返回str在字符串第一次出现的位置 |
byte[] getBytes() | 将字符串串变成字节数组返回 |
boolean isEmpty() | 字符串是否为空 |
int length() | 字符串长度 |
int lastIndexOf(String str) | 返回str最后一次出现的位置 |
String replace(CharSequence target, CharSequence replacement) | 用replacement替换字符串target的字符 |
String[] split(String regex) | 将字符串以regex分割 |
boolean startsWith(String prefix) | 判断字符串是否以prefix开始 |
String substring(int beginIndex) | 从beginIndex开始截取字串 |
String substring(int beginIndex, int endIndex) | 截取beginIndex到endIndex - 1的字符串 |
String toLowerCase() | 字符串转小写 |
char[] toCharArray() | 将字符串转换乘char数组 |
String toUpperCase() | 字符串转大写 |
String trim() | 去除字符串两边空格 |
数组
数组是相同类型数据的有序集合。数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。可以通过import java.util.Arrays引入Arrays类。
Arrays的常用方法有:
方法名 | 作用 |
---|---|
int binarySearch(Object[] a, Object key) | 从指定的数组中使用二分查找搜索指定的值,找到了则返回该值在数组中的下标,没找到则返回一个负数。 |
int[] copyOf(int[] original, int newLength) | 将前面newLength个元素复制到一个新数组 |
int[] copyOfRange(int[] original, int from, int to) | 复制from-to索引的元素 |
boolean equals(int[] a, int[] a2)) | 判断数组 a 与数组 a2 是否相等,当且仅当a与a2元素相同 |
void fill(int[] a, int val) | 将所有元素赋值为val |
void sort(short[] a) | 将数组 a 进行升序排列。 |
Java集合
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java 提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。Java 所有的集合类都位于 java.util 包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类和操作它们的算法。这两个接口又包含了一些子接口或实现类。图 1 和图 2 分别为 Collection 和 Map 的子接口及其实现类。
在 图 1 和图 2 中,黄色块为集合的接口,蓝色块为集合的实现类。
接口名称 | 作 用 |
---|---|
Iterator 接口 | 集合的输出接口,主要用于遍历输出(即迭代访问)Collection 集合中的元素,Iterator 对象被称之为迭代器。迭代器接口是集合接口的父接口,实现类实现 Collection 时就必须实现 Iterator 接口。 |
Collection 接口 | 是 List、Set 和 Queue 的父接口,是存放一组单值的最大接口。所谓的单值是指集合中的每个元素都是一个对象。一般很少直接使用此接口直接操作。 |
Queue 接口 | Queue 是 Java 提供的队列实现,有点类似于 List。 |
Dueue 接口 | 是 Queue 的一个子接口,为双向队列。 |
List 接口 | 是最常用的接口。是有序集合,允许有相同的元素。使用 List 能够精确地控制每个元素插入的位置,用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,与数组类似。 |
Set 接口 | 不能包含重复的元素。 |
Map 接口 | 是存放一对值的最大接口,即接口中的每个元素都是一对,以 key➡value 的形式保存。 |
对于 Set、List、Queue 和 Map 这 4 种集合,Java 最常用的实现类分别是 HashSet、TreeSet、ArrayList、ArrayDueue、LinkedList 和 HashMap、TreeMap 等。表 2 介绍了集合中这些常用的实现类。
类名称 | 作用 |
---|---|
HashSet | 为优化査询速度而设计的 Set。它是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,实现比较简单 |
TreeSet | 实现了 Set 接口,是一个有序的 Set,这样就能从 Set 里面提取一个有序序列 |
ArrayList | 一个用数组实现的 List,能进行快速的随机访问,效率高而且实现了可变大小的数组 |
ArrayDueue | 是一个基于数组实现的双端队列,按“先进先出”的方式操作集合元素 |
LinkedList | 对顺序访问进行了优化,但随机访问的速度相对较慢。此外它还有 addFirst()、addLast()、getFirst()、getLast()、removeFirst() 和 removeLast() 等方法,能把它当成栈(Stack)或队列(Queue)来用 |
HsahMap | 按哈希算法来存取键对象 |
TreeMap | 可以对键对象进行排序 |
Collection接口
Collection 接口是 List、Set 和 Queue 接口的父接口,通常情况下不被直接使用。Collection 接口定义了一些通用的方法,通过这些方法可以实现对集合的基本操作。定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。
方法名称 | 说明 |
---|---|
boolean add(E e) | 向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。E 是元素的数据类型 |
boolean addAll(Collection c) | 向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true。 |
void clear() | 清除集合中的所有元素,将集合长度变为 0。 |
boolean contains(Object o) | 判断集合中是否存在指定元素 |
boolean containsAll(Collection c) | 判断集合中是否包含集合 c 中的所有元素 |
boolean isEmpty() | 判断集合是否为空 |
Iterator |
返回一个 Iterator 对象,用于遍历集合中的元素 |
boolean remove(Object o) | 从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。 |
boolean removeAll(Collection c) | 从集合中删除所有在集合 c 中出现的元素(相当于把调用该方法的集合减去集合 c)。如果该操作改变了调用该方法的集合,则该方法返回 true。 |
boolean retainAll(Collection c) | 从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合 c 的交集),如果该操作改变了调用该方法的集合,则该方法返回 true。 |
int size() | 返回集合中元素的个数 |
Object[] toArray() | 把集合转换为一个数组,所有的集合元素变成对应的数组元素。 |
List集合
List 实现了 Collection 接口,它主要有两个常用的实现类:ArrayList 类和 LinkedList 类。
ArrayList 类
ArrayList 类实现了可变数组的大小,存储在内的数据称为元素。它还提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好。使用 ArrayList 创建的集合,允许对集合中的元素进行快速的随机访问,不过,向 ArrayList 中插入与删除元素的速度相对较慢。
ArrayList 类除了包含 Collection 接口中的所有方法之外,还包括 List 接口中提供的如表 4 所示的方法。
方法名称 | 说明 |
---|---|
E get(int index) | 获取此集合中指定索引位置的元素,E 为集合中元素的数据类型 |
int index(Object o) | 返回此集合中第一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1 |
int lastIndexOf(Object o) | 返回此集合中最后一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1 |
E set(int index, Eelement) | 将此集合中指定索引位置的元素修改为 element 参数指定的对象。此方法返回此集合中指定索引位置的原元素 |
List |
返回一个新的集合,新集合中包含 fromlndex 和 tolndex 索引之间的所有元素。包含 fromlndex 处的元素,不包含 tolndex 索引处的元素 |
LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高,但是LinkedList 类随机访问元素的速度则相对较慢。这里的随机访问是指检索集合中特定索引位置的元素。
LinkedList 类除了包含 Collection 接口和 List 接口中的所有方法之外,还特别提供了表 2 所示的方法。
方法名称 | 说明 |
---|---|
void addLast(E e) | 将指定元素添加到此集合的末尾 |
void addFirst(E e) | 将指定元素添加到此集合的开头 |
E getFirst() | 返回此集合的第一个元素 |
E getLast() | 返回此集合的最后一个元素 |
E removeFirst() | 删除此集合中的第一个元素 |
E removeLast() | 删除此集合中的最后一个元素 |
Queue集合
Queue 用于模拟队列这种数据结构。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
Queue接口里定义了如下几种方法:
方法名称 | 说明 |
---|---|
void add(Object e) | 将指定元素加入此队列的尾部; |
Object element() | 获取队列头部的元素,但是不删除该元素; |
boolean offer(Object e) | 将指定元素加入此队列的尾部。当使用有容量限制的队列时,此方法通常比add方法更好; |
Object peek() | 获取头部元素,但不删除,如果队列为空,则返回null; |
Object poll() | 获取队列头部元素并删除。如果队列为空,则返回null; |
Object remove() | 删除头部元素。 |
Queue接口有一个PriorityQueue实现类,除此之外Queue还有一个Deque接口,Deque代表一个"双端队列",可以同时从两端来添加或删除元素。
PriorityQueue实现类保存队列元素的顺序并不是按加入顺序,而是按队列元素的大小进行重新排序。因此当调用peek或poll方法时,并不是取出元素的最先进入的,而是取出最小元素。
Deque接口是Queue接口的子接口,它代表一个双端队列,Deque接口里定义了一些双端队列的方法,这些方法允许从两端来操作队列元素:
方法名称 | 说明 |
---|---|
void addfirst(Object o) | 将指定元素插入该双端队列的开头。 |
void addLast(Object o) | 将置顶元素插入双端队列末尾。 |
Iterator descendingIterator() | 返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。 |
Object getFirst() | 获取但不删除双端队列的第一个元素; |
Object getLast() | 获取但不删除双端队列的最后一个元素; |
boolean offerFirst(Object e) | 将指定元素加入双端队列的头部; |
boolean offerLast(Object e) | 将指定元素加入双端队列的尾部; |
Object peekFirst() | 获取头部元素,但不删除,如果队列为空,则返回null; |
Object peekLast() | 获取尾部元素,但不删除,如果队列为空,则返回null; |
Object pollFirst() | 获取队列头部元素并删除。如果队列为空,则返回null; |
Object pollLast() | 获取队列尾部元素并删除。如果队列为空,则返回null; |
Object pop() | pop取出双端队列所表示的栈的栈顶元素。 |
Object removeFirst() | 删除头部元素。 |
Object removeFirstOccurrence(Object o) | 删除该双端队列的第一次出现的元素o; |
Object removeLast() | 删除尾部元素。 |
Object removeLastOccurrence(Object o) | 删除该双端队列的最后一次出现的元素o; |
Deque提供了一个典型的实现类:ArrayDeque,它是一个基于数组实现的双端队列。
创建Deque时同样可指定一个numElements参数来指定Object[]数组的长度,如果不指定,默认长度为16。
ArrayDeque既可以当做“栈”来使用,也可以当做“队列”来使用。
Set集合:HashSet和TreeSet类
Set 集合中的对象不按特定的方式排序,只是简单地把对象加入集合。Set 集合中不能包含重复的对象,并且最多只允许包含一个 null 元素。
Set 实现了 Collection 接口,它主要有两个常用的实现类:HashSet 类和 TreeSet类。
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 是按照 Hash 算法来存储集合中的元素。因此具有很好的存取和查找性能。
TreeSet 类同时实现了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以实现对集合进行自然排序,因此使用 TreeSet 类实现的 Set 接口默认情况下是自然排序的,这里的自然排序指的是升序排序。TreeSet 只能对实现了 Comparable 接口的类对象进行排序,因为 Comparable 接口中有一个 compareTo(Object o) 方法用于比较两个对象的大小。例如 a.compareTo(b),如果 a 和 b 相等,则该方法返回 0;如果 a 大于 b,则该方法返回大于 0 的值;如果 a 小于 b,则该方法返回小于 0 的值。
TreeSet 类除了实现 Collection 接口的所有方法之外,还提供了如表 2 所示的方法。
方法名称 | 说明 |
---|---|
E last() | 返回此集合中的最后一个元素 |
E first() | 返回此集合中的第一个元素。其中,E 表示集合中元素的数据类型 |
E poolLast() | 获取并移除此集合中的最后一个元素 |
E poolFirst() | 获取并移除此集合中的第一个元素 |
SortedSet |
返回一个新的集合,新集合包含原集合中 fromElement 对象与 toElement 对象之间的所有对象。包含 fromElement 对象,不包含 toElement 对象 |
SortedSet |
返回一个新的集合,新集合包含原集合中 toElement 对象之前的所有对象。不包含 toElement 对象 |
SortedSet |
返回一个新的集合,新集合包含原集合中 fromElement 对象之后的所有对象。包含 fromElement 对象 |
注意:表面上看起来这些方法很多,其实很简单。因为 TreeSet 中的元素是有序的,所以增加了访问第一个、前一个、后一个、最后一个元素的方法,并提供了 3 个从 TreeSet 中截取子 TreeSet 的方法。
Map集合
Map 是一种键-值对(key-value)集合,Map 接口主要有两个实现类:HashMap 类和 TreeMap 类。其中,HashMap 类按哈希算法来存取键对象,而 TreeMap 类可以对键对象进行排序。
Map 接口中提供的常用方法如表 7 所示。
方法名称 | 说明 |
---|---|
boolean containsKey(Object key) | 查询 Map 中是否包含指定的 key,如果包含则返回 true。 |
void clear() | 删除该 Map 对象中的所有 key-value 对。 |
boolean containsValue(Object value) | 查询 Map 中是否包含一个或多个 value,如果包含则返回 true。 |
V get(Object key) | 返回 Map 集合中指定键对象所对应的值。V 表示值的数据类型 |
V put(K key, V value) | 向 Map 集合中添加键-值对,如果当前 Map 中已有一个与该 key 相等的 key-value 对,则新的 key-value 对会覆盖原来的 key-value 对。 |
void putAll(Map m) | 将指定 Map 中的 key-value 对复制到本 Map 中。 |
V remove(Object key) | 从 Map 集合中删除 key 对应的键-值对,返回 key 对应的 value,如果该 key 不存在,则返回 null |
boolean remove(Object key, Object value) | 这是 Java 8 新增的方法,删除指定 key、value 所对应的 key-value 对。如果从该 Map 中成功地删除该 key-value 对,该方法返回 true,否则返回 false。 |
Set entrySet() | 返回 Map 集合中所有键-值对的 Set 集合,此 Set 集合中元素的数据类型为 Map.Entry |
Set keySet() | 返回 Map 集合中所有键对象的 Set 集合 |
boolean isEmpty() | 查询该 Map 是否为空(即不包含任何 key-value 对),如果为空则返回 true。 |
int size() | 返回该 Map 里 key-value 对的个数 |
Collection values() | 返回该 Map 里所有 value 组成的 Collection |
Collections类
Collections 类是 Java 提供的一个操作 Set、List 和 Map 等集合的工具类。Collections 类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。下面介绍 Collections 类中操作集合的常用方法。
Collections 提供了如下方法用于对 List 集合元素进行排序。
void reverse(List list):对指定 List 集合元素进行逆向排序。
void shuffle(List list):对 List 集合元素进行随机排序(shuffle 方法模拟了“洗牌”动作)。
void sort(List list):根据元素的自然顺序对指定 List 集合的元素按升序进行排序。
void sort(List list, Comparator c):根据指定 Comparator 产生的顺序对 List 集合元素进行排序。
void swap(List list, int i, int j):将指定 List 集合中的 i 处元素和 j 处元素进行交换。
void rotate(List list, int distance):当 distance 为正数时,将 list 集合的后 distance 个元素“整体”移到前面;当 distance 为负数时,将 list 集合的前 distance 个元素“整体”移到后面。该方法不会改变集合的长度。
Collections 还提供了如下常用的用于查找、替换集合元素的方法。
int binarySearch(List list, Object key):使用二分搜索法搜索指定的 List 集合,以获得指定对象在 List 集合中的索引。如果要使该方法可以正常工作,则必须保证 List 中的元素已经处于有序状态。
Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素。
Object max(Collection coll, Comparator comp):根据 Comparator 指定的顺序,返回给定集合中的最大元素。
Object min(Collection coll):根据元素的自然顺序,返回给定集合中的最小元素。
Object min(Collection coll, Comparator comp):根据 Comparator 指定的顺序,返回给定集合中的最小元素。
void fill(List list, Object obj):使用指定元素 obj 替换指定 List 集合中的所有元素。
int frequency(Collection c, Object o):返回指定集合中指定元素的出现次数。
int indexOfSubList(List source, List target):返回子 List 对象在父 List 对象中第一次出现的位置索引;如果父 List 中没有出现这样的子 List,则返回 -1。
int lastIndexOfSubList(List source, List target):返回子 List 对象在父 List 对象中最后一次出现的位置索引;如果父 List 中没有岀现这样的子 List,则返回 -1。
boolean replaceAll(List list, Object oldVal, Object newVal):使用一个新值 newVal 替换 List 对象的所有旧值 oldVal。
Random类
Random类是java.until下的一个根据随机算法的起源数字进行一些变化,从而得到随机数字的方法。虽然Random类产生的数字是随机的,但在相同种子数(seed)下的相同次数产生的随机数是相同的(伪随机)。
常用方法:
new Random().nextInt(x) 返回值为整数,范围在0~x(不包含X)内的任意整数
new Random().nextInt(x,y) 返回值为整数,范围在x~y(不包含y)内的任意整数
new Random().nextLong() 返回值为长整型,范围是long类型的范围