当前位置: 首页 > article >正文

LeetCode 刷题【Java常用API与数据结构总结】(持续更新……)

  • 在Java中,可以使用关键字 "static" 和 "void" 来定义自定义函数。下面是一个简单的例子:
public class CustomFunctionExample {
    public static void main(String[] args) {
        int result = addNumbers(5, 3);
        System.out.println("The result is: " + result);
    }

    public static int addNumbers(int a, int b) {
        return a + b;
    }
}

        在这个例子中,我们定义了一个名为 "addNumbers" 的自定义函数,它接受两个整数参数并返回它们的和。在 "main" 函数中,我们调用了这个自定义函数并打印了结果。


  • 下面是一个使用Java自定义函数实现交换两个整数值的例子。
public class SwapExample {
    public static void main(String[] args) {
        int a = 5;
        int b = 10;

        System.out.println("Before swapping: a = " + a + ", b = " + b);
        
        swapValues(a, b);

        System.out.println("After swapping: a = " + a + ", b = " + b);
    }

    public static void swapValues(int x, int y) {
        int temp = x;
        x = y;
        y = temp;
    }
}

        在这个例子中,我们定义了一个名为 "swapValues" 的自定义函数,它接受两个整数参数并交换它们的值。然而,这个例子中的代码实际上并不会交换变量 "a" 和 "b" 的值,因为Java中的参数传递是按值传递的,所以在函数内部交换的只是参数的副本。要实现真正的交换,可以使用数组、对象引用或其他方式来实现。


  • 在Java中,可以使用Math类的abs方法来取负数的绝对值。示例如下:

int num = -5;
int absNum = Math.abs(num);
System.out.println("The absolute value of " + num + " is " + absNum);

运行结果:

The absolute value of -5 is 5

  • Java冒泡:
public static void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // swap arr[j+1] and arr[j]
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

  • 在Java中,取两个数的较小值可以使用Math类的min方法。示例如下:
int min = Math.min(num1, num2);

  • 在Java中,int类型的变量需要进行初始化赋值,否则会报编译错误。例如:

int num; // 这样会报编译错误
int num = 10; // 这样就正确初始化了

  • 在Java中,可以使用Math.pow方法来表示10的5次方。示例如下:

double result = Math.pow(10, 5); // 结果为100000.0

  • 你可以将double类型的结果强制转换为int类型。在这种情况下,小数部分将会被丢弃,只保留整数部分。示例如下:

double result = Math.pow(10, 5); 
int intValue = (int) result; // intValue的值为100000

  • 在Java中,1除以2的结果是0,因为1和2都是整数,所以在整数除法中,结果会被取整,即小数部分会被舍去。如果想要得到小数部分的结果,可以将1或2转换为浮点数,例如:
double result = 1.0 / 2;    //这样就可以得到0.5作为结果。

  • 一维数组定义:

        1、直接初始化数组并赋值:

int[] array = {1, 2, 3, 4, 5};

        2、使用 new 关键字分配内存空间并赋值:

