Java Se相关测试题(偏线程、集合)(简答、编程)含答案及详解

  • 一、选择、简答题
  • 二、编程题

(编程答案有很多思路,实现方式不同,如果有不同见解可打在评论区或私信)

一、选择、简答题

1、public class Test{    public static String stringReplace(String text) {return text.replace('j', 'L');}public static StringBuffer bufferReplace(StringBuffer text) {return text.append("c");}public static void main(String args[]) {String textString = new String("java");StringBuffer textBuffer = new StringBuffer("java");System.out.println(stringReplace(textString) + bufferReplace(textBuffer));System.out.println(textString + textBuffer);}}A、编译并运行输出Lava   javac      B、编译并运行输出java    javaC、编译并运行输出java    javac       D、编译并运行输出Lava   java

答案:AC
一共两行打印语句
第一行打印语句:是调用方法,将String字符串中J字母换成L字母,将StringBuffer字符串后添加一个c
第二行打印语句 :打印的是调用方法之后的字符串
考点:String字符串与StringBuffer字符串的区别

理解:String类底层是:final char[] value 是final修饰的,不可变的,所以当你操作String字符串后都会生成新的String字符串,而StringBuffer类底层:
char[] value 默认数组长度为16,当超过16,会在原数组上进行扩容。
所以当你操作StringBuffer字符串是在原来的基础上进行

2、下列说法正确的是?
A.List, Set, Map继承自Collection接口;
B.Error不可以声明抛出;
C.new Map();可以创建Map集合容器对象;
D.方法同步的同步监听对象默认是 this;
E.两个对象(x.equals(y) == true),但却可有不同的hashcode

此题较有争议,博主答案:D
A选项:Map不是继承于Collection接口
B选项:error和exception都能声明抛出(可以去开发工具中试试:throw new Error() )
C选项:Map是一个接口,接口不能直接new对象,只能通过new 实现类
或者函数式接口能够JDK1.8以前:匿名内部类 JDK1.8以后:lambda表达式
D选项:正确
有些人会认为静态方法的同步监听对象是当前类的字节码对象
博主认为这些人说得对,但是题目说的是方法,并没有说静态方法
E选项:重写了hashcode和equals方法后,如果equals相等,那么hashcode一定相等,但是hashcode相等,equals不一定相等(例如:aB和bC)

3、找出下列代码的问题所在.
A.  class Something {abstract String doSomething ();
}方法有abstract修饰的是抽象方法,一个类中有抽象方法,那么它必须是抽象类,所以类前面也得有abstract修饰B.  public class Something {public int addOne(final One x) {return  x.i++;}class One{int i;}}编译正常通过   C.  class Something {public void doSomething() {int i ;System.out.println("i = " + i);}
} 局部变量i没有赋值就直接使用D.  public class Something {public static void main(String[] args) {Something s = new Something();System.out.println("s.doSomething() returns " +s. doSomething());}public String doSomething() {return "Do something ...";}
}编译正常通过E.  interface  A{int x = 0;
}
class B{int x =1;
}
class C extends B implements A {public void pX(){System.out.println(x);}public static void main(String[] args) {new C().pX();}
}C类pX()方法中x不知道该使用A接口中的还是B类中的F.    interface Playable {void play();
}
interface Bounceable {void play();
}
interface Rollable extends Playable, Bounceable {Ball ball = new Ball("PingPang");
}
class Ball implements Rollable {private String name;public String getName() {return name;}public Ball(String name) {this.name = name;        }public void play() {ball = new Ball("Football");System.out.println(ball.getName());}
}接口中成员变量默认是全局常量,由public static final修饰,例如在interface Rollable中的ball对象但是在实现类class Ball的play()方法中又对它重新赋值是不可以的

1描述一下你理解的常见集合框架,ArrayList/LinkedList/LinkedHashMap/HashMap/Properties特点,以及简述每种底层原理和使用场景(15分,每个3分必做)

ArrayList:是继承于Collection接口体系下的List接口,有序可重复
底层是Object数组,适合查改,不适合增删插,非线程安全

LinkedList:是继承于Collection接口体系下的List接口,有序可重复
底层是双向链表,适合增删插,不适合查改,非线程安全

LinkedHashMap:继承自HashMap类,内部维护了一个HashMap链表,保证了存入和取出的顺序,线程不安全

