当前位置:   article > 正文

java刷题必备api【常用】_java刷题常用api

java刷题常用api

整理java刷题过程中常用api,加强记忆,好记性不如烂笔头嘛!Online notebook!

刷题过程,了解各种数据结构(组织数据的方式)是非常重要的,如数组,字符串及集合等。数学相关的工具类java.lang.Math中的一些常用方法,如绝对值,取整(向上、向下)、四舍五入及次幂等。数组工具类java.util.Arrays和集合工具类java.util.Collections中的常用方法,如排序。基本数据类型的最大值最小值,也是也是需要知道的哦!

(数据结构包括 :线性结构和非线性结构。线性结构常见的有:数组、队列、链表和栈。)

目录

1、数组

2、字符串

3、集合

4、工具类

5、基本类型的最大值与最小值


1、数组

常用数组为:一维数组和二维数组。
(1)定义

定义数组的语法有两种。

  1. type arrayName[]; //第一种
  2. type[] arrayName; //第二种
  3. //eg
  4. int arrayName[] = new int[5];
  5. int[] arrayName = new int[5];

type 为Java中的任意数据类型,包括基本类型和引用类型,arrayName为数组名,必须是一个合法的标识符,[ ] 指明该变量是一个数组类型变量,[ ]的数量表示数组的维度,可以有多个,表示多维度数组。Java实际上没有多维数组,只有一维数组。多维数组可以理解为“数组的数组” ,比如二维数组其实是一个一维数组,数组中每个元素是一个一维数组。。

(2)初始化

可以在声明数组的同时进行初始化(静态初始化),也可以在声明以后进行初始化(动态初始化)。

  1. //静态初始化
  2. int[] arr=new int[]{1,2,3};
  3. //动态初始化
  4. String[] strArr=new String[3];
  5. strArr[0]="Hello";
  6. strArr[1]="World";
  7. strArr[2]="Hello World";

(3)使用

根据对应索引进行访问(赋值,修改)即可。

2、字符串

字符串分为两类:不可变字符串(String)和可变字符串(StringBuilder)。

String类用来表示那些创建后就不会再改变的字符串,而StringBuffer类用来表示内容可变的字符串,并提供了修改字符串的方法。

表面上拼接字符串时,String类使用str1+str2这种形式拼接字符串,实际上是JVM帮助创建StringBuilder对象来拼接,StringBuffer类却要调用一个append()方法来拼接,看起来调用一个方法比一个简单的“+”麻烦一些,但是拼接字符串最好用StringBuilder类,效率更高,更高,更高~

(1)java.lang.String

  • 初始化        

java中创建并初始化一个String对象,最常见的方式有两种。

  1. String str = new String("XXX"); //参数可以是字符串常量,也可为字符数组
  2. String str = "XXX"; //参数可为字符串常量,可为String.valueOf()系列的返回值

二者看似相同,其实有很大的差别。
前者是java中标准的对象创建方式,其创建的对象将直接放置到堆中,每调用一次就会创建一个新的对象;后者则会在栈中创建一个对象引用变量str,然后查看字符串池中是否存在"XXX",如果没有,则将"XXX"存放字符串池,并令引用变量str指向它;如果已经有"XXX",则直接令str指向它。

  • 常用方法
  1. charAt(int index); //返回index位置的字符char --- O(1)
  2. length(); //返回字符串长度 --- O(1)
  3. substring(int beginIndex, int endIndex); //返回字符片段[beginIndex, endIndex) --- O(n)
  4. substring(int beginIndex); //返回字符片段[beginIndex, end_of_String) 就是从beginIndex开始后面的 ---- O(n)
  5. indexOf(String str); //返回str第一个出现的位置(int),没找到则返回-1。 --- O(m * n) m为原串长度, n为str长度
  6. s.indexOf(String str, int fromIndex); //同上,但从fromIndex开始找 --- O(m * n)
  7. lastIndexOf(String str); //返回str最后出现的位置(int),没找到则返回-1。 --- O(m * n) m为原串长度, n为str长度
  8. lastIndexOf(String str, int fromIndex); //同上,但从fromIndex开始从后往前找 [0 <- fromIndex] --- O(m * n)
  9. replace(char oldChar, char newChar); //返回一个新字符串String,其oldChar全部变成newChar --- O(n)
  10. toCharArray(); //返回char[]数组。把String变成字符数组 --- O(n)
  11. trim(); //去除前后空格的新字符串 --- O(n)
  12. split(String regex); //返回String[],以regex(正则表达式)分隔好的字符换数组。 ---- O(n)
  13. //eg:"nanjing" -> [, a, ji, g] (一定要注意,参数可以适合正则表达式的)
  14. String str = "nanjing";System.out.println(Arrays.toString(str.split("n")));
  15. toLowerCase(); //返回一个新的字符串全部转成小写 --- O(n)
  16. toUpperCase(); //返回一个新的字符串全部转成大写 --- O(n)

