java集合基础练习题

List集合

.ArrayList,LinkedList,Vector三者的相同点与不同点?(“Vector”可百度)【面试题】

共同点:

他们都实现了List接口,意味着他们具有相同的基本操作,如添加、删除、获取元素

有序性和可重复性,他们都是有序的,即插入顺序和迭代顺序相同,都允许存储重复的元素

都可以动态调整大小

不同点:

底层数据结构

ArrayList是基于数组实现的,支持快速的随机访问,但插入和删除涉及元素移动,效率较低

LinkedList底层基于双向链表实现,插入和删除只需要改变相邻节点的引用,因此效率较高,但随机访问元素需要遍历链表,因此效率较低

Vector也基于动态数组实现,但它是线程安全的,因此在多线程环境下性能更好

性能差异:

ArrayList在随机访问和遍历方面表现较好

LinkedList在插入和删除方面表现较好,尤其是列表的开头或结尾

vector由于同步,通常比ArrayList慢。+,但多线程环境中提供线程安全

扩容策略不同:

ArrayList和vector都有容器概念,当添加元素超过当前容量时,会增长自己的存储容量。ArrayList的容量大概按照大约1.5倍的速率增长,vector可以通过构造函数指定增长率,默认是2倍

LinkedList由于其基于链表的实现,不涉及容量的概念

线程安全性不同:

ArrayList和LinkedList都不是线程安全的,如果需要线程安全可以使用Collection类中的静态方法来获取线程安全的容器

vector是线程安全的,效率不是很高

3.List 接口的常用方法有哪些?(增、删、改、查、插、长度、遍历等)

add(E e):
在列表的末尾添加一个元素。

add(int index, E element):
在列表的指定位置插入一个元素。

addAll(Collection<? extends E> c):
将指定集合中的所有元素添加到列表的末尾。

addAll(int index, Collection<? extends E> c):
将指定集合中的所有元素插入到列表的指定位置。

get(int index):
返回列表中指定位置的元素。

remove(int index):
移除列表中指定位置的元素。

remove(Object o):
移除列表中首次出现的指定元素(如果存在)。

contains(Object o):
检查列表中是否包含指定的元素。

indexOf(Object o):
返回列表中首次出现指定元素的索引,如果列表不包含该元素,则返回-1。

lastIndexOf(Object o):
返回列表中最后一次出现指定元素的索引,如果列表不包含该元素,则返回-1。

isEmpty():
检查列表是否为空。

size():
返回列表中的元素数量。

iterator():
返回一个迭代器,用于遍历列表中的元素。

listIterator():
返回一个列表迭代器,它允许以任何方向遍历列表、修改列表,并获取迭代器在列表中的当前位置。

listIterator(int index):
返回一个从指定位置开始的列表迭代器。

subList(int fromIndex, int toIndex):
返回列表中指定范围的视图(从fromIndex到toIndex,不包括toIndex)。

clear():
移除列表中的所有元素。

4.如何使用Iterator和增强for循环遍历List。举例说明

//iterator
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}

//增强for
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");

for (String item : list) {
    System.out.println(item);
}

已知有十六支男子足球队参加2008 北京奥运会。

写一个程序,把这16支球队随机分为4个组。采用List集合和随机数
 
2008 北京奥运会男足参赛国家: 

科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class workDemo1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("科特迪瓦");
        list.add("阿根廷");
        list.add("澳大利亚");
        list.add("塞尔维亚");
        list.add("荷兰");
        list.add("尼日利亚");
        list.add("日本");
        list.add("美国");
        list.add("中国");
        list.add("新西兰");
        list.add("巴西");
        list.add("比利时");
        list.add("韩国");
        list.add("喀麦隆");
        list.add("洪都拉斯");
        list.add("意大利");
        Random r = new Random();
        List<String> list1 = new ArrayList<>();
        for (int i = 0; i <4; i++) {
            System.out.println("这是第"+(i+1)+"组");
            for (int j = 0; j <4 ; j++) {
                int i1 = r.nextInt(list.size());
                String s = list.get(i1);
                list1.add(s);
                list.remove(s);
            }
            System.out.println(list1);
            list1.clear();
        }
        }
    }

 

写一个方法reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: 

  List list = new ArrayList(); 

  list.add(“Hello”); 

  list.add(“World”); 

  list.add(“Learn”); //此时list 为Hello World Learn 

  reverseList(list); //调用reverseList 方法之后,list 为Learn World Hello

 

