【java基础知识】集合类(含Collection类和Map类)
集合類
Collection<>
常用方法
Collection<String> c = new ArrayList<String>(); c.add("java"); c.add("hello"); c.add("my"); System.out.println(c); // [java, hello, my]System.out.println(c.size()); // 3c.remove("java");System.out.println(c); // [hello, my]System.out.println(c.contains("java")); // falsec.clear();System.out.println(c); // []遍歷
增強for循環(huán)
作用;方便遍歷 原理;內(nèi)置迭代器 推薦:只要遍歷的時候推薦使用
/* 格式; for(元素數(shù)據(jù)類型 變量名 : 數(shù)據(jù)或Collection集合){輸出變量名即可完成遍歷 } */ for (String i : l) {System.out.println(i); }三種遍歷方法
Iterator<Student> it = l.iterator(); while (it.hasNext()) {Student s = it.next();System.out.println(s.getName()); } for (int i = 0; i < l.size(); i++) {Student s = l.get(i);System.out.println(s.getName()); } for (Student s : l) {System.out.println(s.getName()); }List<>
有序,可重復(fù)
常用方法
List<String> l = new ArrayList<>(); l.add("add"); l.add("java"); // void add(int index, E element) l.add(1, "hello"); System.out.println(l); // [add, hello, java]// E remove(int index), E remove(Object o) l.remove(0); l.remove("java"); System.out.println(l); // [hello]// E set(int index, E element) l.set(0, "java"); System.out.println(l); // [java]// E get(int index) l.get(0); // java并發(fā)修改異常
ConcurrentModificationException
實際修改值和預(yù)期修改值不相等
解決方案:用for循環(huán)遍歷
for (int i = 0; i < l.size(); i++) {String s = l.get(i);System.out.println(s); }ArrayList<>
數(shù)組
// 用多態(tài)創(chuàng)建對象 Collection<String> c = new ArrayList<String>(); c.add("java"); c.add("hello"); System.out.println(c); // [java, hello]LinkedList<>
鏈表
LinkedList<String> c = new LinkedList<>();; c.add("hello"); c.add("world"); c.add("java"); System.out.println(c); // [hello, world, java]c.addFirst("first"); c.addLast("last"); System.out.println(c); // [first, hello, world, java, last]System.out.println(c.getFirst()); System.out.println(c.getLast()); c.removeFirst(); c.removeLast(); System.out.println(c); // [hello, world, java]ListIterator<>
extends List<>
常用方法:
正向遍歷
ListIterator<String> lit = l.listIterator(); while (lit.hasNext()) {String s = lit.next();System.out.println(s); }逆向遍歷
ListIterator<String> lit = l.listIterator(); while (lit.hasPrevious()) {String s = lit.previous();System.out.println(s); }add()不會造成并發(fā)修改異常,add方法里讓實際操作值和預(yù)期的相等
ListIterator<String> lit = l.listIterator(); while (lit.hasNext()) {String s = lit.next();if (s.equals("hello")) {lit.add("world");} } System.out.println(l); // [add, java, hello, world]Set<>
不包含重復(fù)元素,沒有索引,不能用for循環(huán)遍歷
Set<String> set = new HashSet<>(); set.add("java"); set.add("hello"); set.add("world"); set.add("java"); for (String s : set) {System.out.println(s); } /*輸出 HashSet不不保證迭代順序 java world hello 沒有出現(xiàn)兩個"java" */HashSet<>
為了使HashSet具有元素唯一性,要重寫equals()和hashCode()
@Override public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;if (age != student.age) return false;return name != null ? name.equals(student.name) : student.name == null; }@Override public int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result; }LinkedHashSet<>
保證迭代的有序性,同時具有唯一性
LinkedHashSet<String> lhs = new LinkedHashSet<>(); lhs.add("hello"); lhs.add("java"); lhs.add("world"); lhs.add("java");for (String s : lhs) {System.out.println(s); }/*hellojavaworld*/TreeSet<>
有序:元素按照一定的規(guī)則進行排序,有自然排序和比較器排序
沒有索引,不能用普通for循環(huán)遍歷
TreeSet<Integer> t = new TreeSet<>(); t.add(11); t.add(12); t.add(9); t.add(8); for (Integer i : t) {System.out.println(i); } //8 //9 //11 //12Comparable<>
比較器
public class Student implements Comparable<Student>{@Override public int compareTo(Object o) {// return 0; // 只返回第一個// return 1; // 按序返回 第二個比第一個大// return -1; // 倒序返回// 按年齡從大到小進行排序int num = this.age - s.age;return num; } // this 升前降后 升:從小到大用TreeSet<>帶參構(gòu)造
TreeSet<Student> t = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {int num = s1.getAge() - s2.getAge(); // s1 相當(dāng)于this,s2為上文sreturn num;} });一般要有主要條件和次要條件
三元運算符:如num==0?s1.getName().compareTo(s2.getName) : num
上述先判斷num是否等于0,true就返回s1.getName().compareTo(s2.getName),false就返回num,而compareTo按字母排序比較字符串
產(chǎn)生十個不重復(fù)隨機數(shù)并遍歷
Set<Integer> s = new HashSet<>(); Random r = new Random();while (s.size() < 10) {int i = r.nextInt(20) + 1;s.add(i); } for (Integer i :s) {System.out.println(i); }Map<>
基本功能
鍵有唯一性,重復(fù)的鍵就相當(dāng)于修改的操作
Map<String, String> map = new HashMap<>(); map.put("hello", "java"); map.put("hi", "mysql"); map.put("hello", "navicat"); System.out.println(map); // {hi=mysql, hello=navica}System.out.println(map.size()); // 2map.remove("hello");System.out.println(map); // {hi=mysql}System.out.println(map.containsKey("hi")); // trueSystem.out.println(map.containsValue("mysql")); // truemap.clear();System.out.println(map.isEmpty()); // true獲取功能
Map<String, String> map = new HashMap<>(); map.put("hello", "java"); map.put("hi", "mysql"); map.put("greet", "navicat");System.out.println(map.get("greet")); // navicat Set<String> ke = map.keySet(); for (String s : ke) {System.out.println(s); } /* 獲取鍵的集合 hi greet hello */ Collection<String> values = map.values(); for (String s1 : values) {System.out.println(s1); } /* 獲取值的集合 mysql navicat java */遍歷
// 1.獲取鍵的集合 Set<String> keySet = map.keySet(); // 2.遍歷每一個元素 for (String key : keySet) {// 3.根據(jù)鍵找到值String values = map.get(key);System.out.println(key + "," + values); } // 1.獲取鍵值對的集合 Set<Map.Entry<String, String>> entrySet = map.entrySet(); // 2.遍歷每一個鍵值對 for (Map.Entry<String, String> my : entrySet) {String key = my.getKey();String value = my.getValue();System.out.println(key + "," + value); }案例
1.HashMap<String, Student>案例
public static void main(String[] args) {HashMap<String, Student> hs = new HashMap<>();Student s1 = new Student("你", 10);Student s2 = new Student("它", 11);Student s3 = new Student("他", 15);Student s4 = new Student("我", 42);hs.put("daqi1", s1);hs.put("daqi2", s2);hs.put("daqi3", s3);hs.put("daqi4", s4);Set<String> keySet = hs.keySet();for (String key : keySet) {Student student = hs.get(key);System.out.println(key + "," + student.getName() + "," + student.getAge());}/*daqi3,他,15daqi4,我,42daqi1,你,10daqi2,它,11*/Set<Map.Entry<String, Student>> entrySet = hs.entrySet();for (Map.Entry<String, Student> me : entrySet) {String key = me.getKey();Student value = me.getValue();System.out.println(key + "," + value.getName() + "," + value.getAge());} }ps:上述如果將HasMap<…>改為HasMap<Student, String>,為了確保鍵的唯一性,要重寫equals和HasCode方法,用快捷鍵Alt + Insert快速生成即可
2.嵌套
ArrayList<HashMap<String, String>>
ArrayList<HashMap<String, String>> array = new ArrayList<>();HashMap<String, String> hm1 = new HashMap<>(); hm1.put("java", "mysql"); hm1.put("Navicat", "Tomcat"); array.add(hm1);HashMap<String, String> hm2 = new HashMap<>(); hm1.put("notion", "music"); hm1.put("math", "Chinese");array.add(hm2);for (HashMap<String, String> hm : array) {Set<String> keySet = hm.keySet();for (String key : keySet) {String value = hm.get(key);System.out.println(key + "," + value);} }3.統(tǒng)計字符串中每個字符出現(xiàn)的個數(shù)
public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請輸入字符串:");String line = sc.nextLine();HashMap<Character, Integer> hm = new HashMap<>();// TreeMap<Character, Integer> tm = new TreeMap<>(); // TreeMap 可以對鍵進行自然排序// 創(chuàng)建StringBuild來存儲字符串StringBuilder sb = new StringBuilder();// 遍歷字符串的每一個字符for (int i = 0; i < line.length(); i++) {char key = line.charAt(i);Integer value = hm.get(key);if (value == null) {hm.put(key, 1);} else {value++;hm.put(key, value);}}Set<Character> set = hm.keySet();for (Character key : set) {Integer value = hm.get(key);sb.append(key).append("(").append(value).append(")");}String s = sb.toString();System.out.println(s);}Collections類
集合操作的工具類,靜態(tài)方法,直接調(diào)用
常用方法
List<Integer> l = new ArrayList<>(); // 添加元素 l.add(10); l.add(39); l.add(49); l.add(100); l.add(49);Collections.sort(l); System.out.println(l); // [10, 39, 49, 49, 100]Collections.reverse(l); System.out.println(l); // [100, 49, 49, 39, 10]Collections.shuffle(l); // 隨機排序 System.out.println(l); // [49, 49, 100, 10, 39]總結(jié)
以上是生活随笔為你收集整理的【java基础知识】集合类(含Collection类和Map类)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从Https破解角度分析Https
- 下一篇: 防火墙 | ARP欺骗攻击