int[] array = new int[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

        3、使用循环初始化数组:

int[] array = new int[5];
for (int i = 0; i < array.length; i++) {
    array[i] = i + 1;
}

        4、 使用静态初始化:

int[] array;
array = new int[]{1, 2, 3, 4, 5};

        这些方法都可以用来初始化一维数组,具体选择哪种方式取决于具体的需求和代码逻辑。 

  • 二维数组定义:
// 定义一个二维整型数组
int[][] array = new int[3][4];

// 定义并初始化一个二维字符串数组
String[][] names = {{"Alice", "Bob", "Carol"}, {"David", "Eve", "Frank"}};

  • 约瑟夫环问题:

        约瑟夫环问题是一个古老的数学问题,描述了一群人围成一个圆圈,然后按照一定的规则逐个被移除,直到只剩下一个人为止。这个问题被命名为约瑟夫环问题,来源于古代传说中的一个人名。

        例如:假设有10个人围成一圈,按照约瑟夫环问题的规则,每次数到第3个人就将其移除,然后从下一个人开始重新数。这样持续进行,直到只剩下一个人为止。


  • Java定义链表数据结构:

        在Java中,可以使用类来定义链表数据结构。下面是一个简单的链表节点类和链表类的示例:

// 链表节点类
class ListNode {
    int val;
    ListNode next;

    //构造函数
    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

// 链表类
class LinkedList {
    private ListNode head;

    //构造函数
    public LinkedList() {
        this.head = null;
    }

    // 在链表末尾添加一个节点
    public void addNode(int val) {
        ListNode newNode = new ListNode(val);
        if (head == null) {
            head = newNode;
        } else {
            ListNode current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    // 遍历链表并打印节点的值
    public void printList() {
        ListNode current = head;
        while (current != null) {
            System.out.print(current.val + " ");
            current = current.next;
        }
        System.out.println();
    }
}

        使用上面定义的链表类,可以创建一个链表并进行操作,例如:

public class Main {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.addNode(1);
        list.addNode(2);
        list.addNode(3);
        list.printList(); // 输出: 1 2 3
    }
}

        实际中则可能需要根据具体需求进行扩展和优化。


  • 在Java中,没有直接的指针概念,因为Java中的对象引用可以被认为是类似指针的东西。

        Java中的对象引用允许您访问对象的属性和方法,而不需要直接处理内存地址或指针。

        当您在Java中创建一个对象时,实际上是在堆内存中分配了一块空间,并返回了一个指向该对象的引用。您可以将这个引用赋给变量,然后通过该变量来访问对象的属性和方法。

        例如,假设有一个名为Person的类:

class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

        然后在主程序中创建一个Person对象并访问其属性:

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("Alice");
        System.out.println(person1.name); // 输出: Alice
    }
}

        在这个例子中,person1实际上是一个指向Person对象的引用,您可以通过这个引用来访问Person对象的属性。

        虽然Java中没有直接的指针概念,但是通过对象引用,您可以实现类似指针的操作。另外,Java中还有一些特殊的情况,比如使用unsafe类或者native方法来处理指针,但这些属于Java的高级特性,通常不建议在普通的应用程序中使用。


  • 在Java中,使用自定义构造函数需要加上new关键字,是因为在Java中,使用new关键字来创建对象实例。自定义构造函数用于初始化对象的属性和状态,当使用new关键字创建对象时,会调用自定义构造函数来完成对象的初始化工作。因此,为了创建对象并调用自定义构造函数,需要使用new关键字。例如:

public class MyClass {
    private int value;

    public MyClass(int value) {
        this.value = value;
    }

    public static void main(String[] args) {
        MyClass obj = new MyClass(10); // 使用new关键字创建对象并调用自定义构造函数
    }
}

  • LinkedList的使用:
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3
myLinkedList.get(1);              // 返回 2
myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3
myLinkedList.get(1);              // 返回 3

        这段代码是在创建一个自定义的链表数据结构 MyLinkedList,然后对其进行操作。具体来说,代码的功能包括:

  1. 创建一个空的链表 myLinkedList
  2. 在链表头部添加节点值为 1 的节点。
  3. 在链表尾部添加节点值为 3 的节点。
  4. 在索引为 1 的位置插入节点值为 2 的节点,使得链表变为 1->2->3。
  5. 获取索引为 1 的节点的值,应该返回 2。
  6. 删除索引为 1 的节点,使得链表变为 1->3。
  7. 再次获取索引为 1 的节点的值,应该返回 3。

        这段代码主要展示了如何使用自定义的链表数据结构进行添加、插入、删除和获取操作。


  • 当然,让我们举一个无法同时到达公共节点的例子。

        假设我们有两个链表A和B,它们分别是: A: 1 -> 2 -> 3 -> 4 -> 5 B: 6 -> 7 -> 8 -> 3 -> 4 -> 5

        在这个例子中,链表A和链表B的公共节点是3,4和5。如果我们直接从头开始遍历链表A和链表B,即使它们有相同的节点3,4和5,由于它们的起点不同,指针可能无法同时到达公共节点的位置。因此,如果我们不对齐两个链表的末尾,就无法保证同时到达公共节点的位置。


  • 模拟器是一种软件或硬件工具,用于模拟特定的硬件、软件或系统环境。它可以模拟不同的操作系统、设备或网络环境,使用户能够在虚拟环境中进行测试、开发或运行应用程序。模拟器可以用于游戏开发、移动应用测试、网络仿真等领域。

        常用的模拟器包括但不限于:

  1. Android 模拟器:用于在电脑上模拟 Android 手机环境,常见的有 Google 的 Android Studio 自带的模拟器、Genymotion、BlueStacks 等。

  2. iOS 模拟器:用于在 Mac 上模拟 iOS 设备环境,Xcode 自带的模拟器是最常用的。

  3. 游戏模拟器:用于在电脑或其他设备上模拟游戏机的运行环境,常见的有 Dolphin 模拟器(Wii 和 GameCube 游戏)、PCSX2(PlayStation 2 游戏)等。

  4. 网络模拟器:用于模拟网络环境,例如 GNS3、Cisco Packet Tracer 等。

  5. 虚拟机:虚拟机可以看作是一种广义上的模拟器,用于在一台计算机上模拟多台计算机的运行环境,最常见的虚拟机软件包括 VMware、VirtualBox、Hyper-V 等。


  • Java中Map的定义和使用:

        Map是Java中的一种数据结构,用于存储键值对。它是一个接口,有多种实现类,比如HashMap、TreeMap等。

        Map的定义如下:

Map<K, V> map = new HashMap<>(); // 创建一个HashMap实例

        其中,K是键的类型,V是值的类型。通过Map接口的实现类,可以实现不同的功能和特性。

        Map的常用方法包括:

  1. put(K key, V value):向Map中添加键值对
  2. get(Object key):根据键获取值
  3. remove(Object key):根据键移除键值对
  4. containsKey(Object key):判断是否包含指定的键
  5. containsValue(Object value):判断是否包含指定的值
  6. keySet():获取所有键的集合
  7. values():获取所有值的集合
  8. entrySet():获取所有键值对的集合

        下面是一个简单的Map使用示例:

Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 15);