(2)java.lang.StringBuilder

  • 创建对象
StringBuilder sb = new StringBuilder();
  • 常用方法
  1. charAt(int index); //返回index位置的char --- O(1)
  2. length(); //返回缓冲字符串长度 --- O(1)
  3. append(String str); //拼接字符串 --- O(n)
  4. toString(); //返回一个与构建起或缓冲器内容相同的字符串 --- O(n)

3、集合

类/接口特性常用方法

接口:List

(列表)

有序的,可重复的add() remove() get() size() subList()

接口:Set

(集合)

不可重复add() remove() contains() isEmpty() size() [first() last()]

接口:Map

(映射)

键唯一,值不唯一put() get() getOrDefault() containsKey() containsValue() keySet() values() isEmpty() size()

类:Stack

(栈)

后进先出(LIFO),进出都在一端(栈顶)push() pop() peek() isEmpty() size()

接口:Queue

队列

先进先出(FIFO),从队尾进,从队头出offer() poll() peek() isEmpty() size()

接口:Deque

(双向队列)

既有FIFO,又有LIFO的特点,即是队列,又是栈offerFirst() offerLast() pollFirst() pollLast() peekFirst() peekLast() isEmpty() size()

类:PriorityQueue(优先队列)

每次取出的元素都是队列中权值最小的(可自定义取出的数值是最大还是最小)offer() poll() peek() isEmpty() size()

 LIFO:Last In First Out,FIFO: First Input First Output。[first() last()]:TreeSet类中的方法。

关于集合(接口)的特性,使用时候要看接口的具体实现类。

1、List的两个实现类(ArrayList,LinkedList):其中,ArrayList底层是通过数组(动态扩容的数组)实现的,查询快;LinkedList底层是通过双向链表实现的,插入和删除快。

2、Set的三个实现类(HashSet,LinkedHashSet,TreeSet),关于存储元素顺序的区别:HashSet元素乱序, LinkedHashSet保证元素添加顺序,TreeSet元素按自然顺序排序。

3、Map的两个实现类(HashMap,TreeMap),关于存储键值对顺序的区别:HashMap键值对乱序、TreeMap键值对以“键”排序。

TreeSet中的元素和TreeMap中键如果是基本数据类型(的包装类型)或者是字符串,那么就按照数值大小以及字典序排序即可,但是如果是自定义的实体类对象,就需要程序员自己自定义排序方式。自定义排序时,需要用到Comparable接口或者是Comparator接口。

自然排序--使用Comparable接口

定制排序--使用Comparator接口

自定义实体类对象作为集合中元素的自定义排序,见:https://blog.csdn.net/King_wq_2020/article/details/118911582?spm=1001.2014.3001.5501

1、List列表(ArrayList、LinkedList)

(1)实例化以及传参

  1. List<Integer> array = new ArrayList<>(); // 顺序表
  2. // Set<Integer> a = new HashSet<Integer>();
  3. List<Integer> b = new ArrayList<>(a); //接受一个集合容器

