再多学一点吧

导航

集合的一些问题

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);
    }
}

posted on 2021-08-09 19:56  糟糟张  阅读(59)  评论(0编辑  收藏  举报