import java.util.ArrayList;
import java.util.List;

public class WorkDemo2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("world");
        list.add("learn");
        System.out.println(list);
        reverseList(list);
    }

    private static void reverseList(List<String> list) {
        List<String> list1 = new ArrayList<>();
        for (int i= list.size()-1; i>=0; i--) {
            String s = list.get(i);
            list1.add(s);
        }
        System.out.println(list1);
    }
}

有如下Student 对象,

   private String name;  

    private int age;  

    private int score;  

    private String classNum; 

其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList();

list.add(new Student(“Tom”, 18, 100, “class05”));  

list.add(new Student(“Jerry”, 22, 70, “class04”)); 

list.add(new Student(“Owen”, 25, 90, “class05”)); 

list.add(new Student(“Jim”, 30,80 , “class05”)); 

list.add(new Student(“Steve”, 28, 66, “class06”));

list.add(new Student(“Kevin”, 24, 100, “class04”));

在这个list 的基础上,完成下列要求: 

//1) 计算所有学生的平均年龄

//2) 计算各个班级的平均分 

import java.util.ArrayList;
import java.util.List;

public class WorkDemo3 {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("Tom", 18, 100, "class05"));
        list.add(new Student("Jerry", 22, 70, "class04"));
        list.add(new Student("Owen", 25, 90, "class05"));
        list.add(new Student("Jim ", 30, 80, "class05"));
        list.add(new Student("Steve", 28, 66, "class06"));
        list.add(new Student("Kevin", 24, 100, "class04"));
        int numAge = 0;
        for (Student s : list) {
            numAge += s.getAge();
        }
        int ave1 = numAge / list.size();

        System.out.println(ave1);
        int sum4 = 0;
        int sum5 = 0;
        int sum6 = 0;
        int num4 = 0;
        int num5 = 0;
        int num6 = 0;
        for (Student s : list) {
            if (s.getClassNum() == "class04") {

                num4++;
                sum4 += s.getScore();
            }
            if (s.getClassNum() == "class05") {
                num5++;
                sum5 += s.getScore();
            }
            if (s.getClassNum() == "class06") {
                num6++;
                sum6 += s.getScore();
            }
        }
        System.out.println("class04班级的平均分为:" + sum4 / num4);
        System.out.println("class05班级的平均分为:" + sum5 / num5);
        System.out.println("class06班级的平均分为:" + sum6 / num6);
    }
}

Set集合

1.请说明set接口的特点?

无序,不重复,无索引

2.set接口的实现类有哪些?他们的底层实现是什么?分别有什么特点?

set接口的实现类有Hashset和Treeset

HashSet:

底层实现原理:哈希表(散列表)

特点:

1.对集合迭代次序不做保证,存储的元素是无序的

2.允许null元素

3.集合中元素不重复

TreeSet :

底层实现原理:二叉树

特点:

1.满足set接口的特点 无序不重复

2.存满的数据可排序

3.不能存储null

其实现本质是TreeMap

请将如下4个字符串数据["aaa","bbb","ccc","ddd"],依次添加到HashSet集合中,并遍历查看存储结果。(使用增强for循环遍历) 

package workDemo1;

import java.util.HashSet;

public class workDemo4 {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("aaa");
        set.add("bbb");
        set.add("ccc");
        set.add("ddd");
        for (String s:set){
            System.out.println(s);
        }
    }
}

//结果
aaa
ccc
bbb
ddd

进程已结束,退出代码0
 

 在List集合内去除重复数字值,要求尽量简单(可借助其他集合!!)

package workDemo1;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class workDemo5 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("11");
        list.add("10");
        list.add("12");
        list.add("11");
        list.add("13");
        list.add("10");
        list.add("15");
        System.out.println(list);

        Set<String> set = new HashSet<>();

        set.addAll(list);
       for (String s:set){

       }
        System.out.println(set);
    }
}

 2019年1月份的世界编程语言排行榜从高到低依次如下: Java、C、Python、C++、Visual Basic .NET、JavaScript... 请将以上语言名称作为字符串元素,按顺序存入set集合中,并遍历查看。要求存储和遍历的顺序保持一致。

import java.util.LinkedHashSet;

