你有没有遇到过这种情况:程序写完了,功能都对,可一跑起来就卡得不行?尤其是数据一多,加载时间长得让人想关电脑。其实问题可能不在逻辑,而在“怎么存数据”上。这就是数据结构要解决的事。
为什么选Java讲数据结构?
Java是很多公司写后端的首选语言,语法清晰,自带工具多。更重要的是,它把常见的数据结构都封装好了,用起来方便,还能帮你避开空指针、越界这些坑。
数组和ArrayList:别再傻傻分不清
很多人写Java时直接上ArrayList,觉得比数组灵活。但你知道吗?数组是定长的,访问快;ArrayList底层还是数组,但它能自动扩容。
int[] arr = new int[5]; // 数组,长度固定
arr[0] = 10;
java.util.ArrayList<Integer> list = new java.util.ArrayList<>();
list.add(10); // 动态添加,不用管长度
如果你清楚数据量,用数组更快;如果不确定有多少条,ArrayList更省心。
链表不是用来“串门”的
链表适合频繁增删的场景。比如你做个待办清单,经常在中间插任务,用ArrayList每次插入都要挪后面所有元素,效率低。链表就不一样,改个“指针”就行。
java.util.LinkedList<String> todo = new java.util.LinkedList<>();
todo.add("买菜");
todo.add("交水电费");
todo.add(1, "取快递"); // 在中间插入,链表优势明显
队列:排队买奶茶的逻辑
想象一下奶茶店门口排长队,先来先买——这就是队列(FIFO)。Java里可以用LinkedList当队列用。
java.util.Queue<String> queue = new java.util.LinkedList<>();
queue.offer("小王");
queue.offer("小李");
System.out.println(queue.poll()); // 输出 小王
offer是排队,poll是买到离开。系统处理任务、消息推送,背后都是这套路。
栈:撤销操作背后的功臣
你在文档里打错字,按Ctrl+Z撤销,是不是特别顺滑?这靠的是“栈”(LIFO),最后输入的最先被撤回。
java.util.Stack<String> history = new java.util.Stack<>();
history.push("输入标题");
history.push("插入图片");
history.push("修改字体");
System.out.println(history.pop()); // 输出 修改字体
哈希表:找东西比翻抽屉快多了
你记不记得以前翻纸质通讯录,一个一个找名字有多烦?HashMap就像智能通讯录,名字一输,电话立马出来。
java.util.HashMap<String, String> phoneBook = new java.util.HashMap<>();
phoneBook.put("张三", "13800001111");
phoneBook.put("李四", "13800002222");
System.out.println(phoneBook.get("张三")); // 直接拿到号码
它的查找速度几乎是常数级的,特别适合做缓存、去重。
树结构:组织架构图的灵感来源
公司部门分层级,CEO下面几个总监,每个总监管几个经理——这种结构用树来表示最自然。二叉搜索树还能快速查找、插入。
虽然Java没直接提供通用树结构,但TreeMap和TreeSet底层就是红黑树,自动排序,查找效率高。
java.util.TreeSet<Integer> sortedSet = new java.util.TreeSet<>();
sortedSet.add(5);
sortedSet.add(2);
sortedSet.add(8);
System.out.println(sortedSet.first()); // 输出 2,最小值
当你需要有序又高效的集合时,它就很合适。