目录
0.基石 | 机制
0.-1 Java中的面向对象
0.0 Java的流、文件、I O
流
文件
Scanner
0.1 Java中基本数据类型取值范围
Number类
Math类
0.2 Java中的强转和进制转换
0.3 Java中的泛型
介绍
Java中的泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
——来自:菜鸟教程
泛型方法
泛型方法,该方法在调用时可以接受不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
定义泛型方法的规则:
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前
- 每一个类型参数声明部分包含一个或多个类型参数,参数之间啊用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。。
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
- 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(比如 int、double、char 等)。
Java 中泛型标记符:
- E-Element (集合中的元素)
- T-Type (Java类)
- K-Key (键)
- V-Value (值)
- N-Number (数值类型)
- ?-表示不确定的Java类型
实例:
public class GenericMethodTest
{
// printArray
public static < E > void printArray ( E[] inputArray)
{
//
for( E element : inputArray){
System.out.printf("%s",element);
}
System.out.println();
}
public static void main (String args[]){
//create diffrent type of arrarys : Integer, Double ,Character
Integer [] intArray={1,2,3};
Double [] doubleArrary = ……
……
and so on
next we could print theses arrays by using printArray
}
}
有界的类型参数
可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。
要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界
实例:
public class MaximumTest
{
//比较三个值返回最大值
public static <T extends Comparable<T> > T maximum(T x,T y ,T z )
{
T max = x;
if(y.compareTo(max) > 0 ){
max = y;
}
if(z.compareTO(max) > 0){
max = z;
}
return max;
}
public static void main (String args[])
{
sout( "%d, %d 和 %d 中最大的数为 %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ))
}
}
0.4 Iterator 迭代器
介绍
Java迭代器是Java集合框架中的一种机制,用于遍历集合(如:列表、集合和映射等)的接口。它提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节。
Java Iterator 不是一个集合,是一种方法。Iterator是Java迭代器最简单的实现,ListIterator是CollectionAPI中的接口,扩展了Iterator接口。
迭代器接口定义了几个方法,最常用的是以下三个:
- next() - 返回迭代器的下一个元素,并将迭代器的指针移到下一个位置。
- hasNext() - 用于判断集合中是否还有下一个元素可以访问。
- remove() - 从集合中删除迭代器最后访问的元素。
Iterator 类位于java.util包中,使用前需要引入它。
通过迭代器,我们可以逐个访问集合中的元素,而不需要使用传统的for循环或者索引。这种方式更加简洁和灵活,并且适用于各种类型的集合。
获取一个迭代器
import java.util.ArrayList;
import java.tuil.Iterator;
public class RunoobTest{
public static void main(String []arg)
{
ArrayList <String> sites = new ArrayList<String>();
sites.add("Google");
sites.add("Baidu");
//实例化集合的迭代器接口
Iterator<String> it = sites.iterator();
System.out.print(it.next());
返回所有集合中的元素:
代码:
while(it.hasNext())
{
System.out.println(it.next());
}
// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;
public class RunoobTest {
public static void main(String[] args) {
// 创建集合
ArrayList<String> sites = new ArrayList<String>();
sites.add("Google");
sites.add("Runoob");
sites.add("Taobao");
sites.add("Zhihu");
// 获取迭代器
Iterator<String> it = sites.iterator();
// 输出集合中的所有元素
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
删除操作
// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;
public class RunoobTest {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(12);
numbers.add(8);
numbers.add(2);
numbers.add(23);
Iterator<Integer> it = numbers.iterator();
while(it.hasNext()) {
Integer i = it.next();
if(i < 10) {
it.remove(); // 删除小于 10 的元素
}
}
System.out.println(numbers);
}
}
注意点
PS: 使用迭代器集合的时候,如果在遍历过程中对集合进行了修改比如增删,可能会导致一个异常:ConcurrentModificationException,为了避免这个问题,可以使用迭代器自身的 remove()方法进行删除操作。
而且迭代器是一种单向遍历机制,只能从前往后遍历集合中的元素,不能往回遍历。同时,在使用迭代器遍历集合时,不能直接修改集合中的元素,而是需要使用迭代器的remove()方法删除当前元素。
0.41 Iterable
iterator为迭代器对象,而Iterable则是对iterator的封装
0.5 循环结构(提炼重点)
关于 for 循环有以下几点说明:
- 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
- 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量。
- 再次检测布尔表达式。循环执行上面的过程。
在 Java5 中引入了一种主要用于数组的增强型 for 循环。
for(声明语句 : 表达式)
{
//代码句子
}
声明语句:声明新的局部变量该变量的类型必须和数组元素类型匹配。作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:访问的数组名,或者是返回值为数组的方法。
1.数组和集合API
1.0 Java数组 Array
1.1 Java集合 Collection And Map
- 继承图
Collection---->Collections Map----->SortedMap------>TreeMap
Collection---->List----->(Vector \ ArryList \ LinkedList) Map------>HashMap
Collection---->Set------>(HashSet \ LinkedHashSet \ SortedSet)
通常来讲集合下面包含两大类:
- 单列-Colletion 双列-Map
- Collection-单列
- 可重复 List
- (ArrayList、LinkedList、Vector)
- 不可重复 Set
- (HashSet(无序)、LinkedHash(添加顺序)、TreeSet(自然顺序))
- Map-双列(键值对)
- HashTable
- HashMap
- LinkedHashMap
- WeakHashMap
- TreeMap
- IdentifyHashMap
1.1.1 Collection接口
List集合
List中主要有ArrayList、LinkedList两个实现类;Set中则是有HashSet实现类;而Queue是在JDK1.5后才出现的新集合,主要以数组和链表两种形式存在。
- List 常用方法
A:添加功能
boolean add(E e):向集合中添加一个元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一个集合的元素。
B:删除功能
void clear():删除集合中的所有元素
E remove(int index):根据指定索引删除元素,并把删除的元素返回
boolean remove(Object o):从集合中删除指定的元素
boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。
C:修改功能
E set(int index, E element):把指定索引位置的元素修改为指定的值,返回修改前的值。
D:获取功能
E get(int index):获取指定位置的元素
Iterator iterator():就是用来获取集合中每一个元素。
E:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object o):判断集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判断集合中是否存在指定的一个集合中的元素。
F:长度功能
int size():获取集合中的元素个数
G:把集合转换成数组
Object[] toArray():把集合变成数组。
asList
String[] arr = {"apple", "banana", "orange"};
List<String> list = Arrays.asList(arr);
1.1.2 Map接口
1.2 工具类:Collections和Arrays
- 它们提供提供了封装器实现(Wrapper Implementations)、数据结构算法和数组相关的应用
常用方法
-
binarySearch:二分查找
-
sort:归并排序
-
reverse:将线性表进行逆序操作
-
rotate:以某个元素为轴心将线性表“旋转”
-
swap:交换一个线性表中两个元素的位置
2.栈相关API(相关实现已由Deque负责)
2.1 Stack
创建一个栈,相关方法
Stack<Object> stack = new Stack<>();
stack.push(Object);
stack.pop();
stack.peek();//查看栈顶元素
stack.size();
stack.empty();//返回值为 true or false
2.x Deque 如何作为栈使用?-ArrayDeque
- 特点
- 容量不限(可变数组)
- 线程不安全的,没有外部同步的情况下不能在多线程中使用
- 作为栈来使用,效率比Stack高,作为队列使用,比LinkedList效率高
- 不支持null值
- 继承关系
3.队列相关API
3.1Queue
Queue是实现队列的接口
首先,Queue接口是常用API,继承自Collection 接口
常用的实现类
- LinkedList 和 PriorityQueue
常用六种方法
(不满足条件时:前者抛异常,后者返回特殊值):
-
压入元素(添加):add()、offer()
- 相同:未超出容量,从队尾压入元素,返回压入的那个元素。
- 区别:在超出容量时,add()方法会对抛出异常,offer()返回false
-
弹出元素(删除):remove()、poll()
- 相同:容量大于0的时候,删除并返回队头被删除的那个元素。
- 区别:在容量为0的时候,remove()会抛出异常,poll()返回false
-
获取队头元素(不删除):element()、peek()
- 相同:容量大于0的时候,都返回队头元素。但是不删除。
- 区别:容量为0的时候,element()会抛出异常,peek()返回null。
每一个队列的实现必须指定其顺序属性(按先后顺序排;按递增(自然)顺序排)
并发情况
然而Queue接口并未定义阻塞队列的方法
BlockingQueue 定义了那些等待元素出现或者等待队列中有可用空间的方法
补充
1.null值通常不被允许插入,除了在少数实现中
2.Queue实现通常未定义equals和hashCode方法的基于元素的版本,而是从Object类中继承了基于身份的版本
3.1.2 双端队列-Deque
- Deque详解
首先Deque 也是一个接口,继承自 Queue
Deque 实现类
- LinkedList,ArrayDeque,LinkedBlockingDeque
Deque 方法
boolean add(E e); | 在队列尾部添加一个元素 成功返回true 失败抛出异常 |
---|---|
boolean offer(E e); | 在队列尾部添加一个元素 成功返回true 失败返回false |
E remove(); | 取出队列的第一个元素,并从队列中移除该元素,成功返回该元素,失败返回false,如果指定元素为空,抛出NullPointerException |
E poll(); | 取出队列第一个元素,并从队列中移除该元素,成功返回该元素,失败返回null。 |
E element(); | 取出队列第一个元素,不移除,成功返回该元素,失败抛出异常 |
E peek(); 取出队列第一个元素,不移除,成功返回该元素,失败返回null。 |
Deque的独有方法
void addFirst(E e); | 在队列头部 添加一个元素,失败抛出异常 |
---|---|
void addLast(E e); | 在队列尾部 添加一个元素,失败抛出异常 |
boolean offerFirst(E e); | 在队列头部 添加一个元素,成功返回true ,失败返回false |
boolean offerLast(E e); | 在队列尾部 添加一个元素,成功返回true ,失败返回false |
E removeFirst(); | 取出队列的第一个元素,并移除该元素,成功返回该元素,失败抛出异常 |
E removeLast(); | 取出队列的最后一个元素,并移除该元素,成功返回该元素,失败抛出异常 |
E pollFirst(); | 取出队列的第一个元素,并移除该元素,成功返回该元素,失败返回null |
E pollLast(); | 取出队列的最后一个元素,并移除该元素,成功返回该元素,失败返回null |
E getFirst(); | 取出队列的第一个元素,不移除,成功返回该元素,失败抛出异常 |
E getLast(); | 取出队列的最后一个元素,不移除,成功返回该元素,失败抛出异常 |
E peekFirst(); | 取出队列的第一个元素,不移除,成功返回该元素,失败返回null |
E peekLast(); | 取出队列的最后一个元素,不移除,成功返回该元素,失败返回null |
boolean removeFirstOccurrence(Object o); | 移除双向队列中第一个出现的该元素,成功返回true,失败抛出异常 |
boolean removeLastOccurrence(Object o); | 移除双向队列中最后一个出现的该元素,成功返回true,失败抛出异常 |
void push(E e); | 在双向队列头部 添加一个元素 ,失败抛出异常 |
E pop(); | 取出队列的第一个元素,并移除该元素,队列为空时 抛出NoSuchElementException |
boolean contains(Object o); | 判断队列中是否包含指定元素,包含返回true 否则返回false |