Java 基础知识

112 阅读5分钟

1. 基础语法

  1. 数组长度用.length,String的长度用 .length(),集合用.size()
  2. String取某个字符用.charAt(i)
  3. set集合转为数组的API: set.stream().mapToInt(x -> x).toArray();
  4. 由元素直接构成List操作 Arrays.asList(nums[i], nums[left], nums[right])
  5. 将一个数组或者List的各项通过分隔符连接成字符串,String.join(" ",s)
  6. List转为数组的示例:题目
  7. 保留两位小数String.format("%.2f", value).toString();
List<int[]> res = new ArrayList<>();
......
res.toArray(new int[res.size()][]);
  1. String的几个方法
    • String.copyValueOf(char[] data, int begin, int count) begin开始索引,count总长度
    • s.substring(int begin, int end)begin开始索引,end结束索引(不包括end),左闭右开

Lambda表达式

比较器Comparator的写法

Comparator接口中定义了一个抽象方法compare(T o1, T o2),它接受两个泛型类型的参数并返回一个int类型的值。在使用Lambda表达式来创建Comparator对象时,我们需要遵循以下的语法规则: (object1, object2) -> { return value; }
其中,object1和object2表示要比较的两个对象,箭头符号(->)后面的花括号内的语句用于比较两个对象并返回比较结果的int值。

以下是一个使用Lambda表达式来创建Comparator对象的示例:

List<String> list = Arrays.asList("apple", "banana", "orange");
Collections.sort(list, (str1, str2) -> str1.compareTo(str2));

注意:如果Lambda表达式中的语句块只有一行,则可以省略花括号和return语句。例如:
(x, y) -> x.compareTo(y)。

2. 集合

  1. List的三种遍历,常用增强for循环,普通for遍历List.
    基本方法 .add(), .get(i), .contains(), ;

image.png

  1. Set集合(不可放重复元素),因为没有索引,所以不能使用上面的方式三索引的方式来遍历。
    基本方法 返回boolean: .add(), .contains(), .remove();
    常用增强for循环遍历set

  2. Map集合。

    1. Map 中的 key 不允许重复,value 可以重复。
    2. 如果添加相同的key,则会覆盖原来的key-val,等同于修改.(key不会替换,val会替换)
    3. Map 的key 可以为 null, value 也可以为null,注意 key 为null只能有一个,value为null可以多个.
      基本方法 : 注意判断是否存在某键值对是用containsKey
      .put(k,v) 存 .get(k):根据键获取值 .size():获取元素个数 .containsKey(k):查找键是否存在

    遍历方式:常用的两种如下:

  • 第一种(k、v都取): 先用.keySet() 取出所有的k , 然后对keySet增强for循环,通过.get(k) 取出对应的v
    Set keyset = map.keySet();  
    for (Object key : keyset) 
        System.out.println(key + "-" + map.get(key));
  • 第二种(只取v):先用.values()把所有的v 取出,然后对values增强for
    Collection values = map.values(); 
    for (Object value : values) 
        System.out.println(value);

3. ArrayList 和 LinkedList 比较

image.png

  1. 访问元素:ArrayList支持随机访问,即可以通过索引值快速访问指定位置的元素,时间复杂度为O(1);而LinkedList需要遍历整个链表才能访问指定位置的元素,时间复杂度为O(n)。因此,如果需要频繁地访问元素,使用ArrayList更加高效。
  2. 添加和删除元素:ArrayList在末尾添加和删除元素的时间复杂度为O(1),但在中间插入和删除元素的时间复杂度为O(n)。而LinkedList在任意位置添加和删除元素的时间复杂度为O(1)。因此,如果需要频繁地在中间插入和删除元素,使用LinkedList更加高效。
  3. 反转操作。对于一个大小为n的List,使用Collections.reverse方法对ArrayList进行反转的时间复杂度为O(n),而对于LinkedList则为O(n^2)。这是因为LinkedList的每次访问都需要遍历整个链表,所以在反转一个LinkedList时,总共需要遍历n次,因此时间复杂度为O(n^2)。

因此,在需要对List进行反转操作时,如果使用的是ArrayList,通常会比LinkedList更快。但是,需要注意的是,在其他场景下,LinkedList可能会更适合,比如需要频繁插入或删除元素的场景。

4. 字符串

涉及到对字符串的拼接插入反转操作时,使用StringBuilder操作更方便且效率更高。 StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(str);
对sb的操作不需要sb = sb.append(x), 直接sb.append(x)。 因为String和StringBuilder都是引用类型,但

  • StringBuilder是可变的字符串,它不会创建当前字符串的新修改实例而是在现有字符串对象中进行修改
  • String是不可变字符串,一旦被初始化后就不能改变其内容,String值改变的过程其实是创建了一个新的String对象赋值给了原对象(引用的改变)

StringBuffer是线程安全的, 执行效率: StringBuilder > StringBuffer > String.Concat。

StringBuilder常用方法:

  • appendinsert方法是重载的,可以接受任何类型的数据。 sb.append(x)sb.insert(sb.length(), x)具有相同的效果。
  • toString() 转为String,String s = sb.toString();
  • reverse() 反转字符串,sb.reverse()

Java字符串比较(3种方法)

  • equals() 方法比较字符串对象中的字符。
  • ==运算符比较两个对象引用看它们是否引用相同的实例。
  • compareTo() 方法用于按字典顺序比较两个字符串的大小,该比较是基于字符串各个字符的 Unicode 值。

如果两个字符串调用 equals() 方法返回 true,那么调用 compareTo() 方法会返回 0。

5. 栈和队列

Deque是double ended queue,双端队列,可以在首尾插入或删除元素。
Deque根据不同的插入和删除方法可以实现队列和栈两种数据结构。

  • 栈的实现类一般用LinkedList。(push、pop、peek依旧可以用)

image.png

  • 队列的实现类一般用ArrayQueue。(offer、poll、peek依旧可以用)

image.png

  • 作为双端队列时,常用方法
    • offerFirst(): 向队头插入元素,如果插入成功返回true,否则返回false
    • offerLast(): 向队尾插入元素,如果插入成功返回true,否则返回false
    • pollFirst(): 返回并移除队头元素,如果队列无元素,则返回null
    • pollLast(): 返回并移除队尾元素,如果队列无元素,则返回null
    • peekFirst(): 获取队头元素但不移除,如果队列无元素,则返回null
    • peekLast(): 获取队尾元素但不移除,如果队列无元素,则返回null