HashMap:键值对存储数组,值可以重复,但是键不能重复,底层是键值对数组+单向链表+红黑树,线程不安全。判断键不能重复机制:先计算键的hashcode,用位运算(可以当成模以数组长度)得到数组下标,如果下标相同,先hashcode再equals比较。HashMap默认数组长度为16,负载因子为0.75(扩容机制)

Properties:继承自HashTable,是线程安全的,键和值都是String类型,常用于作配置文件

2两种创建并启动线程的方式;线程同步的几种方式(15分,每个点3分)

两种创建并启动线程的方式
第一种:继承Thread类,重写run方法

class TicketThread extends Thread{   重写run方法
}
new TicketThread().start()

两种创建并启动线程的方式
第二种:实现Runnable接口,重写run方法

class TicketRunnableImpl implement Runnable{重写run方法
}
TicketRunnableImpl tr = new TicketRunnableImpl();
new Thread(tr).start();

线程同步方式
第一种 :同步代码块

synchronized(同步监听对象){有线程安全的代码
}

线程同步方式

第二种 :同步方法

在方法的返回值前,修饰符之后加上synchronized
注意:普通方法同步监听对象默认是this
静态方法同步监听对象默认是当前类的字节码对象

线程同步方式

第三种 :锁机制

ReentrantLock lock = new ReentrantLock();
try{lock.lock();有线程安全的代码
}finally{lock.unlock();
}

二、编程题

1.单例模式(3种方式) (9分
私有化当前类类型的成员变量
构造方法私有化
提供一个公共获得当前类对象的方法

第一种:饿汉模式(在类加载的时候就创建对象)

/*** *饿汉模式*/
public class Person {private static final Person p = new Person();private Person() {}public static Person getInstance() {return p;}
}

第二种:懒汉模式(在调用方法时才创建对象)(存在线程安全问题)

/*** *懒汉模式*/
public class Person {private static Person p ;private Person() {}public static Person getInstance() {if(p != null) {p = new Person();}return p;}
}

第三种:枚举

/*** *枚举*/
public enum Person {NAME,AGE;
}

2.请解释下面代码运行后得到的效果。(15分)

Map<String, List<User>> listMap = userList.stream() .collect(Collectors.groupingBy(User::getName));

将userList集合中user.getName进行分组存到Map中,String为name,List就是name所对应的List

List<String> collect = list.stream().filter(s-> !s.equals("波多野小吕")).collect(Collectors.toList());

得到list中不为"波多野小吕"的新List集合

List<User> userList1 = userList.stream().filter(user -> user.getAge() > 20).collect(Collectors.toList()

得到List中user对象的age>20的新List集合

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("1");
list1.add("2");
list1.add("3");
list1 = list1.stream().filter(s -> s != "1").collect(Collectors.toList())

list1中还有“2”,“3”

Map<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));

根据list对象Person的age进行分组,得到map,键就是年龄Integer,值是相同年龄的Person集合

3**. 交易明细文本文件内容如下:(25分) 有一个TransRecord.txt文件,保存的是交易记录明细。一行是一条交易明细,每行分7列。 请编码,实现如下功能:
3.1、设计一个交易记录类TransRecord (字段数据类型自己决定)。(5分)
3.2、解析文件(IO流),将文件中数据,将每条交易明细封装为1个TransRecord对象。所有TransRecord对象,添加到一个集合中,并且打印到控制台;(就是将对象添加到集合并打印集合)(10分)
BufferedReader 方法readLine()**

3.3、完成一个功能(方法):输入客户号,查询交易明细记录并打印出来,封装成一个方法,通过传入客户号作为参数(5分)
3.4、定义一个方法,按金额升序排序,并且打印到控制台;Set自然或定制排序(5分)

TransRecord.txt文件

客户号  姓名      所属机构号   性别      帐号      发生时间    发生额
000001  刘德华 0000    1   4155990188888888    2014-07-20 20:00:15 300.00
000201  玛利亚 0002    1   4155990199999999    2019-07-20 10:00:27 500.00
000101  老吕  0012    1   4155990100000000    2019-05-20 17:00:17 1000.50
000102  吉泽  0012    1   4155990155555555    2014-07-20 20:00:09 600.99
000301  苍老师 0013    0   41559901111111111   2014-07-22 20:10:12 5000.00
000001  老吕  0000    1   4155990188888888    2020-01-25 22:00:05 21200.00

