Java例题分享
文章平均质量分 79
每日一题分享与解析
二师弟&
这个作者很懒,什么都没留下…
展开
-
80. java编程题: 获取指定目录下,指定扩展名的文件(包含子目录中的),这些文件的绝对路径写入到一个文本文件中,简单说,就是建立一个指定扩展名的文件的列表
代码实现:/** * @author 江湖@小小白 * @create 2020/12/21 10:18 *//* * 获取指定目录下,指定扩展名的文件(包含子目录中的) * 这些文件的绝对路径写入到一个文本文件中 * 简单说,就是建立一个指定扩展名的文件的列表 * 思路: * 1,必须进行深度遍历 * 2,要在遍历的过程中进行过滤。将符合条件的内容都存储到容器中。 * 3,对容器中的内容进行遍历并将绝对路径写入到文件中 */import java.io.BufferedWri原创 2020-12-21 10:31:12 · 230 阅读 · 0 评论 -
79. java编程:题目:一个数如果恰好等于它的因子之和,这个数就称为”完数”。例如: 6 = 1+2+3,编程找出1000以内的所有完数。
代码实现:/** * @author 江湖@小小白 * @create 2020/12/21 10:09 */import java.util.ArrayList;/* * 题目:一个数如果恰好等于它的因子之和,这个数就称为”完数”。 * 例如:6 = 1+2+3. * 编程找出1000以内的所有完数。 * */public class ZhuTest2 { public static void main(String[] args) { for (int i原创 2020-12-21 10:12:41 · 667 阅读 · 0 评论 -
78. java编程:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
代码实现:/** * @author 江湖@小小白 * @create 2020/12/21 10:01 */import java.util.Scanner;public class ZhuTest { public int input() { System.out.print("请输入一个4位正整数:"); Scanner k = new Scanner(System.in); int num = k.nextInt();原创 2020-12-21 10:06:31 · 1572 阅读 · 0 评论 -
77.JVM GC(垃圾回收与算法)
1 思维导图2 如何确定垃圾?2.1 引用计数法在 java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都为 0,则说明对象不太可能再被用到,那么这个对象就是可以回收的对象。2.2 可达性分析为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots”对象作为起点搜索。如果在“GC roots”和一个对象之原创 2020-12-18 13:57:32 · 644 阅读 · 0 评论 -
76. 双亲委派机制
类加载器:虚拟机自带的加载器启动类(根)加载器(Boot)扩展类加载器(Exc)应用程序加载器(App)双亲委派机制:类加载器收到类加载器的请求将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器启动类加载器检查是否能够加载当前这个类,能加载就结束;否则,抛出异常,通知子类加载器进行加载重复步骤 3eg:public class String{ public String toString() { return "Hello"; } public st原创 2020-12-11 21:53:22 · 97 阅读 · 0 评论 -
75. 索引设计的原则
索引设计的原则适合索引的列是出现在 where 子句中的列,或者连接子句中指定的列基数较小的类,索引效果较差,没有必要在此列建立索引使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可...原创 2020-12-07 14:39:11 · 136 阅读 · 0 评论 -
74. 索引的算法
索引的算法:索引的算法有 BTree 算法和 Hash 算法BTree 算法BTree 是最常用的 mysql 数据库索引算法,也是 mysql 默认的算法。因为它不仅可以被用在=,>,>=,<= 和 between 这些比较操作符上而且还可以用于 like 操作符。只要它的查询条件是一个不以通配符开头的变量Hash 算法Hash 索引只能用于对等比较,例如=,<=>(相当于 = )操作符。由于一次定位数据,不像BTree 索引需要从根节点到枝节点,最后才能访问原创 2020-12-07 14:33:42 · 1049 阅读 · 0 评论 -
73. 索引的基本原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说,执行查询时遍历整张表。索引的原理很简单,就是把无序的数据变成有序的查询把创建了索引的列的内容进行排序对排序结果生成倒排序在倒排序内容上拼上数据地之链在查询的时候先拿到倒排序内容,再取出数据地址链,从而拿到具体数据...原创 2020-12-07 14:23:12 · 764 阅读 · 0 评论 -
72. 创建索引的原则
索引虽然好,但是不是无限制的使用,最好符合以下几个原则:最左匹配原则,组合索引非常重要的原则,mysql 会一直向右匹配直到遇到范围查询(>,<,between,like)就停止匹配,比如 a = 1 and b = 2 and c > 3 and d = 4,如果建立(a,b,c,d)的索引则可以用到,a,b,d 的顺序可以任意调整。较频繁作为查询条件的字段才去创建索引更新频繁的字段不适合创建索引若是不能有效区分数据的列不适合做索引(如性别,男女未知,最多也就三种,区分度实在太原创 2020-12-07 13:47:27 · 1114 阅读 · 5 评论 -
71. 小题五连击
优化 MySQL 数据库的方法优化索引、SQL语句、分析慢查询设计表的时候严格按照数据库的设计范式来设计数据库我们可以加上 memcached 缓存,将经常被访问到的数据,但是不需要经常变化的数据放入至 memcached 缓存服务器里面Class.forName()方法有什么用?初始化参数指定的类,并且返回此类对应的 Class 对象什么是 JDBC?解释下驱动(Driver)在 JDBC 中的角色JDBC 是允许用户在不同数据库之间做选择的一个抽象层。JDBC 允许开发者用 Ja原创 2020-12-04 20:42:59 · 85 阅读 · 0 评论 -
70. 请简述项目中优化 sql 语句执行效率的方法
尽量选择较小的列将 where 中用的比较频繁的字段建立索引select 子句中避免使用 “*”避免在索引上使用计算、not in 和 <> 等操作当只需要一行数据的时候使用 limit 1保证单表数据不超过 200W ,适时分割表。针对查询较慢的语句,可以使用 exception 来分析该语句具体的执行情况避免改变索引的类型选择最有效的表名顺序,from 字句中在最后的表是基础表,将被最先处理,在 from 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。避免.原创 2020-12-04 20:04:22 · 769 阅读 · 0 评论 -
69. 使用 Redis 有哪些好处?
使用 Redis 有哪些好处?速度快,因为数据存在内存中,类似于 HashMap ,HashMap 的优势就是查找和操作的时间复杂度是O(1)支持丰富的数据类型,支持:String、list、set、sortedset、hash支持事务,操作的原子性,所谓的原子性就是对数据的更改要么全部执行,要么不执行丰富的特性,可用于缓存,消息,按 key 设置过期时间,过期后会自动删除...原创 2020-12-03 11:58:15 · 575 阅读 · 0 评论 -
68. BIO、NIO 和 AIO 的区别
BIO、NIO 和 AIO 的区别BIO:一个连接一个线程,客户端有连接请求时服务器就需要启动一个线程进行处理;线程开销大;围异步 IO ,将请求连接放入线程池,一对多,但线程还是很宝贵的资源。NIO:一个请求一个线程,但是客户端发送的连接请求都会注册到多路复用上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。AIO:一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去启动贤臣进行处理。BIO 是面向流的,NIO 是面向缓冲区的;BIO 的各种流原创 2020-12-02 17:19:27 · 160 阅读 · 0 评论 -
67. Tomcat 顶层架构 —— 结构分析图
Tomcat 结构分析图分析:Tomcat中最顶层的容器是 Server ,代表着整个服务器,从上图中可以看出,一个 Server 可以包含至少一个 Service ,即可以包含多个Service,用于具体提供服务。Service 主要包含两个部分:Connector 和 Container 。从上图中可以看出 Tomcat 的核心就是这两个组件,他们的作用是:Connector 用于处理连接相关的事情,并提供 Socket 与 Request 请求和 Response 响应相关的转化。原创 2020-12-02 17:00:46 · 489 阅读 · 0 评论 -
66. Executors 类创建四种常见线程池(线程池详细解析),线程池的优点,状态以及实现原理
目录什么是线程池?线程池出现的原因线程池概念四种常见的线程池线程池优点线程池都有哪些状态?什么是线程池?池化技术比较常见,比如:线程池、数据库连接池、Http连接池等都是对这个思想的应用;池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池出现的原因在面向对象编程中,创建和销毁对象都是很浪费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在 Java 中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就原创 2020-12-02 12:08:08 · 129 阅读 · 0 评论 -
65. SynchronizedMap 和 ConcurrentHashMap 有什么区别?
SynchronizedMap 一次锁住整张表来保证线程安全,所以每次只能有一个线程来访问Map.ConcurrentHashMap 使用分段锁来保证在多线程下的性能。ConcurrentHashMap 中则是一次锁住一个桶。ConcurrentHashMap 默认将 hash 表分为 16 个桶,诸如get、put、remove 等常用操作只锁当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有 16 个写线程执行,并发性能的提升是显而易见的。另外 ConcurrrentHashMap 使.原创 2020-12-01 22:50:23 · 1823 阅读 · 0 评论 -
64. 产生死锁的条件是什么?怎么防止死锁?
产生死锁的必要条件互斥条件:所谓互斥就是进程在在某一时间内独占资源。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得资源,在未使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。这四个条件是死锁的条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。防止死锁可以采用以下方法尽量使用 tryLock(long timeout,TimeUnit unit)的方法(Reentrant原创 2020-12-01 22:22:33 · 134 阅读 · 0 评论 -
63. 什么是CAS?CAS会产生什么问题?怎么解决?
什么是 CAS?CAS 是 compare and awap 的缩写,即我们所说的比较和交换。CAS 是一种基于锁的操作,而且是乐观锁。java 中锁分为乐观锁和悲观锁(此专题下62篇有详细分析)。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过记录加 version 来获取资源,性能较悲观锁有很大的提高。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)、新值(B)。如果内存地址里的值和原创 2020-12-01 21:57:01 · 1138 阅读 · 0 评论 -
62. 乐观锁和悲观锁解析,乐观锁的实现方式是什么?
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改数据,所以每次在拿数据的时候都会上锁,这样别人想去那这个数据就会阻塞直到它拿到锁。传统的关系型数据库里面就用到了很多这种的锁机制,比如:行锁、表锁、写锁、读锁等,都是在做操作之前先上锁,再比如 Java 里面的 synchronized 关键字的实现也是悲观锁(非公平锁)。乐观锁跟它名字一样,人家就是谜一样的自信。线程每次去拿数据的时候都认为别人不会修改数据,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数原创 2020-12-01 21:16:05 · 194 阅读 · 2 评论 -
61. 什么是可重入锁(ReentrantLock)?重入性的实现原理是什么?
什么是可重入锁?ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复获取锁,即当前线程获取该锁后,没有中断,再次获取锁不会被阻塞。在java关键字 synchronized 隐式支持重入性,synchronized 通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock 还支持公平锁和非公平锁两种方式。重入性的实现原理支持重入性首先需要解决两个问题:在线程获取锁时,如果已经获取锁的线程原创 2020-12-01 20:41:05 · 1507 阅读 · 2 评论 -
60. synchronized 和 ReentrantLock 区别是什么?
synchronized 是关键字,ReentrantLock 是类,这是二者的本质区别。既然ReentrantLock 是类,那么它提供了比 synchronized 更多更灵活的特性,可以被继承,可以有方法,可以有各种各样的类变量。synchronized 早期的实现比较低效,对比 ReentrantLock ,大多数场景性能都相差较大,但是在 JDK1.6 中对 synchronized 进行了非常多的改进。相同点:两者都是可重入锁两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自.原创 2020-11-30 21:38:52 · 620 阅读 · 3 评论 -
59. synchronized、volatile、CAS 比较
synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞。volatile 提供多线程共享变量可见性和禁止指令重排序优化。CAS 是基于冲突检测的乐观锁(非阻塞)。原创 2020-11-30 21:13:56 · 480 阅读 · 0 评论 -
58. 当一个线程进入一个对象的 synchronized 方法 A之后,其他线程是否可以进入此对象的 synchronized 方法 B ?
不能其他线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的 synchronized 修饰符要求执行方法时要获得对象的锁,如果已经进入 A 方法说明对象锁已经被取走,那么试图进入 B 方法的线程就只能在等锁池(注意:不是等待池)中等待对象的锁。...原创 2020-11-30 21:06:58 · 304 阅读 · 0 评论 -
57. 线程 B 怎么知道线程 A 修改了变量?
volatile 修饰变量synchronized 修饰修改变量的方法wait/notify轮询原创 2020-11-30 20:57:25 · 1168 阅读 · 0 评论 -
56. synchronized:什么是自旋?
很多 synchronized 里面的代码只是一种很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题,既然 synchronized 里面的代码执行的非常快,不妨让等待的线程不要被阻塞,而是在 synchronized 的边界作忙循环,这就是自旋,如果做了多次循环发现还没有获得锁,再阻塞这样可能是一种更好的策略。...原创 2020-11-30 20:47:30 · 626 阅读 · 0 评论 -
55. Thead 类中 yield 方法有什么作用?
使当前的线程从执行状态(运行状态)变为可执行态(就绪状态),当前线程到了就绪状态,那么接下来哪个线程 会从就绪状态变成执行状态呢?可能是当前线程,也可能是其他线程,看系统的分配。...原创 2020-11-30 20:36:46 · 137 阅读 · 0 评论 -
54. sleep()和 wait() 有什么区别?
sleep() 与 wait() 相同点:两者都可以暂停线程的执行两者区别:类的不同,sleep() 是 Thread 线程类的静态方法,wait() 是 Object 类的方法。是否释放锁:sleep() 不释放锁;wait() 释放锁。用途不同:wait() 通常被用于线程之间的通信;sleep() 通常被用于暂停执行。用法不同:wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify() 或者 notifyall() 方法。sleep() 方法执行完成后,原创 2020-11-25 19:10:41 · 91 阅读 · 0 评论 -
53.为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用run()方法?
首先,new 一个Thread,线程进入了新建状态。调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片就可以开始了。start() 方法会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的的多线程工作。而直接执行run() 方法,会把run() 方法当成一个main() 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。总结:调用start() 方法方可启动线程并使线程进入就绪状态,而run() 方法只是 thread() 的.原创 2020-11-25 17:34:55 · 258 阅读 · 0 评论 -
51. 测试题(答案详析)
目录索引测试题201. redis操作string类型常用命令(至少5个)?2. redis操作hash类型常用命令(至少5个)?3. redis操作list类型常用命令(至少5个)?4. redis操作set类型常用命令(至少5个)?5. redis操作zset(Sorted Set)类型常用命令(至少5个)?6. maven中怎么解决jar包冲突,怎么保证jar包的版一致?7. session共享有什么方案,具体怎么实现?8. 介绍一下索引,索引有什么优缺点。9. MySQL中Int(10)和int(1原创 2020-11-21 15:43:41 · 1247 阅读 · 0 评论 -
52. 什么时候会发生类初始化?
52. 什么时候会发生类初始化?类的主动引用(一定会发生类的初始化)当虚拟机启动,先初始化main方法所在的类new一个类的对象调用类的静态成员(除了final常量)和静态方法使用java.lang.reflect包的方法对类进行反射调用当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类类的被动引用(不会发生类的初始化)当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化通过数组定义类引用,不会触发此类的初始化原创 2020-11-12 10:17:32 · 250 阅读 · 3 评论 -
51. 反射:Class类的创建方式有哪些?
反射:Class类的创建方式有哪些?代码演示如下:package test; /** * <p> * 反射: * Class类的创建方式有哪些? * </p> * @author 江湖@小小白 * @create 2020/11/11 15:09 */ public class Test { public static void main(String[] a原创 2020-11-12 08:38:00 · 105 阅读 · 1 评论 -
50. 测试题(答案详析)
面试题汇总,附有详细解析原创 2020-11-10 11:36:06 · 5770 阅读 · 0 评论 -
48. session 的实现原理
1. 什么是 session?session 是保存在服务器上的数据,用户不能私自进行修改,提高了安全性。session 是一种服务端存储信息的方式。2. session 原理session 是一种基于 cookie 的存储方法,通俗来说就是,session 负责存储数据,cookie 负责告诉后台,是哪一个数据。当建立一个新 session 时,向客户端下发一个 session-id,让客户端保存 session-id 在 cookie 中,下一次发起请求时,将 session-id 发回原创 2020-10-13 20:19:17 · 400 阅读 · 0 评论 -
47. cookie 实现原理
1. cookie概念Cookie是一段文本信息,客户端请求服务器时,如果服务器需要记录用户状态,就在响应用户请求时发送一段Cookie信息。客户端浏览器保存该Cookie信息,当用户再次访问该网站时,浏览器会把Cookie作为请求信息的一部分提交给服务器服务器检查 Cookie 内容,以此来判断用户状态,服务器还会对Cookie信息进行维护,必要时会对Cookie内容进行修改。2. Cookie的特点存储在浏览器中,浏览器记录上次请求的数据,下一次请求发给后台,并记录这次返回的信息,也可以原创 2020-10-13 19:58:14 · 576 阅读 · 0 评论 -
46. 执行以下程序的结果是什么?(答案详析)
1. 程序代码public class Test { private String name = "abc"; public static void main(String[] args) { Test test = new Test(); Test testB = new Test(); String result = test.equals(testB) + ","; result += test.name.equals(原创 2020-10-12 08:55:45 · 3369 阅读 · 3 评论 -
45. JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么?
jsp和servlet的区别和联系:jsp 经编译后就变成了 Servlet ( jsp 的本质就是 Servlet,JVM 只能识别 java 的类,不能识别 jsp 的代码,Web 容器将 jap 的代码编译成 JVM 能够识别的java类)。jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。Jsp是Ser原创 2020-10-02 10:48:06 · 260 阅读 · 0 评论 -
44. 举例说明 sychronized 修饰符应用的场景
synchronized 关键字是JAVA中内置的语言级同步原语,可以通过使用这个关键字实现多线程间访问之间的同步。synchronized 关键字可以作为函数的修饰符,也可以直接在函数语句中使用,也就是平时说的同步方法和同步语句。从作用域上来看,它可以分为作用于某个实例对象内和某个类的范围内。也可以实现在类的范围内的某个方法的同步,或是让一个类的所有对象都在某个代码块的使用上同步: public synchronized static void test(){ } public class.原创 2020-10-02 10:42:18 · 884 阅读 · 0 评论 -
43.char 型变量能不能存储一个中文汉字,为什么?
java 采用 unicode ,2个字节(16位)来表示一个字符,无论是汉字还是数字字母,或其他语言。char 在 java 中是两个字节,所以,可以存储中文。原创 2020-10-02 10:33:24 · 287 阅读 · 0 评论 -
42. 同步和异步有何异同,在什么情况下分别使用它们?举例说明
如果数据将在线程间共享,例如正在写的数据以后可能被另外一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。...原创 2020-10-02 10:20:42 · 355 阅读 · 0 评论 -
41. 请简述 Servlet 的生命周期中的方法及作用
Servlet 生命周期分为三个阶段:(1)初始化阶段:调用 init() 方法(2)响应客户端请求阶段:调用 service() 方法(3)终止阶段:调用 destroy() 方法生命周期:Servlet 是一种可以在 Servlet 容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为 Servlet 生命周期。Servlet 的生命周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()、和destr原创 2020-10-02 10:14:15 · 3643 阅读 · 1 评论