System.out.println(map.get("apple")); // 输出10

map.remove("banana");
System.out.println(map.containsKey("banana")); // 输出false

for (String key : map.keySet()) {
    System.out.println(key + ": " + map.get(key));
}

        以上示例中,我们创建了一个HashMap实例,向其中添加了三组键值对,并通过get、remove、containsKey等方法进行操作。同时,通过keySet方法遍历了Map中的所有键值对。


  • 在Java中,要获取字符串的长度,可以使用以下API:

        length():返回字符串的长度

String str = "Hello";
int length = str.length(); // length = 5
  • 在Java中,要获取数组的长度,可以使用以下API:

        使用数组的length属性:通过数组的length属性可以获取数组的长度。

int[] arr = {1, 2, 3, 4, 5};
int length = arr.length;

        使用Array类的静态方法:通过Array类的静态方法可以获取数组的长度。

int[] arr = {1, 2, 3, 4, 5};
int length = Array.getLength(arr);

  • Java中关于字符数组的API

        在Java中,字符数组有许多常用的API可以用来操作和处理字符数组。以下是一些常用的字符数组API:

  1. length - 返回字符数组的长度
  2. clone() - 复制字符数组
  3. equals(Object obj) - 比较两个字符数组是否相等
  4. fill(char[] a, char val) - 用指定的值填充字符数组
  5. copyValueOf(char[] data) - 返回指定字符数组的字符串表示形式
  6. copyValueOf(char[] data, int offset, int count) - 返回指定字符数组的子数组的字符串表示形式
  7. toString() - 返回字符数组的字符串表示形式
  8. hashCode() - 返回字符数组的哈希码值
  9. sort(char[] a) - 对字符数组进行排序
  10. binarySearch(char[] a, char key) - 使用二分搜索算法在字符数组中查找指定字符的索引
  11. equals(char[] a, char[] a2) - 比较两个字符数组是否相等
  12. setAll(char[] array, IntToCharFunction generator) - 使用提供的生成器函数为字符数组设置所有元素的值
  13. parallelSetAll(char[] array, IntToCharFunction generator) - 并行使用提供的生成器函数为字符数组设置所有元素的值
  14. parallelSort(char[] a) - 并行对字符数组进行排序

        这些API可以帮助开发人员在处理和操作字符数组时更加方便和高效。

  • Java中关于字符串的API
  1. length() - 返回字符串的长度
  2. charAt(int index) - 返回字符串中指定位置的字符
  3. toUpperCase() - 将字符串转换为大写
  4. toLowerCase() - 将字符串转换为小写
  5. trim() - 去除字符串两端的空格
  6. equals(Object obj) - 比较字符串是否相等
  7. indexOf(String str) - 返回指定子字符串在字符串中第一次出现的位置
  8. lastIndexOf(String str) - 返回指定子字符串在字符串中最后一次出现的位置
  9. substring(int beginIndex, int endIndex) - 返回指定位置的子字符串
  10. replace(char oldChar, char newChar) - 将字符串中的指定字符替换为新字符
  11. split(String regex) - 根据指定的正则表达式分割字符串
  12. startsWith(String prefix) - 判断字符串是否以指定前缀开头
  13. endsWith(String suffix) - 判断字符串是否以指定后缀结尾
  14. contains(CharSequence s) - 判断字符串是否包含指定的字符序列
  15. compareTo(String anotherString) - 按字典顺序比较两个字符串
  16. isEmpty() - 判断字符串是否为空
  17. valueOf(Object obj) - 返回指定对象的字符串表示形式
  18. intern() - 返回字符串的规范化表示形式
  19. format(String format, Object... args) - 使用指定的格式字符串和参数返回一个格式化字符串
  20. matches(String regex) - 判断字符串是否匹配指定的正则表达式

        字符串API相关应用:

  • length():返回字符串的长度