3.1、设计一个交易记录类TransRecord (字段数据类型自己决定)。

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;public class TransRecord implements Serializable{/*** */private static final long serialVersionUID = 1464023771029820063L;// 私有化属性private String client;private String name;private String groupid;private boolean sex;private String username;private LocalDateTime localDateTime;private BigDecimal biDecimal;// 无参构造public TransRecord() {super();}// 有参构造public TransRecord(String client, String name, String groupid, boolean sex, String username,LocalDateTime localDateTime, BigDecimal biDecimal) {super();this.client = client;this.name = name;this.groupid = groupid;this.sex = sex;this.username = username;this.localDateTime = localDateTime;this.biDecimal = biDecimal;}public String getClient() {return client;}public void setClient(String client) {this.client = client;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGroupid() {return groupid;}public void setGroupid(String groupid) {this.groupid = groupid;}public boolean isSex() {return sex;}public void setSex(boolean sex) {this.sex = sex;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public LocalDateTime getLocalDateTime() {return localDateTime;}public void setLocalDateTime(LocalDateTime localDateTime) {this.localDateTime = localDateTime;}public BigDecimal getBiDecimal() {return biDecimal;}public void setBiDecimal(BigDecimal biDecimal) {this.biDecimal = biDecimal;}@Overridepublic String toString() {return "TransRecord [client=" + client + ", name=" + name + ", groupid=" + groupid + ", sex=" + sex+ ", username=" + username + ", localDateTime=" + localDateTime + ", biDecimal=" + biDecimal + "]";}}

3.2、解析文件(IO流),将文件中数据,将每条交易明细封装为1个TransRecord对象。所有TransRecord对象,添加到一个集合中,并且打印到控制台;(就是将对象添加到集合并打印集合)(10分)
BufferedReader 方法readLine()**

3.3、完成一个功能(方法):输入客户号,查询交易明细记录并打印出来,封装成一个方法,通过传入客户号作为参数(5分)
3.4、定义一个方法,按金额升序排序,并且打印到控制台;Set自然或定制排序(5分)

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;/***解析文件(IO流),将文件中数据,将每条交易明细封装为1个TransRecord对象。所有TransRecord对象,添加到一个集合中,并且打印到控制台;(就是将对象添加到集合并打印集合)(10分)BufferedReader 方法readLine()String line = buffered.readLine();line.split("\\s")匹配多个空格if( == 6 || == 7) {拼接到一个字符串。给一个对象的日期成员变量赋值}**/
public class ParseTransTest {// 把arraylist提出来,成员变量,好让每个方法访问public static List<TransRecord> arrayList = new ArrayList<TransRecord>();// 程序主方法,程序入口,来测试3个方法public static void main(String[] args) throws Exception {// 测试第二题List<TransRecord> list = getAll();System.out.println(list);// 测试第三题List<TransRecord> searchByClient = searchByClient("000201");System.out.println(searchByClient);// 测试第四题Set<TransRecord> sort = sort(arrayList);System.out.println(sort);}/*** 第二题:* 思路:* 1.将文件用缓冲流读出(readline方法更高效)* 2.添加到TransRecord对象中,再加到List集合中* @return 返回List集合*/public static List<TransRecord> getAll() {try(// 关流新方式,创建缓冲流FileReader fr = new FileReader("TransRecord.txt");BufferedReader bufferedReader = new BufferedReader(fr);  ){// 调用读取一行方法readLine(),先去除第一行文字,开始第二行读取String i = bufferedReader.readLine();while((i = bufferedReader.readLine()) != null) {// 将读出的一行字符串按照多个空格分割成字符串数组String[] split = i.split("\\s");TransRecord transRecord = new TransRecord();// 添加到TransRecord对象中transRecord.setClient(split[0]);transRecord.setName(split[1]);transRecord.setGroupid(split[2]);transRecord.setSex(Boolean.getBoolean(split[3]));transRecord.setUsername(split[4]);transRecord.setLocalDateTime(LocalDateTime.parse(split[5] + "T" + split[6]));transRecord.setBiDecimal(new BigDecimal(split[7]));// 添加到arrayList对象中arrayList.add(transRecord);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 返回arrayListreturn arrayList;}/*** 第三题* 思路:遍历arrayList,找出TransRecord对象中的client与参数相同的那一个TransRecord对象* 并把它添加到新的List中,然后返回* @param client 传入的客户端号* @return  返回一个List集合,* @throws Exception*/public static List<TransRecord> searchByClient(String client) throws Exception{List<TransRecord> arrayList2 = new ArrayList<TransRecord>();// 效验数据合法性if(client == null) {throw new IllegalAccessException("非法参数");}// 遍历list,找到与之相同的TransRecord对象,并添加到新list中for (TransRecord transRecord : arrayList) {if(transRecord.getClient().equals(client)) {arrayList2.add(transRecord);}}return arrayList2;}/***    第四题 *    思路:写一个定制排序(根据TransRecord的金额)将,list传入treeset中* @param list1* @return */public static Set<TransRecord> sort(List<TransRecord> list1){// 定制比较器Set<TransRecord> result = new TreeSet<TransRecord>(new DecimalComparetorImpl());for (TransRecord transRecord2 : arrayList) {// 将list中的每一个transrecord对象传入treeset中result.add(transRecord2);}return result;}
}

定制比较器

import java.util.Comparator;public class DecimalComparetorImpl implements Comparator<TransRecord>{@Overridepublic int compare(TransRecord o1, TransRecord o2) {// TODO Auto-generated method stubreturn o1.getBiDecimal().intValue() - o2.getBiDecimal().intValue();}}

4. 有如下的一个字符串 String str = “ksjhfkjashfkahfkahfiuuytwurekahd”; (10分)
① 请统计出其中每一个字母出现的次数,并把结果保存到一个文件中去
② 请打印出字母次数最多的那一对(5分)
可能用到知识:泛型、集合(Map或者List或者Set)

import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;/***  有如下的一个字符串  String str = “ksjhfkjashfkahfkahfiuuytwurekahd”;  (10分)① 请统计出其中每一个字母出现的次数,并把结果保存到一个文件中去:(5分)② 请打印出字母次数最多的那一对(5分)可能用到知识:泛型、集合(Map或者List或者Set)第一题思路:1.要统计出字母出现的次数,必须键值对存储,所以必须用到键为String,值为Integer的HashMap存储数据  key就是字母,value就是次数2.将字符串转换成数组3.遍历数组每一个元素,查看hashmap中是否有该元素,如果有就获取其value将其加一,如果没有就赋值该元素为kay,value=14.将hashmap转换成字符串,写入到文件中第二题思路:1.hashmap通过values获取所有value集合,找出最大值2.遍历entrySet,如果entryset.getvalue==最大值,就输出key+value*/
public class StringSave {public static void main(String[] args) {String str = "ksjhfkjashfkahfkahfiuuytwurekahd";// 第一题:// 创建map对象,等会存储字母和次数  键值对HashMap<String,Integer> hashMap = new HashMap<String, Integer>();// 将字符串转换成数组,数组的每一个元素就是单个字符String[] split = str.split("");// 增强for循环遍历数组   (遍历单个字符)for (String string : split) {// 判断hashmap的键是否包含stringif(hashMap.containsKey(string)) {// 如果包含其string,取出对应的value,再加上一,重新添加到集合中Integer integer = hashMap.get(string);hashMap.put(string, integer + 1);}else {//如果不包含,说明之前还没有出现该字母,那么添加其value=1hashMap.put(string, 1);}}// 打印出hashmapSystem.out.println(hashMap);// new 一个StringBuilder对象,将hashmap中数据添加进去StringBuilder hashstr = new StringBuilder();// 获取entryset   遍历hashmap,将hashmap中的键值对添加进去Set<Entry<String,Integer>> entrySet2 = hashMap.entrySet();for (Entry<String, Integer> entry : entrySet2) {hashstr.append(entry.getKey());hashstr.append(":");hashstr.append(entry.getValue());hashstr.append("\n");}// 将StringBuilder对象转为String对象(因为输出流write方法没有StringBuilder参数的方法)String string = new String(hashstr);try(// 关流新方式   创建一个字符输出流FileWriter fw = new FileWriter("a.txt");   ){// 调用write方法,传入stringfw.write(string);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 第二题:// 获取hashmap中value的最大值Collection<Integer> values = hashMap.values();Integer max = Collections.max(values);//entryset遍历hashmap集合,判断value与max是否相等,相等就输出相应的键值对Set<Entry<String,Integer>> entrySet = hashMap.entrySet();for (Entry<String, Integer> entry : entrySet) {if(max.equals(entry.getValue())) {System.out.println(entry.getKey() + ":" +entry.getValue());}}}}

5.写一个方法传入一个File对象file和一个字符串str参数,统计这个字符串在这个文件中出现的次数(5分)

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;/*** 5.写一个方法传入一个File对象file和一个字符串str参数,* 统计这个字符串在这个文件中出现的次数(5分)* * 思路:1.读出file对象中字符,转换成字符串*       多种思路:*       2.将转换的字符串按照str拆分,得到数组,数组长度-1就是出现次数**/
public class FileStrCount {public static void main(String[] args) throws Exception {int strCount = strCount(new File("b.txt"),"b");System.out.println(strCount);}public static int strCount(File file, String str) throws Exception{// 计数,str出现在file文件中的次数int count = 0;// StringBuilder拿到file中的数据StringBuilder stringbd = new StringBuilder();try(// 关流新方式// 字符输入流FileReader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);){   // 缓冲流读取一行就添加到StringBuilder中String i = "";while((i = br.readLine()) != null) {stringbd.append(i);}// 再转换成StringString string = new String(stringbd);// string拆分,用str拆分String[] split = string.split(str, -1);count = split.length - 1;}return count;}
}

Java Se相关测试题(偏线程、集合)含答案及详解相关推荐

  1. 【java】之常用四大线程池用法以及ThreadPoolExecutor详解

    为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中,线 ...

  2. JAVA面试题和笔试题总汇(含答案)-联想lenovo

    ·         JAVA面试题和笔试题总汇(含答案)-联想lenovo · 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关 ...

  3. 【2022最新Java面试宝典】—— Java异常面试题(33道含答案)

    目录 一.Java异常架构与异常关键字 1. Java异常简介 2. Java异常架构 1.Throwable 2. Error(错误) 3. Exception(异常) 运行时异常 编译时异常 3. ...

  4. future java 原理_Java线程池FutureTask实现原理详解

    前言 线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,ThreadPoolExecutor ...

  5. (7)Java数据结构--集合map,set,list详解

    MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...

  6. java集合框架的结构_集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...

  7. Java高并发编程详解系列-线程上下文设计模式及ThreadLocal详解

    导语   在之前的分享中提到过一个概念就是线程之间的通信,都知道在线程之间的通信是一件很消耗资源的事情.但是又不得不去做的一件事情.为了保证多线程线程安全就必须进行线程之间的通信,保证每个线程获取到的 ...

  8. java经典笔试题大全(50道含答案)

    java经典笔试题大全(50道含答案)整理了一套常用的Java笔试题,选择题50道,简答题5道,试试你能做对多少题吧,含答案. 选择题(共50题,每题1.5分,共75分.多选题选不全或选错都不得分.) ...

  9. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

最新文章

  1. Windows C/C++ 语言菜单基本编程
  2. sql2016是否支持linux,微软 SQL Server 支持 Linux 了,2017年 中将正式推出
  3. python编程大赛队名_团队作业1——团队展示选题
  4. 440. 字典序的第K小数字
  5. 图解 Kafka,看本篇就足够啦
  6. 【Day15】介绍下 promise 的特性、优缺点,内部是如何实现的,动手实现 Promise
  7. 设计师必备导航类网站,内有宝藏!
  8. 【MEMORY ALIGN】内存对齐
  9. 一本通————1244 和为给定数
  10. Electron-forge使用实战
  11. 实验: 配置trunk
  12. 两台电脑之间大文件怎么传输用什么软件?
  13. 突破电信80端口封锁,用CDN架设公司服务器!
  14. ATTCK靶场系列(一)
  15. 打游戏哪种蓝牙耳机比较好?适合玩游戏的无线蓝牙耳机
  16. VM是什么,干什么的
  17. 35个有创意的信息可视化设计欣赏
  18. Golang FlameGraph(火焰图)
  19. FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)
  20. CarbonData简介

热门文章

  1. Visual Web Developer 中的网站类型
  2. 内置模块/核心模块 (自带的)---path模块
  3. 轻松弄懂var、let、const之间的区别
  4. TensorFlow2.0(一)--简介与环境搭建
  5. Linux软件安装的几种方法 (二)—— deb包安装
  6. 神经网络学习历程与总结
  7. CNN经典模型:VGGNet
  8. 6-7 jmu-Java-07多线程-Thread (3分)
  9. idea 使用 springboot框架开发时,自定义创建 yml文件,系统无法识别。yml文件没有spring的小叶子。完美解决
  10. php 文件 计数,文件计数问题