贵州省建设厅的网站,广州达美网站建设公司,网站验收技术指标,深圳南头高端网站建设八. 核心类库
1. ArrayList
数组缺点
ArrayList#xff0c;它常常被用来替代数组
数组的缺点#xff1a;不能自动扩容#xff0c;比如已经创建了大小为 5 的数组#xff0c;再想放入一个元素#xff0c;就放不下了#xff0c;需要创建更大的数组#xff0c;还得把旧…八. 核心类库
1. ArrayList
数组缺点
ArrayList它常常被用来替代数组
数组的缺点不能自动扩容比如已经创建了大小为 5 的数组再想放入一个元素就放不下了需要创建更大的数组还得把旧数组的元素迁移过去。
自己来做比较麻烦
public class TestArray {public static void main(String[] args) {String[] arr0 new String[]{a, b, c, d, e};String[] arr1 new String[6];for (int i 0; i arr0.length; i) {arr1[i] arr0[i];}arr1[5] f;System.out.println(Arrays.toString(arr0));System.out.println(Arrays.toString(arr1));}
}想看数组内所有元素循环遍历依次打印是一个办法用 Arrays.toString 方法是更简单的办法
ArrayList 自动扩容
这时可以使用 ArrayList 来替代 String[]它的内部仍然是数组只是封装了更多实用的逻辑
ArrayList list new ArrayList(5); // 指定初始容量为 5, 如果不指定默认是 10
list.add(a);
list.add(b);
list.add(c);
list.add(d);
list.add(e);// 不用担心容量不够, 它内部封装了扩容的逻辑, 每次按原来容量的 1.5 扩容, 向下取整, 如 5-7-10
list.add(f);
System.out.println(list);ArrayList 每次扩容后会预留一些空位避免了频繁扩容封装带来的问题是看不到内部的结构没关系可以使用 debug 工具来调试
Debug 调试
前面说了ArrayList 封装了扩容逻辑这对使用者当然是一件好事就像我们平时使用家用电器似的不需要知道这些电器内部如何工作只需要会按它们对外的几个开关、按钮就足够了。像这个 ArrayList我们只需要会创建对象调用它的add方法就够用了不需要看它内部结构
不过呢有利必然有弊比如你想观察验证它的扩容规则是不是真的是如我所说的 1.5 倍封装就会带来障碍。这里交给大家一招深入对象内部探究它组成结构的好办法debug 调试。
debug 的第一步要添加断点所谓断点就是让代码运行到断点处先停下来不要向下走了这样就能方便我们观察对象状态。在 18 行加一个断点然后记得用调试模式运行代码 要查看 list 的详情先按照下图进行选择查看方式 这样就可以观察 list 的内部结构了 ArrayList 遍历与泛型
List 的遍历有多种办法这里只介绍最简单的一种
for (Object e : list) {System.out.println(e);
}// 与之对比, 数组也能类似方式进行遍历
for (String s : arr0) {System.out.println(s);
}这种遍历称之为增强 for 循环
上例中的 list 是把元素当作 Object 加入到它的内部再取出来也会当作 Object有时候就会不方便
例如 list 里放的都是整数想做个累加
可以用泛型来限制元素的存取类型例如
ArrayListString 专门存取字符串类型元素ArrayListInteger 专门存取整数类型元素 List 中只能存引用类型不能直接存基本类型
例如
ArrayListInteger list new ArrayListInteger(5);
list.add(1);
list.add(2);
list.add(3);
list.add(4); // 按 Integer 存int sum 0;
for (Integer i : list) { // 按 Integer 取sum i;
}System.out.println(sum);其中等式右边的 String 可以简化为
List 接口 #mermaid-svg-BITzpDEAYIwUljze {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BITzpDEAYIwUljze .error-icon{fill:#552222;}#mermaid-svg-BITzpDEAYIwUljze .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BITzpDEAYIwUljze .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BITzpDEAYIwUljze .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BITzpDEAYIwUljze .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BITzpDEAYIwUljze .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BITzpDEAYIwUljze .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BITzpDEAYIwUljze .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BITzpDEAYIwUljze .marker.cross{stroke:#333333;}#mermaid-svg-BITzpDEAYIwUljze svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BITzpDEAYIwUljze g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-BITzpDEAYIwUljze g.classGroup text .title{font-weight:bolder;}#mermaid-svg-BITzpDEAYIwUljze .nodeLabel,#mermaid-svg-BITzpDEAYIwUljze .edgeLabel{color:#131300;}#mermaid-svg-BITzpDEAYIwUljze .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-BITzpDEAYIwUljze .label text{fill:#131300;}#mermaid-svg-BITzpDEAYIwUljze .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-BITzpDEAYIwUljze .classTitle{font-weight:bolder;}#mermaid-svg-BITzpDEAYIwUljze .node rect,#mermaid-svg-BITzpDEAYIwUljze .node circle,#mermaid-svg-BITzpDEAYIwUljze .node ellipse,#mermaid-svg-BITzpDEAYIwUljze .node polygon,#mermaid-svg-BITzpDEAYIwUljze .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BITzpDEAYIwUljze .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-BITzpDEAYIwUljze g.clickable{cursor:pointer;}#mermaid-svg-BITzpDEAYIwUljze g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-BITzpDEAYIwUljze g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-BITzpDEAYIwUljze .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-BITzpDEAYIwUljze .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-BITzpDEAYIwUljze .dashed-line{stroke-dasharray:3;}#mermaid-svg-BITzpDEAYIwUljze #compositionStart,#mermaid-svg-BITzpDEAYIwUljze .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze #compositionEnd,#mermaid-svg-BITzpDEAYIwUljze .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze #dependencyStart,#mermaid-svg-BITzpDEAYIwUljze .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze #dependencyStart,#mermaid-svg-BITzpDEAYIwUljze .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze #extensionStart,#mermaid-svg-BITzpDEAYIwUljze .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze #extensionEnd,#mermaid-svg-BITzpDEAYIwUljze .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze #aggregationStart,#mermaid-svg-BITzpDEAYIwUljze .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze #aggregationEnd,#mermaid-svg-BITzpDEAYIwUljze .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BITzpDEAYIwUljze .edgeTerminals{font-size:11px;}#mermaid-svg-BITzpDEAYIwUljze :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} «interface» Collection «interface» List ArrayList List12 ListN ArrayList 是 List 接口的一个实现类除它以外还有 List12 和 ListN 等实现类 List.of();Java 9 中引入的新特性的特点是一旦 list 中元素确定就不能再向 list 添加、移除元素
ListInteger list2 List.of(1, 2, 3, 4);
System.out.println(list2.getClass()); // class java.util.ImmutableCollections$ListNListInteger list3 List.of(1, 2);
System.out.println(list3.getClass()); // class java.util.ImmutableCollections$List12of 方法隐藏了内部实现细节对于使用者不需要关心对象的实际类型。 要是真想知道这个对象的类型是什么可以不可以用继承自 Object 的 getClass 方法获得对象的真正类型
2. HashMap
String[] 和 ArrayListString 都有一个缺点查找其中某个元素不高效例如
public static String find1(String value) {String[] array new String[]{小明, 小白, 小黑};for (String s : array) {if (s.equals(value)) {return s;}}return null;
}public static String find2(String value) {ListString list List.of(小明, 小白, 小黑);for (String s : list) {if (s.equals(value)) {return s;}}return null;
}可以想象如果集合大小为 n而要查找的元素是最后一个需要比较 n 次才能找到元素
Map #mermaid-svg-aQnY0yAUOPpgA4Ct {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .error-icon{fill:#552222;}#mermaid-svg-aQnY0yAUOPpgA4Ct .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aQnY0yAUOPpgA4Ct .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .marker.cross{stroke:#333333;}#mermaid-svg-aQnY0yAUOPpgA4Ct svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aQnY0yAUOPpgA4Ct .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .cluster-label text{fill:#333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .cluster-label span{color:#333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .label text,#mermaid-svg-aQnY0yAUOPpgA4Ct span{fill:#333;color:#333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .node rect,#mermaid-svg-aQnY0yAUOPpgA4Ct .node circle,#mermaid-svg-aQnY0yAUOPpgA4Ct .node ellipse,#mermaid-svg-aQnY0yAUOPpgA4Ct .node polygon,#mermaid-svg-aQnY0yAUOPpgA4Ct .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aQnY0yAUOPpgA4Ct .node .label{text-align:center;}#mermaid-svg-aQnY0yAUOPpgA4Ct .node.clickable{cursor:pointer;}#mermaid-svg-aQnY0yAUOPpgA4Ct .arrowheadPath{fill:#333333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aQnY0yAUOPpgA4Ct .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-aQnY0yAUOPpgA4Ct .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-aQnY0yAUOPpgA4Ct .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aQnY0yAUOPpgA4Ct .cluster text{fill:#333;}#mermaid-svg-aQnY0yAUOPpgA4Ct .cluster span{color:#333;}#mermaid-svg-aQnY0yAUOPpgA4Ct div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aQnY0yAUOPpgA4Ct :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} bright 小明 white 小白 black 小黑 什么是 Map 呢很简单它就是一组映射关系。
你看刚才的例子中是建立了数组索引和数据元素之间的映射关系根据索引快速找到元素。现在 map 也是一组映射关系只是把索引变得更有意义而已。用 bright 映射小明white 映射小白black 映射小黑前面的 bright、white、black 称之为 key key 需要唯一 后面这些称之为 value
代码如下
public static String find3(String key) {MapString, String map Map.of(bright, 小明,white, 小白,black, 小黑);return map.get(key);
}Map 需要掌握的点
可以用泛型限制 Map 中 key 和 value 的类型Map.of 用来创建不可变的 Map即初始时确定了有哪些 key 和 value之后就不能新增或删除了 根据 key 获取 value用 get(key) 方法 如果想创建可变的 Map用 new HashMap() 存入新的 keyvalue用 put(key, value) 方法 遍历 Map 也有多种方法这里介绍一种相对好用的
for (Map.EntryString, String e : map.entrySet()) {// e.getKey() 获取 key// e.getValue() 获取 value
}其中 Map.Entry 代表一对儿 keyvaluemap.entrySet() 方法来获取所有的 entry增put(key,value)删remove(key)改put(key,value)查get(key)e.getKey() 获取 keye.getValue() 获取 value