String str = "Hello";
int length = str.length(); // length = 5
  • charAt(index):返回指定索引位置的字符
char ch = str.charAt(0); // ch = 'H'
  • substring(beginIndex, endIndex):返回指定索引范围内的子字符串
String sub = str.substring(1, 3); // sub = "el"
  • equals(Object obj):比较字符串内容是否相等
String str1 = "Hello";
String str2 = "hello";
boolean isEqual = str1.equals(str2); // isEqual = false
  • toUpperCase():将字符串转换为大写
String upperCaseStr = str.toUpperCase(); // upperCaseStr = "HELLO"
  • toLowerCase():将字符串转换为小写
String lowerCaseStr = str.toLowerCase(); // lowerCaseStr = "hello"
  • indexOf(String str):返回指定子字符串在当前字符串中第一次出现的索引
int index = str.indexOf("lo"); // index = 3
  • replace(char oldChar, char newChar):替换字符串中的字符
String replacedStr = str.replace('l', 'L'); // replacedStr = "HeLLo"

        以上是一些常用的字符串String的API,可以根据具体的需求选择合适的方法来操作字符串。


  • Java中set的特点:

        在 Java 中,Set 是一种集合类,它具有以下特点:

  1. 不允许重复元素:Set 中不允许包含重复的元素,如果试图向 Set 中添加已经存在的元素,添加操作将会失败。

  2. 无序性:Set 中的元素没有特定的顺序,即元素不是按照插入顺序或者其他规则来排序的。

  3. 使用对象的 equals() 方法来判断元素是否重复:在向 Set 中添加元素时,会使用元素的 equals() 方法来判断元素是否已经存在于 Set 中。

  4. 通常使用哈希表实现:在 Java 中,常用的 Set 实现类如 HashSet、LinkedHashSet 和 TreeSet 通常使用哈希表或者树来实现。

  5. 可以包含 null 元素:Set 可以包含一个 null 元素,但只能包含一个,因为 Set 不允许重复元素。

        总的来说,Set 是一种适合存储不重复元素且不需要特定顺序的集合类型。


  • 在Java中创建Set可以使用以下几种方式:

        1、使用HashSet:HashSet是基于哈希表实现的Set,它不保证元素的顺序,但是可以快速地进行插入、删除和查找操作。

        HashSet是基于哈希表实现的集合,它不保证元素的顺序,但是可以快速地进行插入、删除和查找操作。在使用HashSet时需要注意,它不允许重复元素,如果尝试向HashSet中添加重复元素,该元素将不会被添加到集合中。

Set<String> set = new HashSet<>();

        2、使用TreeSet:TreeSet是基于红黑树实现的Set,它可以保证元素的顺序是有序的。

Set<String> set = new TreeSet<>();

        3、使用LinkedHashSet:LinkedHashSet是基于哈希表和链表实现的Set,它可以保证元素的顺序是插入顺序。

Set<String> set = new LinkedHashSet<>();

        4、使用EnumSet:EnumSet是专门用于枚举类型的Set,它可以保证元素的顺序。


  • 在Java中,可以使用HashSet的toArray()方法将HashSet转换为数组。以下是示例代码:
import java.util.HashSet;

public class HashSetToArrayExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("orange");

        // 将HashSet转换为数组
        String[] array = set.toArray(new String[set.size()]);

        // 遍历数组
        for (String element : array) {
            System.out.println(element);
        }
    }
}

  • return commonNumSet.stream().mapToInt(Integer::valueOf).toArray();

    这行代码的作用是将一个存储整数的HashSet(commonNumSet)转换为整数类型的数组。让我们逐步解释这段代码:

    • commonNumSet.stream():这部分代码将HashSet转换为流(Stream),使我们可以对其进行操作。

    • mapToInt(Integer::valueOf):这部分代码使用mapToInt()方法将流中的元素映射为整数类型。在这里,我们使用Integer::valueOf方法引用,它将每个Integer对象转换为对应的int值。

    • toArray():最后,toArray()方法将流中的元素转换为一个整数类型的数组。

         因此,整个代码的作用是将HashSet中的整数转换为整数类型的数组。


  • 在Java中,可以使用HashSet的toArray()方法将HashSet转换为数组。以下是示例代码:

import java.util.HashSet;

public class HashSetToArrayExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("orange");

        // 将HashSet转换为数组
        String[] array = set.toArray(new String[set.size()]);

        // 遍历数组
        for (String element : array) {
            System.out.println(element);
        }
    }
}

        在上面的示例中,我们使用了toArray()方法将HashSet转换为数组。toArray()方法接受一个指定类型的数组作为参数,如果传入的数组大小不足以容纳HashSet中的所有元素,toArray()方法会创建一个新的数组。然后,我们可以对数组进行遍历或其他操作。


  • 在Java中,可以使用以下API来倒转字符串:

        使用StringBuilder或StringBuffer的reverse()方法:

String original = "Hello";
StringBuilder reversed = new StringBuilder(original).reverse();
System.out.println(reversed.toString()); // 输出 olleH

        使用toCharArray()和循环的方式:

String original = "Hello";
char[] charArray = original.toCharArray();
int i = 0;
int j = charArray.length - 1;
while (j > i) {
    char temp = charArray[i];
    charArray[i] = charArray[j];
    charArray[j] = temp;
    i++;
    j--;
}
String reversed = new String(charArray);
System.out.println(reversed); // 输出 olleH

  • 字符数组异或反转
//用异或运算反转
while(start < end){
    ch[start] ^= ch[end];
    ch[end] ^= ch[start];
    ch[start] ^= ch[end];
    start++;
    end--;
}

        异或运算是一种基本的位运算,它对两个操作数的对应位进行比较,并在相应位上产生一个新的结果。具体来说,对于两个位的异或运算,其规则如下:

  • 如果两个位的值相同,结果为0。
  • 如果两个位的值不同,结果为1。

         在这段代码中,通过对字符数组中的元素进行异或运算,实现了字符的反转。具体步骤如下:

        1、将ch[start]与ch[end]进行异或运算,结果存储在ch[start]中。这会将两个字符的对应位进行异或运算,实现了字符位置的交换。

        2、将ch[end]与ch[start]进行异或运算,结果存储在ch[end]中。这一步是为了撤销第一步的操作,以确保交换后的值正确存储在ch[end]中。

        3、将ch[start]与ch[end]进行异或运算,结果存储在ch[start]中。这一步是为了撤销第一步的操作,以确保交换后的值正确存储在ch[start]中。


StringBuffer res = new StringBuffer();

"StringBuffer res = new StringBuffer();" 这行代码的意思是创建了一个名为res的StringBuffer对象。StringBuffer是Java中用于处理字符串的可变对象,可以进行插入、追加、删除等操作,而且是线程安全的。在这行代码中,使用无参构造函数创建了一个空的StringBuffer对象,没有包含任何字符内容。可以通过后续的操作来向res对象中添加或修改字符串内容。


  • 泛型
List<List<Integer>>
  • List:表示一个列表,可以存储多个元素,并且有顺序。
  • <Integer>:表示这个列表中存储的元素类型是Integer,即整数类型。
  • List<List<Integer>>:表示一个列表,其中的每个元素都是一个列表,而且这些子列表中的元素都是整数类型。

        换句话说,"List<List<Integer>>" 表示一个列表,其中的每个元素都是一个整数类型的列表。这种数据结构通常用于表示二维数组或者矩阵。例如,可以用它来表示一个二维的整数数组,每个子列表代表数组的一行或一列。


  • 你可以使用以下方法向 "List<List<Integer>>" 中插入元素:

List<List<Integer>> listOfLists = new ArrayList<>();

// 创建一个子列表
List<Integer> sublist1 = new ArrayList<>();
sublist1.add(1);
sublist1.add(2);
sublist1.add(3);

// 将子列表添加到列表中
listOfLists.add(sublist1);

// 或者可以直接在列表中添加子列表
listOfLists.add(Arrays.asList(4, 5, 6));