(2)get

get(int index)    // 返回元素位置在index的元素e --- 数组 O(1), 链表 O(n)

(3)size

size()    // 返回动态数组所存元素个数/链表长度 --- O(1)

 (4)add

  1. add(E e) // 在尾部添加一个元素e --- O(1)
  2. add(int index, E e) // 在index位置插一个元素e --- O(n)

 (5)remove

  1. remove(int index) // 删除位于index的元素,并返回删除元素e --- 删除最后元素为O(1), 其余为O(n)
  2. //删除最后元素 list.remove(list.size() - 1);

(6)subList

  1. subList(int from, int to) // 相当于返回原数组的一个片段,但不要对其进行改动,改动会影响原数组 --- O(1)
  2. // List<Integer> list, 对原来的list和返回的list做的“非结构性修改”(non-structural changes),
  3. //都会影响到彼此对方. 如果你在调用了sublist返回了子list之后,如果修改了原list的大小,那么之前产生的子list将会失效,变得不可使用

2、Set集合

Set是一种没有重复元素的集合,常用的实现是HashSet

(1)实例化及传参

  1. Set<Integer> set = new HashSet<>();
  2. List<Integer> list = new ArrayList<>();
  3. Set<Integer> set = new HashSet<>(list);

(2)add

add(E e);    // 在集合中添加元素E e, 若成功添加则返回true,若集合中有元素e则返回false --- O(1)

 (3)remove

remove(E e);    // 在集合中删除元素e,若删除成功返回true;若集合中没有元素e,返回false --- O(1)

(4)contains

contains(E e);    // 若存在元素e,则返回true,否则返回false --- O(1)

(6)isEmpty

isEmpty()    // 若集合为空返回true, 否则返回false --- O(1)

(7)first()、last()

也就是TreeSet类中有这个两个方法。

  1. //first()、last(),返回有序集合中第一个元素,最后一个元素
  2. // Creating an empty TreeSet
  3. TreeSet<Integer> tree = new TreeSet<Integer>();
  4. // Use add() method to add elements into the Set
  5. tree.add(14);
  6. tree.add(8);
  7. tree.add(200);
  8. tree.add(48);
  9. tree.add(7);
  10. tree.add(124);
  11. // Displaying the TreeSet
  12. System.out.println("TreeSet: " + tree);
  13. // Displaying the highest element of the set
  14. System.out.println("The last element is: " + tree.last());

3、Map映射

(1)实例化

Map<Characters, Integer> map = new HashMap<>();

(3)put

put(K key, V value);    // 在Map中加入键值对<key, value>。返回value值。如果Map中有key,则replace旧的value --- O(1)

 (4)get

get(K key);    // 返回Map中key对应的value。若Map中没有该key,则返回null --- O(1)

 (5)getOrDefault

  1. getOrDefault(K key, V defaultValue); // 返回Map中key对应的value。若Map中没有该key,则返回defaultValue --- O(1)
  2. // For example:
  3. // Map<Character, Integer> map = new HashMap<>();
  4. // if (...) // 如果发现k,则k在Map中的值加1。没一开始没有k,则从0开始加1。(相当于给了key在Map中的一个初试值)
  5. map.put('k', map.getOrDefault('k', 0) + 1);

 (6)containsKey

  1. containsKey(Key key); // 在Map中若存在key,则返回true,否则返回false --- O(1)
  2. get(x) == null // 可以代替改用法

(7)keySet

  1. keySet(); // 返回一个Set,这个Set中包含Map中所有的Key --- O(1)
  2. // For example:
  3. // We want to get all keys in Map
  4. // Map<Character, Integer> map = new HashMap<>();
  5. for (Character key : map.keySet()) {
  6. // Operate with each key
  7. }