public class workDemo6 {
    public static void main(String[] args) {
        LinkedHashSet<String> set = new LinkedHashSet<>();
        set.add("Java");
        set.add("C");
        set.add("Python");
        set.add("C++、");
        set.add("Visual Basic .NET");
        set.add("JavaScript");
        for (String s:set){
            System.out.println(s);
        }
    }
}

 现有若干图书信息(包含名称title、作者author、定价price)需要存储到set集合中,保证集合中无重复元素,并遍历查看。可以认为所有信息都相同的图书为重复数据。

 

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class WorkDemo {
    public static void main(String[] args) {
        LinkedHashSet<Book> set = new LinkedHashSet<>();

        Book book1 = new Book("西游记", "吴承恩", "108");
        Book book2 = new Book("水浒传","施耐庵","121");
        Book book3 = new Book("红楼梦","曹雪芹","105");
        Book book4 = new Book("三国演义","罗贯中","132");
        Book book5 = new Book("西游记","吴承恩","108");
        set.add(book1);
        set.add(book2);
        set.add(book3);
        set.add(book4);
        set.add(book5);

        Iterator<Book> it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

    }
}

在某次考试中,学生的成绩信息如下(公有属性): 姓名(String) 年龄(int) 成绩(int): Tom 20 90; Jerry 22 95; John 20 100; Lily 22 100 ;Lucy 22 90; Kevin 22 90 请分别用Comparable和Comparator两个接口对以上同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序,成绩和年龄都一样,则按照姓名的字典顺序排序。

package workDemo3;

public class Student implements Comparable<Student> {
    String name;
    int age;
    int score;

    public Student() {
    }

    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }


    @Override
    public int compareTo(Student s) {
        int num=s.score-this.score;
       int num1= num==0?this.age-s.age:num;
       int num2= num==0?this.name.compareTo(s.name):num1;
        return num2;
    }
}

import java.util.TreeSet;

public class Test1 {
    public static void main(String[] args) {
        TreeSet<Student> set = new TreeSet<>() ;

        Student stu1 = new Student("Tom",20,90);
        Student stu2 = new Student("Jerry",22,90);
        Student stu3 = new Student("John",20,100);
        Student stu4 = new Student("Lily",22,100);
        Student stu5 = new Student("Lucy",22,95);
        Student stu6 = new Student("Kevin",22,90);
        set.add(stu1);
        set.add(stu2);
        set.add(stu3);
        set.add(stu4);
        set.add(stu5);
        set.add(stu6);
    for (Student s:set){
        System.out.println(s.getName()+","+s.getAge()+","+s.getScore());
    }
    }
}
    //需求:编写一个程序,获取10个1-20之间的随机数,要求随机数不能重复,并在控制台输出
    /*思路:
    1.创建Set集合对象
    2.创建随机数对象
    3.判断集合长度是不是小于10
      是:产生一个随机数添加到集合
      回到3继续
    4.遍历集合
     
  
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

public class SetDemo1 {
  
    public static void main(String[] args) {
        //HashSet不排序
      //  Set<Integer> set = new HashSet<Integer>();
        //TreeSet可排序
        Set<Integer> set = new TreeSet<>();
        Random r = new Random();
        while (set.size()<10){
            int num = r.nextInt(20)+1;
            set.add(num);
        }
        for (Integer i:set){
            System.out.println(i);
        }
    }
}
/*
  需求
  键盘录入一个字符串,要求统计字符中每个字符串出现的次数
  举例:键盘录入“aababcabcdabcde”在控制台输出“a(5)b(4)c(3)d(2)e(1)”

  思路
  1.键盘录入一个字符串
  2.创建HashMap集合,键是Character,值是Integer
  3.遍历字符串得到每一个字符
  4.得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值
       如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储
       如果返回值不是null,说明该字符在HashMap集合中不存在,把该值加1,然后重新存储该字符和对应的值
  5.遍历HashMap集合,得到键和值,按照要求进行拼接
  6.输出结果
   */
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class HashMapDemo1 {
   
   public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String line = sc.nextLine();

        //创建HashMap集合
        HashMap<Character, Integer> hm = new HashMap<Character, Integer>();

        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);
            }
        }
        StringBuilder sb = new StringBuilder();
        Set<Character> keySet = hm.keySet();
        for(Character key:keySet){
            Integer value = hm.get(key);
            sb.append(key).append("(").append(value).append(")");
        }
        String s = sb.toString();
        System.out.println(s);
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值