// 输出整个列表
System.out.println(listOfLists);

        在上面的示例中,我们首先创建了一个 "List<List<Integer>>" 类型的列表,然后创建了两个子列表,并将它们添加到了主列表中。你也可以使用其他方法向列表中添加元素,比如使用add()方法或addAll()方法。

        为什么初始化用ArrayList?

        在Java中,通常使用ArrayList来初始化List接口的实例,而不是直接使用List接口。这是因为List是一个接口,而ArrayList是它的一个具体实现类,提供了丰富的方法和功能。因此,使用ArrayList作为初始化类型可以更方便地使用列表的各种方法和操作。

        另外,ArrayList具有动态数组的特性,可以根据需要自动调整大小,因此在大多数情况下都是一个很好的选择。如果你不确定使用哪种列表实现类,ArrayList通常是一个很好的默认选择。

        当然,如果你有特定的需求,也可以使用其他List接口的实现类,比如LinkedList等,这取决于你的具体需求和性能考虑。


  • 在Java中,可以使用Arrays.sort()方法对数组进行从小到大排序。具体方法如下:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] arr = {5, 3, 9, 1, 7};
        
        // 对数组进行排序
        Arrays.sort(arr);
        
        // 输出排序后的数组
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

  • 在Java中,lengthsize分别用于不同的数据类型和数据结构,它们的用法总结如下:

        length:

  • length是一个属性,用于获取数组的长度。
  • 只能用于数组,不能用于其他数据结构。
  • 用法示例:
int[] arr = {1, 2, 3, 4, 5};
int len = arr.length; // 获取数组的长度

        length( ):

  • 用于获取字符串String的长度。

        size( ):

  • size是一个方法,用于获取集合类(如List、Set等)的大小。
  • 用于集合类,不能用于数组。
  • 用法示例:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
int size = list.size(); // 获取集合的大小

  • 在Java中,可以使用long数据类型来存储大整数值。long数据类型可以存储的范围比int数据类型更大,它可以存储的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807。

        要声明一个long变量,可以使用关键字long,例如:

long myLongValue = 100000000000L;

        

        在进行数学运算时,如果涉及到long类型的变量,需要确保参与运算的所有变量都是long类型,否则结果可能会被自动转换为int类型,导致精度丢失。可以使用L后缀来确保数字被识别为long类型,例如:

long result = myLongValue * 2L;

        使用long数据类型时需要注意内存占用和数据范围,确保选择合适的数据类型来存储需要的数值。


  • 在Java中,可以将int赋值给long,因为int是小于等于long的数据类型。当将int赋给long时,Java会自动进行类型转换。例如:

int myIntValue = 100;
long myLongValue = myIntValue;

        在这个例子中,myIntValue是一个int类型的变量,而myLongValue是一个long类型的变量。当将myIntValue赋给myLongValue时,Java会自动将int类型转换为long类型,因为int可以被安全地转换为long。

        需要注意的是,如果将一个超出int范围的数值赋给long,需要在数值后面加上L后缀来确保它被识别为long类型。例如:

int myIntValue = 2147483647; // 最大的int值
long myLongValue = myIntValue; // 这里会报错,因为2147483647超出了int的范围
long myLongValue2 = 2147483647L; // 这里不会报错,因为2147483647后面加上了L后缀,被识别为long类型

        在这个例子中,myLongValue是一个long类型的变量,myIntValue是一个int类型的变量。当它们相加时,Java会将myIntValue提升为long类型,然后进行相加,结果会是一个long类型的值。

        总结:在Java中,long和int相加的结果会自动提升为long类型。


stack.push(Integer.valueOf(s));

          这行代码的意思是将字符串s转换为整数类型的对象,然后将其压入堆栈中。


  • StringBuffer和StringBuild的比较:

        StringBuffer和StringBuilder都是用来操作字符串的类,它们都提供了对字符串进行修改、连接、删除等操作的方法。它们的主要区别在于线程安全性和性能上。

        StringBuffer是线程安全的,所有的方法都是同步的,这意味着在多线程环境下使用StringBuffer是安全的。然而,这也导致了性能上的一些损失,因为同步操作会带来额外的开销。

        StringBuilder是非线程安全的,它的方法都不是同步的。这意味着在单线程环境下使用StringBuilder可以获得更好的性能,因为没有同步操作的开销。但在多线程环境下,需要自己来处理同步操作,否则可能会出现线程安全问题。

        因此,如果在单线程环境下需要高性能的字符串操作,可以选择使用StringBuilder;如果在多线程环境下需要线程安全的字符串操作,可以选择使用StringBuffer。


  • dump有多种意思,具体取决于上下文,以下是一些可能的含义:

  1. 名词,指垃圾堆或垃圾场,用于垃圾、废物等被丢弃的地方。
  2. 动词,指倾倒、倾斜或把东西扔掉。
  3. 在计算机领域中,dump可以指内存转储,即将内存中的数据保存到磁盘上。
  4. 在美国俚语中,dump还可以指一个令人不快或糟糕的地方或情况。

  • Java中的substring方法是左闭右开的。substring方法的参数是起始索引和结束索引,起始索引是包含在结果中的,而结束索引是不包含在结果中的。因此,substring方法返回的结果是从起始索引到结束索引之间的子字符串。


  • "setCharAt" 是 Java 中 StringBuilder 类的一个方法,用于将指定索引位置的字符替换为新的字符。例如,sb.setCharAt(2, 'a') 表示将 StringBuilder 对象 sb 中索引为 2 的位置的字符替换为 'a'。