(8)values

  1. values(); // 返回一个Collection<v>,里面全是对应的每一个value --- O(1)
  2. // For example:
  3. // We want to get all values in Map
  4. // Map<Character, Integer> map = new HashMap<>();
  5. for (Integer value : map.values()) {
  6. // Operate with each values
  7. }

(9)isEmpty

isEmpty()    // 若Map为空返回true, 否则返回false --- O(1)

(10)size

size()    // 返回Map中中键值对<K, V>的个数 --- O(1)

4、栈(Stack、Deque)

java中定义了Stack类,仅仅实现有栈的操作。另外,Deque不仅有队列(双向队列,普通队列)的特性,也可以作为栈,用法同Stack类,方法也相同。

  1. Stack<Integer> stack = new Stack<>(); //Stack类
  2. Deque<Integer> stack = new LinkedList<>(); //Deque接口,LinkedList是Deque的一个实现类
  3. push(E e); // 入栈元素e, 返回值为元素e --- O(1)
  4. pop(); // 出栈一个元素,返回出栈元素e --- O(1)
  5. peek(); // 查看栈顶元素, 返回值为栈顶元素e --- O(1)
  6. isEmpty() // 若栈空返回true, 否则返回false --- O(1)
  7. size() // 返回栈中元素个数 --- O(1)

5、单向队列(Queue)

Queue为接口,实现类是LinkedList,特性是先进先出。

  1. Queue<Integer> q = new LinkedList<>(); //实例化
  2. offer(E e); // 队尾加入元素e。 若成功入队返回值true,否则返回false --- O(1)
  3. poll(); // 出队头,返回出队元素e --- O(1)
  4. peek(); // 查看队头元素, 返回值队首元素e --- O(1)
  5. isEmpty() // 若队空返回true, 否则返回false --- O(1)
  6. size() // 返回队中元素个数 --- O(1)

6、双向队列(Duque)

Queue有一个子接口Dueue,即双向队列,和单向队列不同,它的出队入队可以从两个方向。

  1. Dueue<Integer> q = new LinkedList<>(); //实例化
  2. offFirst(Object e) // 将指定元素添加到双端队列的头部 --- O(1)
  3. offLast(Object e) //将指定元素添加到双端队列的尾部 --- O(1)
  4. pollFirst() //获取并删除双端队列的第一个元素 --- O(1)
  5. pollLast() //获取并删除双端队列的最后一个元素 --- O(1)
  6. peekFirst() //获取但不删除双端队列的第一个元素 --- O(1)
  7. peekLast() //获取但不删除双端队列的最后一个元素 --- O(1)
  8. isEmpty() //非空返回true,否则返回false
  9. size() //队列中元素个数

7、优先队列(PriorityQueue)

优先队列是一种比较特殊的队列,保存队列元素的顺序不是按照元素添加的顺序来保存的,而是在添加元素的时候对元素的大小排序后再保存。PriorityQueue对元素采用的是堆排序,头是按指定排序方式的最小元素。堆排序只能保证根是最大(最小),整个堆并不是有序的。

所以在队头的元素不是按照先后顺序,而是按照大小顺序。

