Java 数据结构
- 数组Arrays
- 列表Lists
- 集合Sets
- 映射Maps
## Java HashMap
HashMap存储健值对,无序。
```java
//初始化赋值
Map<Integer, String> map = Map.of(key1, value1,...,keyn, valuen);// 元素是对象,基本元素可使用对应包装类
//创建HashMap对象
HashMap<Integer, String> map = new HashMap<Integer, String>();
//方法
map.put(keyi, valuei);//添加元素
map.get(keyi);// 获取valuei
Java集合框架(Collection)
列表Lists
List概念
List是Java集合框架中的一个接口,代表一种动态的、功能丰富的对象容器。
List声明和初始化
// List 的声明和初始化 (通常使用实现类 ArrayList)
List<Integer> intList = new ArrayList<>(); // 初始为空
List特点
- 大小:动态可变。可根据需要自动扩容
- 元素类型:只存储对象(支持包装类),不能存储基本数据类型
- 打印输出:直接打印列表对象,输出元素内容
[a, b, c]
List实现-支持多态
ArrayList
特点:动态数组,可变大小
List<String> arrayList = new ArrayList<>()
LinkedList
List<Integer> LinkedList = new LinkedList<>()
List方法-功能丰富
size() // List大小
add(elem) // List尾部自动扩容
get(index) //获取指定位置元素
remove(elem) //移除指定元素
remove(index) //移除指定位置元素
contains(elem) //是否包含某元素,返回boolean
indexOf(elem) //获取int索引
subList(start, end)//获取子列表
interator() //获取迭代器
集合Sets
存储不重复的元素
HashSet:
特点: 无序集合,基于HashMap实现。
优点: 高效的查找和插入操作。O(1)
Set<String> hashSet = new HashSet<>();
方法
boolean contains(elem) //判断元素是否存在
add(elem) //添加元素
boolean remove(elem) //删除元素,成功true,失败false
int size() //元素数量
for-each // 增强for循环迭代HashSet
Set<Integer> treeSet = new TreeSet<>();
映射Maps
存储健值对
HashMap:
特点: 基于哈希表实现的键值对存储结构。
优点: 高效的查找、插入和删除操作。
Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();
Vector
栈 Stack
栈是一种线性数据结构,按照后进先出的顺序操作元素。栈是Vector的一个子类。
Stack<Integer> stack = new Stack<>();
栈定义方法
boolean empty()
Object peek() // 查看堆栈顶部的对象,并作为此函数的值返回该对象
Object pop() // 移除堆栈顶部的对象,并作为此函数的值返回该对象
Object push(Object element) // 把顶压入堆栈顶部
栈 Stack & 堆 Heap
- 基本类型变量个对象引用在栈中
- 多有对象实例和数组在堆中
- 每个线程都有自己的栈内存,所有线程共享堆内存
Java常见报错
1 Project JDK is not defined
Setup SDK > +Add SDK > JDK: Java Path (高级设置 > 环境变量)
2 List item
error: duplicate class: Main
程序只需要一个入口,即只有一个类包含main方法,其他类都是用于被main方法直接或间接调用的。
3 error: non-static method ‘xxx’ cannot be referenced from a static context
描述:在静态上下文中无法引用非静态方法
解决:Make the method static.
4 error: cannot find symbol
描述:无法找到符号
5 找不到或无法加载主类
java.lang.ClassNotFoundException
原因:查看该类是否有被编译成class文件
6 cannot be resolved 无法解析
cannot be resolved a type
无法解析为类型
原因:jar包缺失
解决:import导入对应包
7 MAVEN
Project build error: Non-parseable POM D:\xxx\xxx\pom.xml: expected START_TAG or END_TAG not TEXT (position: xxx)
原因:代码格式(空格)问题
解决:自动格式化 Ctrl+Shift+F
8 未设置系统全局属性 system property
Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set b the webdriver.chrome.driver system property:
解决方案:系统设置Chrome驱动文件的路径
将驱动放置对应目录下,并添加代码
System.setProperty("webdriver.chrome.driver", "xxx");
Exception in thread "main" java.lang.IllegalStateException: The driver executable does not exist
9 无法在静态方法中引入非静态成员
cannot make a static reference to non-static field
原因:在静态方法中,不能直接访问非静态成员(方法/变量)。因为,非静态变量依赖于对象存在,对象必须实例化后,变量才会在内存中存在。
解决方案:1)将变量改为静态的;2)先实例化对象,然后使用对象名.变量名
调用
10 不兼容的类型 incompatible types
public Map<Character, Integer> getFrequencyMap(List lst) {
for (String elem : lst) {
......
}
}
java: incompatible types: java.lang.Object cannot be converted to java.lang.String
原因:List默认返回Object
类
解决方案:
(1)将Object转换为String
String str = String.valueOf(obj);
String str = (String)(obj);
(2)使用String类
import ...
public class NaiveLetterFreqGuesser implements Guesser { // Java代码须在class类中
private final List<String> words; // 声明属性words,是一个String组成的List
public NaiveLetterFreqGuesser(String dictionaryFile) { words = FileUtils.readWords(dictionaryFile); } // 变量words读取文件
public Map<Character, Integer> getFrequencyMap() { // 构造方法
for (String elem : words) { // 使用全局属性words
......
}
}
public static void main(String[] args) { // run main 以执行代码
NaiveLetterFreqGuesser nlfg = NaiveLetterFreqGuesser(dictionary: "data/example.txt") // 定义类
System.out.println("list of words: " + nlfg.words); // 调用类的属性words
System.out.println("frequency map: " + nlfg.getFrequencyMap()); // 调用方法
}
}
11 类1不能强制转换为类2
class java.lang.Character cannot be cast to class java.lang.Integer
12 并发修改异常
for (int i = 0; i < guesses.size(); i ++) {
if (!(pattern.indexOf(guesses.get(i)) != -1)) {
for (String elem: lst) {
if (elem.indexOf(guesses.get(i)) != -1) {
lst.remove(elem);
}
}
}
}
报错:ConcurrentModificationException
分析:迭代的时候不允许迭代体的长度发生变化
13 java: 错误: 不支持发行版本 20
问题:设置的项目SDK与本地下载的java版本不符
解决:“File -> Project Structure”