StringBuilder sb = removeSpace(s);

         这行代码的意思是创建一个名为sb的StringBuilder对象,并将removeSpace(s)的返回值赋值给它。removeSpace(s)是一个函数,它的作用是去除字符串s中的空格,并返回一个新的字符串。因此,这行代码的作用是去除字符串s中的空格,并将处理后的结果存储在sb中。

        为什么使用StringBuilder?

        在Java中,通常建议使用StringBuilder来进行字符串的拼接操作,而不是直接使用"+"操作符或者String的拼接方法。这是因为在Java中,字符串是不可变的,每次进行字符串的拼接操作都会创建一个新的字符串对象,如果在循环中频繁进行字符串拼接操作,会导致大量的字符串对象的创建和销毁,从而降低性能。

        而使用StringBuilder可以避免这个问题,因为StringBuilder是可变的,它在内部维护一个可变长度的字符数组,可以高效地进行字符串的拼接操作。在循环中使用StringBuilder进行字符串的拼接可以减少对象的创建和销毁,提高性能。因此,建议在循环中进行字符串拼接操作时使用StringBuilder。


  • 在Java中,要增加Map中的value值,可以使用put()方法来实现。如果键已经存在于Map中,put()方法会更新键对应的值;如果键不存在,则会添加新的键值对。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 10); // 添加键值对
map.put("apple", map.get("apple") + 5); // 增加已有键的值

        在这个例子中,我们首先添加了一个键值对"apple"和10。然后,我们使用get()方法获取键"apple"对应的值,并将其增加5,然后再次使用put()方法将新的值存回Map中。

        这样就可以实现增加Map中value值的操作。


  • 要将初始化的Map中特定Key的Value自增1,可以使用get()方法获取特定Key对应的值,然后将其加1后再放回Map中。示例如下:

Map<String, Integer> map = new HashMap<>();
map.put("apple", 10); // 初始化Map

// 将特定Key的Value自增1
String key = "apple";
int value = map.get(key); // 获取特定Key的Value
map.put(key, value + 1); // 自增1后放回Map

        在这个示例中,我们首先初始化了一个Map,并且设置了键"apple"对应的值为10。然后,我们使用get()方法获取键"apple"对应的值,将其加1后再次使用put()方法将新的值存回Map中,这样就实现了特定Key的Value自增1的操作。 


  • 在Java中,可以使用循环遍历Map的键集合,并将每个键对应的值设置为0来初始化Map。示例如下:

Map<String, Integer> map = new HashMap<>();
Set<String> keys = map.keySet();
for (String key : keys) {
    map.put(key, 0);
}

        在这个示例中,我们首先创建了一个空的HashMap。然后,我们使用keySet()方法获取Map中所有的键,并通过循环遍历键集合,将每个键对应的值设置为0。

        另外,如果使用Java 8及以上版本,还可以使用forEach()方法和lambda表达式来初始化Map的值为0,示例如下:

Map<String, Integer> map = new HashMap<>();
map.keySet().forEach(key -> map.put(key, 0));

         这样就可以快速地将Map中所有值初始化为0。