在Java中的实现是PriorityQueue,底层是一棵树, 以小根堆为例。对于任意结点来说,该节点的值比其左右子节点的值都要小。 (就是最上面的结点最小)。 大根堆类似,最上面结点最大

  1. //小根堆
  2. Queue<Integer> minH = new PriorityQueue<>(); // 小根堆,默认大小为11 相当于 new PriorityQueue<>(11)
  3. Queue<Integer> minH = new PriorityQueue<>(100); // 定义一个默认容量有100的小根堆。在当中增加元素会扩容,只是开始指定大小。不是size,是capacity
  4. //大根堆Queue<Integer> maxH = new PriorityQueue<>((i1, i2) -> i2 - i1); // 大根堆,默认大小为11 相当于 new PriorityQueue<>(11, (i1, i2) -> i2 - i1)
  5. Queue<Integer> maxH = new PriorityQueue<>(100, (i1, i2) -> i2 - i1); // 定义一个默认容量有100的大根堆。在当中增加元素会扩容,只是开始指定大小
  6. //for example
  7. // 默认实现了一个最小堆。
  8. PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
  9. //最大堆
  10. PriorityQueue<Integer> maxheap = new PriorityQueue<>(Collections.reverseOrder());
  11. // 自定义实现最小/最大(o1-o2,升序)(o2-o1,降序)
  12. PriorityQueue<ListNode> priorityQueue = new PriorityQueue<ListNode>(100,new Comparator<ListNode>(){
  13. @Override
  14. public int compare(ListNode o1, ListNode o2) {
  15. return o2.val-o1.val;
  16. }
  17. });
  18. offer(E e); // 在堆中加入元素e,并调整堆。若成功入堆返回值true,否则返回false --- O(logN)
  19. poll(); // 弹出堆顶元素,并重新调整堆,返回出队元素e --- O(logN)
  20. peek(); // 查看堆顶元素, 返回值堆顶元素e --- O(1)
  21. isEmpty(); //判断队列是否为空
  22. size(); //队列中元素数量
  23. //for example
  24. PriorityQueue<Integer> pq = new PriorityQueue();
  25. pq.offer(50);
  26. pq.offer(2);
  27. pq.offer(1);
  28. pq.offer(10);
  29. pq.offer(18);
  30. for(Integer temp:pq){
  31. System.out.println(temp);
  32. }
  33. //输出:默认最下堆,能够保证根元素最小
  34. 1
  35. 10
  36. 2
  37. 50
  38. 18
  39. PriorityQueue<Integer> pq = new PriorityQueue(Collections.reverseOrder());
  40. pq.offer(50);
  41. pq.offer(2);
  42. pq.offer(1);
  43. pq.offer(10);
  44. pq.offer(18);
  45. for(Integer temp:pq){
  46. System.out.println(temp);
  47. }
  48. //输出:改成了最大堆,保证根元素为最大
  49. 50
  50. 18
  51. 1
  52. 2
  53. 10

如果搞不清楚,自然排序和定制排序过程中,(o1-o2,o2-o1)升序及降序问题,可以参考:

https://blog.csdn.net/ljrsunshine/article/details/107362206

4、工具类

1、java.util.Math:主要包含数学内的应用方法

(1)Math.abs(参数)

作用:返回参数的绝对值

参数可以是 int,float,long,double等类型,返回值类型同参数类型。(参数也可以是short,byte,但是返回类型会转成int)

Math.abs(double a);   

(2)Math.max(参数1,参数2),Math.min(参数1,参数2)

作用:返回两个参数的最大值,最小值。

参数可以是 int,float,long,double等类型,返回值类型同参数类型。(参数也可以是short,byte,但是返回类型会转成int)

  1. Math.max(long a, long b); //返回两个参数中较大的值
  2. Math.min(long a, long b); //返回两个参数中较小的值

(3)Math.sqrt(参数)、Math.cbrt(参数)

作用:开平方,开立方

参数可以是 int,float,long,double,short,byte等类型,返回值类型为double。

  1. Math.sqrt(long a) //开平方
  2. Math.cbrt(long b) //开立方

(4)Math.pow(参数1,参数2)

作用:返回参数1的参数2次方。

参数可以是 int,float,long,double,short,byte等类型,返回值类型为double。

Math.pow(double a, double b)

(5)Math.ceil(参数)

作用:对浮点数向上取整。

参数可以是 int,float,long,double,short,byte等类型,返回值类型为double。

Math.ceil(double a)

(6)Math.floor(参数)

作用:对浮点数向下取整。

参数可以是 int,float,long,double,short,byte等类型,返回值类型为double。

Math.floor(double a)

 (7)Math.round(参数)

作用:对浮点数四舍五入。

参数可以是 int,float,long,double,short,byte等类型,返回值类型为int或者long。

Math.round(double a)

(8)Math.log(参数),Math.log10(参数)

