集合的一些问题
HashMap和Hashtable的区别
* 1、HashMap中键和值允许null值,而Hashtable不允许键和值存在null
* 2、HashMap是线程不安全的,但是效率高;Hashtable是线程安全的,但是效率低
*
*
* List,Set,Map等接口是否都继承子Map接口
* Collection(接口)
* --List(接口)
* --ArrayList
* 底层数据结构是数组,查询快,增删慢
* 线程不安全,效率高
* --vector
* 底层数据结构是数组,查询快,增删慢
* 线程安全的,效率低
* --LinkedList
* 底层数据结构是链表(双链表),查询慢,增删快
* 线程不安全,效率高
*
* 如果你不知道选谁,使用ArrayList
* --Set(接口)
* --HashSet
* 底层数据结构是哈希表,保证元素唯一
* --LinkedHashSet
* 底层数据结构是哈希表和链表(双链表)
* 哈希表和链表共同保证有序和唯一
* --TreeSet
* 底层数据结构是红黑树
* 排序的两种方式:都是在创建TreeSet对象的时候,构造方法调用
* 自然排序 类去实现接口
* 比较器排序 可以重写写个类实现,也可以用匿名内部类(推荐)
*
* Map(接口)
* --HashMap
* 底层数据结构是哈希表
* --LinkedHashMap
* 底层数据结构是哈希表和链表(双链表)
* 希表和链表共同保证有序和唯一
* --TreeMap
* 底层数据结构键是红黑树(键是红黑树结构,可以保证键的排序和唯一性)
* 排序的两种方式:都是在创建TreeSet对象的时候,构造方法调用
* 自然排序 类去实现接口
* 比较器排序 可以重写写个类实现,也可以用匿名内部类(推荐)
*/
1.在我有一个集合,请问我想判断里面有没有"world"这个元素,如果有,我们就添加一个"spark"?
Qusetion:并发修改异常:迭代器遍历元素的时候,集合不能修改元素
while (i.hasNext()){ Object next = i.next(); String s = (String) next; if("world".equals(s)){ //ConcurrentModificationException list.add("spark");
}
}
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ArrayLIstDemo6 { public static void main(String[] args) { List<String> lists=new ArrayList<>(); lists.add("hello"); lists.add("world"); lists.add("bigdata"); //集合遍历元素,集合修改元素 for(int i=0;i<lists.size();i++){ if("world".equals(lists.get(i))){ lists.add("spark"); } } System.out.println(lists);//[hello, world, bigdata, spark] //迭代器遍历元素,迭代器修改元素,这时候插入是在lt.next()索引 ListIterator<String> lt = lists.listIterator(); while (lt.hasNext()){ if("world".equals(lt.next())){ lt.add("spark"); } } System.out.println(lists);//[hello, world, spark, bigdata, spark] } }
2. 去除集合中字符串的重复值(字符串的内容相同),取出集合中对象重复值记得重写equals和hashCode方法
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class day16 { public static void main(String[] args) { List<String> list1=new ArrayList<>(); list1.add("hello"); list1.add("world"); list1.add("bigdata"); list1.add("spark"); list1.add("flink"); list1.add("hello"); list1.add("spark"); list1.add("hello"); // for(int i=0;i<list1.size();i++){ // for (int j=i+1;j<list1.size();j++){ // if(list1.get(i).equals(list1.get(j))){ // list1.remove(j);
j--; // } // } // } // System.out.println(list1); //[hello, world, bigdata, spark, flink]
List<String> list2=new ArrayList<>(); Iterator<String> it=list1.iterator(); while(it.hasNext()){ String s = it.next(); if(!list2.contains(s)){ list2.add(s); } } System.out.println(list2); //[hello, world, bigdata, spark, flink] } }
3.请用LinkedList模拟栈数据结构的集合,并测试
package com.shujia.day16; /* 请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 自己自定义一个集合类,在这个集合内部可以使用LinkedList模拟 */ import java.util.LinkedList; public class MyStack { private LinkedList list; MyStack(){ list=new LinkedList(); } public void add(Object o){ list.addFirst(o); } public Object get(){ return list.removeFirst(); } public Boolean isEmpty(){ return list.isEmpty(); } } class MyStackDemo{ public static void main(String[] args) { MyStack ms = new MyStack(); ms.add("11111"); ms.add(222222); ms.add(333333); while(!ms.isEmpty()){ System.out.println(ms.get()); } } }
4.数加有两个班级,每个班级5个人,用集合嵌套写出来,并遍历。迭代器遍历或者增强for循环
ublic class ArrayListDemo1 { public static void main(String[] args) { ArrayList<ArrayList<Student>> lists=new ArrayList<>(); ArrayList<Student> listss=new ArrayList<>(); Collections.addAll(listss,new Student("qqq",1), new Student("www",2), new Student("eee",3), new Student("rrr",4),new Student("ttt",5)); System.out.println(listss); ArrayList<Student> listsss = new ArrayList<>(); Collections.addAll(listsss,new Student("aaa",1), new Student("sss",2), new Student("ddd",3), new Student("fff",4),new Student("ggg",5)); lists.add(listsss); System.out.println(lists); for (Student student1 : listss) { System.out.println(student1); } System.out.println("-----------------"); for (ArrayList<Student> student1 : lists) { for (Student student2 :student1) { //注意这时是 student3 System.out.println(student2); } } } }
5."aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
package com.shujia.day18; /* aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1) * * 分析: * 1、定义一个字符串(可以改进用键盘录入) * 2、定义一个TreeMap * 键:Character * 值:Integer * 3、将字符串转换成字符数组 * 4、遍历字符数组,得到每一个字符 * 5、拿到字符作为键去集合中找值,看返回值 * 是null,说明该字符没有作为键存在,就把该字符作为键,value设置为1 * 不是null,说明该键存在,把value值加1,然后重新写回集合 * 6、定义一个StringBuilder作为拼接 * 7、遍历集合,得到键和值,按照a(5)b(4)c(3)d(2)e(1)要求拼接 * 8、把tringBuilder转换成String输出 * * 输入:aababcabcdabcde * 输出:a(5)b(4)c(3)d(2)e(1) */ import java.util.Arrays; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo2 { public static void main(String[] args) { String s="aababcabcdabcde"; TreeMap<Character, Integer> map = new TreeMap<>(); char[] chars = s.toCharArray(); for (char c : chars) { Integer i = map.get(c); if(i==null){ map.put(c,1); }else { i++; map.put(c,i); } } System.out.println(map); //{a=5, b=4, c=3, d=2, e=1} StringBuilder sb = new StringBuilder(); Set<Map.Entry<Character, Integer>> entries = map.entrySet(); for (Map.Entry<Character, Integer> entry : entries) { sb.append(entry.getKey()+"("+entry.getValue()+")"); } String s1 = sb.toString(); System.out.println(s1); //a(5)b(4)c(3)d(2)e(1) } }
6.利用HashSet对ArrayList集合去重(最终结果: ArrayList中没有重复元素)
public class Test5 { public static void main(String[] args) { List<String> lists=new ArrayList<>(); Collections.addAll(lists,"a","f","b","c","a","d"); HashSet<String> hs=new HashSet<>(); //创建HashSet.用于将ArrayList中重复的元素去除 hs.addAll(lists); //调用HashSet的addAll方法,将ArrayList中的元素添加到HashSet中 lists.clear(); //清空list的所有元素 lists.addAll(hs); //将set集合中的元素再添加回ArrayList集合 System.out.println(lists); } }