String c = String.valueOf(ransomNote.charAt(i));

        这行代码的意思是将ransomNote字符串中第i个字符转换为字符串,然后赋值给变量c。

        具体来说,ransomNote.charAt(i)表示获取ransomNote字符串中索引为i的字符,然后String.valueOf()方法将这个字符转换为字符串。最后,将转换后的字符串赋值给变量c。


  • Java中栈和队列相关的使用及示例:

        栈(Stack)和队列(Queue)是常用的数据结构,它们在Java中有着广泛的应用。下面分别给出栈和队列的使用示例:

        栈的使用示例:

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        // 入栈
        stack.push(1);
        stack.push(2);
        stack.push(3);

        // 出栈
        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }
}

        队列的使用示例:

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // 入队
        queue.add("A");
        queue.add("B");
        queue.add("C");

        // 出队
        while (!queue.isEmpty()) {
            System.out.println(queue.poll());
        }
    }
}

        以上示例分别展示了栈和队列的基本操作,包括入栈/入队和出栈/出队操作。在实际开发中,栈和队列常常用于解决各种问题,比如深度优先搜索(DFS)和广度优先搜索(BFS)等算法中的应用。因此,掌握栈和队列的使用对于Java开发者来说是非常重要的。


  • 双端队列相关:

        双端队列(Deque)是Java中的一种数据结构,它允许在队列的两端进行插入和删除操作。Deque是"double ended queue"的缩写,它可以被用作栈(先进后出)和队列(先进先出)的数据结构。在Java中,Deque接口提供了双端队列的实现,包括ArrayDeque和LinkedList等。Deque接口提供了一系列方法来操作双端队列,包括插入、删除、获取元素等。通过使用Deque,程序可以更加灵活地处理队列和栈的操作。

        Java中Deque有关Api使用:

        1、创建Deque对象:

Deque<String> deque = new LinkedList<>();

        2、在队列头部插入元素:

deque.addFirst("first element");

        3、在队列尾部插入元素:

deque.addLast("last element");

        4、在队列头部删除元素:

String firstElement = deque.removeFirst();

        5、在队列尾部删除元素:

String lastElement = deque.removeLast();

        6、获取队列头部元素但不删除:

        (双端队列的头部指的是队列的开始位置,也就是队列的第一个元素的位置。在Java中,双端队列的头部可以通过方法 peekFirst() 来获取,它表示队列的第一个元素。)

String firstElement = deque.peekFirst();

        7、获取队列尾部元素但不删除:

String lastElement = deque.peekLast();

        8、获取队列头部元素并删除:

String firstElement = deque.pollFirst();

        9、获取队列尾部元素并删除:

String lastElement = deque.pollLast();

        10、获取队列的大小:

int size = deque.size();

        11、判断队列是否为空:

boolean isEmpty = deque.isEmpty();

        以上是一些常用的Deque相关的API使用,通过这些方法可以方便地对双端队列进行操作。


Deque<Character> deque = new LinkedList<>();

         这行代码表示创建了一个双端队列(Deque)的实例,该队列中存储的元素类型为 Character。实例化的具体实现是使用了 LinkedList 这个类来实现双端队列。LinkedList 是 Java 中的一个双向链表实现,它可以用来实现双端队列的功能。


  • 哈希结构包括:
  1. 数组(适用于元素的数量较小(类似桶排序))
  2. set(适用于元素的数量较大,且元素值过于分散)
  3. map(key、value结构下)


http://www.kler.cn/a/231447.html

相关文章:

  • 5.4.2-1 编写Java程序在HDFS上创建文件
  • 【JavaEE初阶 — 多线程】定时器的应用及模拟实现
  • web——upload-labs——第十二关——%00截断
  • 编程语言02:语法基础
  • Java连接MySQL(测试build path功能)
  • 【机器学习】聚类算法原理详解
  • 92.使用数组形式的责任链模式实现项目配置初始化
  • 深度学习(14)--x.view()详解
  • Kubernetes 是什么?
  • 【算法题】95. 不同的二叉搜索树 II
  • ChatPromptTemplate和AI Message的用法
  • C语言第二十弹---指针(四)
  • vue3-内置组件-KeepAlive
  • Android:IntentActivity,Service,BroadcastReceiver
  • FANUC机器人外部远程启动的相关参数设置示例
  • docker proxy 【docker 代理】
  • ChatGPT实战100例 - (14) 打造AI编程助手 Code Copilot
  • 相机图像质量研究(8)常见问题总结:光学结构对成像的影响--工厂调焦
  • BUGKU-WEB 留言板
  • 大数据环境搭建(一)-Hive
  • FFMPEG推流到B站直播
  • VRRP配置
  • 零基础学编程系列,从入门到精通,中文编程开发语言工具下载,编程构件容器件之控制面板构件用法
  • 多线程JUC:多线程的实现和常用成员方法(守护、礼让、插入线程)
  • 2024阿里云GPU服务器租用价格表(包月/按小时/学生价)
  • SpringBoot - 不加 @EnableCaching 标签也一样可以在 Redis 中存储缓存?