作用:取对数。

参数可以是 int,float,long,double,short,byte等类型,返回值类型为double。

  1. Math.log(double a) //以e为底取对数
  2. Math.log10(double b) //以10为底取对数

 那么,以m为底取N的对数该如何求呢?

  1. //注意:logmN:以m为底取N的对数。
  2. Math.log(8)/Math.log(2); //该代码意为:以2为底取8的对数为:3。

(9)Math.random()

作用:返回一个随机数,随机数范围为[0,1),左闭右开。返回值类型为double。

2、java.util.Arrays:主要包含了操作数组的各种方法。

(1)Arrays.toString(arr)

作用:返回字符串,便于打印数组内容

  1. String str = Arrays.toString(arr); // Arrays类的toString()方法能将数组中的内容全部打印出来
  2. System.out.print(str);

(2)Arrays.sort(arr,fromIndex,toIndex)

作用:数组升序

  1. int[] a = new int[]{1,4,2,3,5};
  2. Arrays.sort(a,0,5);//默认对全部元素升序,对下标0到下标为5-1的5个元素进行排序。

(3)Arrays.sort(arr,fromIndex,toIndex,Collections.reverseOrder())

作用:数组降序

Arrays.sort(a,1,3,Collections.reverseOrder());

 (4)Arrays.equals()

作用:比较数组元素

  1. int[] arr1 = {1,2,3};
  2. int[] arr2 = {1,2,3};
  3. System.out.println(Arrays.equals(arr1,arr2)); //输出:true
  4. //如果是arr1.equals(arr2),则返回false,因为equals比较的是两个对象的地址,不是里面的数,而Arrays.equals重写了equals,所以,这里能比较元素是否相等。

(5)Arrays.copeOf() 和Arrays.copeOfRange() 

作用:截取数组,传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。

  1. int[] arr = {10,20,30,40,50};
  2. int[] arr1 = Arrays.copyOf(arr, 3);
  3. String str = Arrays.toString(arr1); // Arrays类的toString()方法能将数组中的内容全部打印出来
  4. System.out.print(str);
  5. //输出:[10, 20, 30] (截取arr数组的3个元素赋值给新数组arr1)
  6. int []arr = {10,20,30,40,50};
  7. int []arr1 = Arrays.copyOfRange(arr,1,3);
  8. String str = Arrays.toString(arr1); // Arrays类的toString()方法能将数组中的内容全部打印出来
  9. System.out.print(str);
  10. //输出:[20, 30] (从第1位(index=0开始)截取到第3位(不包括)

3、java.util.Collections:主要对集合进行操作

(1)Collections.sort()

作用:升序/降序

Arrays.sort()、Collections.sort()有关升序降序的应用,见链接:https://blog.csdn.net/King_wq_2020/article/details/118911582

5、基本类型的最大值与最小值

数字类型包装类都支持两个常量:MAX_VALUE,MIN_VALUE 分别保存了对应基本类型的最大值与最小值。

  1. fmax = Float.MAX_VALUE;
  2. fmin = Float.MIN_VALUE;
  3. dmax = Double.MAX_VALUE;
  4. dmin = Double.MIN_VALUE;
  5. bmax = Byte.MAX_VALUE;
  6. bmin = Byte.MIN_VALUE;
  7. cmax = Character.MAX_VALUE;
  8. cmin = Character.MIN_VALUE;
  9. shmax = Short.MAX_VALUE;
  10. shmin = Short.MIN_VALUE;
  11. imax = Integer.MAX_VALUE;
  12. imin = Integer.MIN_VALUE;
  13. lmax = Long.MAX_VALUE;
  14. lmin = Long.MIN_VALUE;

参考链接1:https://blog.csdn.net/sinat_40770656/article/details/118772581

参考链接2:https://www.cnblogs.com/HOI-Yzy/p/14407021.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/935549
推荐阅读
相关标签
  

闽ICP备14008679号