支付网站建设费入什么科目,唐山网址建站,ps里新建网站尺寸怎么做,网络货运平台有哪些八股文暑假合集 基础篇二分查找 java基础篇7月12号面向对象和面向过程的区别重载和重写String 7月13号自动装箱和拆箱静态方法构造方法成员变量和局部变量对象引用和对象实例返回值 与equals(重要)hashcode()和equals()HashMap 7月16号线程#xff0c;进程和程序final关键字的… 八股文暑假合集 基础篇二分查找 java基础篇7月12号面向对象和面向过程的区别重载和重写String 7月13号自动装箱和拆箱静态方法构造方法成员变量和局部变量对象引用和对象实例返回值 与equals(重要)hashcode()和equals()HashMap 7月16号线程进程和程序final关键字的总结 7月18号小厂一面30问 7月22号面试经典题Java8新特性详解异常处理详解MySQL 索引的最左原则详解 springspringMVCspringbootspringcloudredisMybatisPlusspring securitygit微服务7月30号 java实习广东小厂面试http中关于各个状态码怎么分类的了解哪些8月6号 某小厂面试8月158月17号 吉因加面试1、线程创建方法2、多目标遗传算法实现3、简历项目每个细节都要说清楚 重要4、动态代理实现方式2个5、状态码6、数组的扩容机制7、maven项目的目录8、http的传输数据的方式9、mybatis和mybatispius的区别10、专业单词会读11、clone两种下载数据的区别12、异常的分类13、arraylist和linklist14、集合分类15、Linux常用命令1.简单系统命令2.Linux文件操作2.1查看文件列表2.2 切换目录2.3新建文件夹及文件2.4删除文件2.5拷贝文件2.6移动文件或修改文件名 3.系统管理16、docker创建镜像的命令 基础篇
二分查找
步骤 有序数组这是前提默认 创建一个最左变量L一个最右变量R中间索引MLR/2这里要注意在java中浮点数取整为向下取整如32)/22也要和4舍5入区分开循环执行步骤3 如果LR 如果目标值等于下标为M的值则返回M 如果目标值大于下标为M的值则LM1 如果目标值小于下标为M的值则RM-1 如果LR没找到返回-1
代码
public class d {public static void main(String[] args) {int[] num{23,24,26,36,234,453,2357,123456};int target4;int i binTree(num, target);System.out.println(i);}public static int binTree(int[] num,int target){int L0,Rnum.length-1;while (LR){int M(LR)/2;if (targetnum[M]){return M;}else if (targetnum[M]){RM-1;}else{LM1;}}return -1;}
}public static void main(String[] args) {int a(Integer.MAX_VALUE(Integer.MAX_VALUE-1))/2;System.out.println(a);
}输出
-1不足当L和R都特别大时就会存在M值大于int类型的最大值存在整数溢出。
原因int 类型和Integer包装类型的取值范围都为-2147483648~2147483647当int的值大于2147483647或小于-2147483648时就会产生溢出。
方法一
实际需要的值(21474836462147483647)/22,147,483,646 溢出后的值-1 (LR)/2中间索引L(R-L)/2 ---LR/2-L/2---(LR)/2 (R-L)/2 两数相减值不会溢出public static void main(String[] args) {int aInteger.MAX_VALUE(-Integer.MAX_VALU(Integer.MAX_VALUE-1))/2;int b(Integer.MAX_VALUE(Integer.MAX_VALUE-1))/2;System.out.println(a);System.out.println(b);}输出
2147483647
-1方法二
因为计算机存储数字都是以补码的形式存储的。所以可以通过移位运算来避免溢出。 举个例子8位带符号的二进制数运算
0111111101111111111111110 127127-2 (127127)/2127
将结果向右移一位01111111 ------127 刚好等于我们想要的值
中间索引M(LR)1public static void main(String[] args) {int aInteger.MAX_VALUE(-Integer.MAX_VALUE(Integer.MAX_VALUE-1))/2;int b(Integer.MAX_VALUE(Integer.MAX_VALUE-1))1;System.out.println(a);System.out.println(b);}2147483647
2147483647java基础篇
7月12号
面向对象和面向过程的区别
先理解什么是面向对象和什么是面向过程简单来说面向对象是指编程时以对象为中心通过封装继承多态和实现等概念来实现功能程序以类和对象组成类包含一组属性和方法对象是类的一个实例通过在对象之间传递消息来实现数据的处理和传递。然后面向过程的话是以步骤为中心代码主要包括函数和过程而这些函数和过程都是独立的他们通过传递参数来实现数据的处理和传递。
面向过程
优点性能比面向对象高因为面向对象中的对象调用时需要实例化消耗资源。面向过程的话一般用于单片机LInux嵌入式开发等这些都是有性能要求。
缺点没有面向对象的易复用易维护易拓展
面向对象
优点易维护易拓展易复用面向对象包含继承多态封装等特性设计出来的系统低耦合系统更加灵活。
缺点性能比面向过程低。
重载和重写
重写
发生在父子类之间子类重写父类中的方法方法名和参数必须相同返回值异常抛出的范围小于等于父类否则向上转型后的类型不兼容从而引发异常子类对象可以调用父类中没被private修饰的方法当子类中重写了父类中的某个方法而子类对象想调用父类中的该方法而不是重载后的方法可以使用super关键字调用该方法父类通常情况下不能调用子类中的方法。重载
在一个类中存在多个相同名称的方法或构造函数但是参数列表必须不同参数的类型名称个数等使用重载可以增加代码的灵活性可读性。String
StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
可变性看是否被final关键字修饰 答String类中他是由final关键字修饰的字符数组保存字符串private final char value[]所以String对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类在AbstractStringBuilder中用字符数组保存字符串但是没用final关键字修饰所以这两个都是可变的。 abstract class AbstractStringBuilder implements Appendable, CharSequence {char[] value;int count;AbstractStringBuilder() {}AbstractStringBuilder(int capacity) {value new char[capacity];}线程安全
线程是进程的执行单位一个进程包含多个线程
先了解什么是线程安全每个进程都会有一个共同的区域在内存中叫做堆内存由于这个堆内存每个进程中的线程都可以访问里面的数据在没有限制的情况下数据存在被修改的风险。然后这个堆内存存储着对象实例线程使用对象的引用调用对象的实例从而访问对象的成员变量和方法。然后分析下String类StringBuilder类StringBuffer类是否是线程安全的?
首先String类他是由final修饰的字符数组组成的字符串是一个常量因此是线程安全的。
StringBuffer类他使用synchronized关键字来实现同步锁互斥锁synchronized修饰方法或者代码块所以线程安全。就是当一个线程访问由synchronized修饰的方法或者代码块时线程或尝试获取锁如果获取成功则执行该方法如果锁被其他线程占用则该线程被阻塞直到锁被释放为止。然后这个同步锁只能保证共享资源的互斥访问不能保证数据是否正确因为当多个线程访问同一个数据时进行读写操作后数据并不能保证没有被修改因此可以增加原子性操作来保证数据的一致性。
StringBulider类并未加同步锁所以是非线程安全。
7月13号
性能
StringBuilder的性能比StringBuffer的性能高10%~15%但是要冒着线程不安全的风险。每次对String对象进行改变时都会生成一个新的String对象然后将指针指向新的对象对StringBuilder和StringBuffer对象进行操作时都是对原有的对象进行操作。
总结
少量数据String
单线程操作字符串缓冲区大量数据StringBuffer
多线程操作字符串缓冲区大量数据StringBuilder
自动装箱和拆箱
装箱
将基本数据类型用他们对应的引用类型包装起来
int q1;
Integer wq;拆箱
将包装类型转换为基本数据类型
Integer q10;
int wq;静态方法
问在一个静态方法内调用一个非静态方法 为什么是非法的 答有不同的作用域和生命周期静态方法直接用类名进行调用无需创建类的实例而非静态方法依赖于类的实例如果你要在静态方法中调用非静态方法需要先创建类的实例再来调用非静态方法。 构造方法
问在 Java 中定义一个不做事且没有参数的构造方法的作用 答在父子类中当子类不用super()指定调用父类的构造方法子类会默认调用无参构造此时当父类不存在无参构造时程序就会出现编译错误解决方法就是在父类中加上一个无参构造。 成员变量和局部变量
问成员变量和局部变量的区别 答从语法形式上看成员变量存在于类中局部变量存在于方法或代码块中成员变量可以被控制修饰符修饰局部变量不能被访问控制修饰符和static修饰但是两者都可以被final修饰。 从存储方式来看成员变量因为在对象中因此存储在堆内存里局部变量存储在栈内存中。 从变量在内存中的生存时间来看成员变量随对象的创建而创建局部变量随方法的执行而自动消失。 public class MyClass {private int x; // x 是一个成员变量public void setX(int value) {int b1; // b 是一个局部变量x value; }public int getX() {return x;}
}对象引用和对象实例
问创建一个对象用什么运算符?对象实例与对象引用有何不同? 使用new运算符来创建对象对像实例存储在堆内存中对象引用存储在栈内存中一个对象实例可以被多个对象引用所指向可以用 n 条绳子系住一个气球一个对象引用指向一个或0个对象实例一根绳子可以不系气球也可以系一个气球。 返回值
问什么是返回值返回值的作用是什么 答返回值就是获取方法体运行结束后返回的结果前提是有结果返回值的作用是接收结果将其用于其他操作。 与equals(重要)
问和equals的特点 答如果比较的是基本数据类型的话那么就是比较这两个数据的值是否相等如果比较的是两个对象的话那么比较的是这两个对象的内存地址是否相等。 equals判断两个对象是否相等但是他有两种使用情况第一种就是equals方法没有被类覆盖那么比较的是两个对象的内存地址第二种类覆盖了equals()方法通常都会使用重写该方法的方式去比较两个对象的值是否相等。 然后的话String类重写了equals()方法比较的是两个对象的值是否相等Object类里面的equals()方法跟一样比较的是两个类的内存地址是否相同StringBuffer类和StringBuilder类并没有重写equals()方法其比较的还是引用类型的地址。 public class test1 {public static void main(String[] args) {String a new String(ab); // a 为一个引用String b new String(ab); // b 为另一个引用,对象的内容一样String aa ab; // 放在常量池中String bb ab; // 从常量池中查找if (aa bb) // trueSystem.out.println(aabb);if (a b) // false非同一对象System.out.println(ab);if (a.equals(b)) // trueSystem.out.println(aEQb);if (42 42.0) { // trueSystem.out.println(true);}}
}hashcode()和equals()
问你有没有重写过hashcode()和equals()方法为什么重写equals()方法必须重写hashcode()方法 答重写过首先先了解下hashcode()方法的作用是什么hashcode()方法用来获取哈希码实际上就是返回一个int整数。这个哈希码的作用是用来获取对象在哈希表中的位置hashcode()定义在JDK中的Object类中因此意味着java中的任何类都包含hashcode()函数。这个哈希表存储着键值对可以通过键快速检索出对应的值。 我通过hashset来解释hashcode的作用当我们存对象到hashset中时hashset会先获取该对象的hashcode值来判断对象的存储位置同时也会将其与已经加入对象的hashcode值作比较如果不存在相同的hashcode值则hashset同意加入该对象。如果存在hashcode值相等的对象则会使用equals()方法来检查hashcode值相等的对象是否真的相同。如果相同则hashset不会让加入操作成功如果不同则将该对象散列到其他位置。这样就大大减少了equals的次数提高了执行速度。 如果两个对象相等则hashcode一定相等 如果hashcode相同则用equals方法比较不一定相等 如果用equals比较相等的话hashcode一定相等。 hashcode不相同则用equals方法比较一定不相等 hashcode用比较intequals比较对象地址要保证相等的对象具有相同的hashcode。 HashMap
HashMap的底层原理是什么 HashMap底层的实现是一个数组每个元素称为桶(bucket)每个桶存储一个键值对其中键值对的键通过哈希函数计算出一个哈希值然后根据哈希值将键值对存储到相应的桶中。 HashMap的put是怎么存储数据的哈希冲突怎么解决的 当我们向HashMap中put一个键值对时首先会根据键的hashcode值计算出它在数组中的索引位置然后将值存储在对应的链表或红黑树中如果是链表的话使用的是尾插法如果是红黑树的话则根据值的大小自动排序。hashmap解决哈希冲突的方法是链地址法优点是简单易实现但是也存在一些缺点当链表长度过程会导致查询速度过慢在java8中规定当链表中元素个数大于等于8时将链表转化为红黑树。 HashMap不是线程安全的那有什么是线程安全的 ConcurrentHashMap是线程安全的HashMap实现。 ConcurrentHashMap是怎么实现的线程安全 ConcurrentHashMap内部维护了多个Segment每个Segment相当于一个小的HashMap它们之间相互独立互不影响。在进行插入、查找或删除操作时只需要锁定对应的Segment而不是整个HashMap这样可以减小锁的粒度提高并发能力。 HashMap初始容量大小是多少 HashMap的初始容量大小是16。 HashMap怎么实现的扩容 当HashMap中的元素数量达到容量的75%时就会触发扩容操作即将容量扩大为原来的两倍并重新构建哈希表。 HashMap为什么每次扩容为2的n次方 HashMap每次扩容为2的n次方是为了让元素在哈希表中分布更加均匀。 7月16号
线程进程和程序
问简述线程进程程序的基本概念。以及他们之间的关系是什么 答线程与进程相似但是线程是一个比进程更小的执行单位。一个进程在执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一个内存空间和同一组系统资源所以系统产生一个或多个线程并在各个线程之间进行切换工作时负担要比进程小得多因此线程也被叫做轻量级进程。 程序是含有指令和数据的文件被存储在磁盘或者其他存储设备中也就是说程序是静态的代码。 进程是程序的一次执行过程是系统运行程序的基本单位因此进程是动态的。系统运行一个程序及是一个进程的创建执行和消亡的过程。简单来说一个进程就是一个执行中的程序他在计算机中一个指令一个指令的执行同时每个进程还会占用某些系统资源如cpu时间内存空间文件输入输出设备等。线程是进程的执行单位进程是程序的执行单位。 问线程的状态 答 1 、新建状态 New 新创建了一个线程对象。 2 、就绪状态 Runnable 线程对象创建后其他线程调用了该对象的 start() 方法。 该状态的线程位于可运行线程池中变得可运行等待获取 CPU 的使用权。 3 、运行状态 Running 就绪状态的线程获取了 CPU 执行程序代码。 4 、阻塞状态 Blocked 阻塞状态是线程因为某种原因放弃 CPU 使用权暂时停止 运行。直到线程进入就绪状态才有机会转到运行状态。 阻塞的情况分三种 一、等待阻塞运行的线程执行 wait() 方法 JVM 会把该线程放入等待池中。 (wait会释放持有的锁 ) 二、同步阻塞运行的线程在获取对象的同步锁时若该同步锁被别的线程占用则 JVM 会把该线程放入锁池中。 三、其他阻塞运行的线程执行 sleep() 或 join() 方法或者发出了 I/O 请求时 JVM会把该线程置为阻塞状态。当 sleep() 状态超时、 join() 等待线程终止或者超时、或者 I/O 处理完毕时线程重新转入就绪状态。注意,sleep 是不会释放持有的锁 5 、死亡状态 Dead 线程执行完了或者因异常退出了 run() 方法该线程结束生命周期。 final关键字的总结
问final关键字的作用是什么 答final关键字一般用来修饰方法类变量 1.用来修饰变量的话有两种情况当修饰的是基本数据类型的变量那么该变量的值一旦完成初始化后就不能更改如果修饰引用类型的变量那么在完成初始化后该变量不能指向其他对象。 2.用来修饰类的话表明该类不能被继承且该类中的方法隐式为final方法。 3.使用final方法有两个原因第一个就是方法锁定防止继承类修改该方法的含义第二个原因是效率问题在早期的java版本中会把final方法内嵌调用如果方法过于庞大可能也难以看出内嵌调用带来效率的提升现在的java版本已经不需要使用final方法来实现性能的优化了类中的所有private方法都隐式的指定为final。 7月18号
小厂一面30问
Redis除了存储数据外还能实现什么功能 除了存储数据外Redis还可以实现数据的缓存、分布式锁、消息队列、计数器等功能。Redis还支持事务、Lua脚本、发布/订阅等高级功能。 Java8有什么新特性 Java8的新特性包括Lambda表达式、函数式接口、Stream API、默认方法、新的Date/Time API等。 Java中有哪些语法糖 Java中的语法糖包括自动装箱/拆箱、泛型、foreach循环、变长参数、枚举、注解等。 foreach和for有什么区别 foreach循环是用来遍历集合或数组的简化语法它不需要我们定义一个计数器或索引变量可以直接遍历每一个元素。而for循环则需要我们手动定义计数器或索引变量并通过循环来遍历集合或数组。 foreach底层是怎么实现的 foreach底层是通过迭代器实现的它会自动调用集合或数组的iterator()方法获取一个迭代器然后使用迭代器进行遍历。 MySQL的事务有哪些 MySQL中的事务包括四个基本操作ACID即原子性Atomicity、一致性Consistency、隔离性Isolation和持久性Durability。 MySQL事务中隔离性是怎么实现的 MySQL中的隔离性是通过锁和MVCC多版本并发控制实现的不同程度的隔离级别使用不同的实现方式。锁实现了串行化执行而MVCC实现了读写分离多版本并发控制可以提高并发性能。 能讲讲MVCC具体怎么实现事务的隔离性的 MVCC是MySQL中实现事务隔离性的一种方式它通过在每行记录中保存多个版本来实现。当进行读操作时会根据事务启动时的时间戳和版本号来选择符合要求的记录版本从而实现读操作不会被写操作影响的隔离性。当进行写操作时会将新版本的记录插入到对应的行中并将旧版本的记录标记为删除从而实现更新操作不会影响到其他事务读取旧版本数据的隔离性。 ReadView具体是保存了什么数据 ReadView是MySQL中实现MVCC的一种机制它保存了当前事务开始执行时的系统版本号和所有活跃事务的ID列表。在事务执行过程中ReadView会根据这些信息来判断当前事务是否可见其他事务的修改。 InnoDB存储引擎有什么好处
InnoDB存储引擎具有以下优点
- 支持事务和行级锁可以实现高并发和数据一致性。
- 支持MVCC可以提高读写性能。
- 支持外键约束可以保证数据的完整性。
- 支持在线热备份和恢复可以提高数据可用性。如果要查询前1-5条数据在B树中是怎么进行查找的 在B树中数据是按照键值大小有序地存储在叶子节点上。如果要查询前1-5条数据可以先定位到最左边的叶子节点然后从左往右依次扫描叶子节点取出前5个数据即可。 MySQL中除了InnoDB以外还有什么存储引擎 MySQL中还有MyISAM(myisanm)、Memory、CSV等多个存储引擎。 MyISAM与InnoDB的区别有什么优点 MyISAM和InnoDB在存储方式、锁机制、事务支持等方面有很大的区别。MyISAM适合于读多写少的场景不支持事务和行级锁但是具有快速读取和空间占用小的优点InnoDB适合于高并发、事务严格要求一致性的场景支持事务和行级锁但是具有写入慢、空间占用大的缺点。 MySQL中有什么锁 MySQL中有共享锁S锁、排他锁X锁、意向共享锁IS锁、意向排他锁IX锁等多种锁。 间隙锁是锁的什么数据 间隙锁是针对B树中的间隙即不存在的数据进行的锁定它是InnoDB实现MVCC的一种方式可以避免幻读的问题。 26、在查看某次查询索引时一般看的什么 在查看某次查询索引时一般要看索引是否被正确地使用可以通过explain命令查看查询计划、索引类型、扫描行数、是否使用了索引等信息。 27、说一下对分布式锁的理解 分布式锁是在分布式系统中实现锁管理的一种方式它可以保证在分布式系统中的多个节点同时对共享资源进行操作时只有一个节点能够获得锁并且在操作完成之后释放锁从而保证数据的一致性和正确性。 28、说一下什么是线程池 线程池是一种用于管理和复用线程的机制它可以在应用程序中预先创建一定数量的线程并将它们保存在一个线程池中以便根据需要动态地分配线程来处理任务。 29、线程池怎么创建 创建线程池可以使用Java中的Executors工具类提供的静态方法来创建例如newFixedThreadPool、newCachedThreadPool等方法。 30、创建线程池时主要设置什么属性 创建线程池时主要要设置线程池的核心线程数、最大线程数、线程空闲时间、任务队列等属性。 31、线程池一般可以用在什么情况下 线程池一般可以用在需要频繁创建和销毁线程的场景例如高并发的网络服务器、大规模数据处理等。 32、springcloud中 你熟悉什么 在Spring Cloud中我比较熟悉的是服务注册与发现组件Eureka、配置中心组件Config、负载均衡组件Ribbon、断路器组件Hystrix等。 33、nacos是什么主要实现什么功能 Nacos是阿里巴巴开源的一个服务注册中心和配置中心主要实现了服务的注册、发现、配置管理等功能。 34、SpringBoot中 请求进来时mapping是怎么处理的底层是怎么实现的(如Getmapping是怎么处理请求的) 在Spring Boot中请求进来时mapping是通过Spring MVC框架来处理的。底层实现是通过反射机制来扫描所有的Controller类和方法并将它们映射到对应的URL上当请求进来时会根据请求的URL和HTTP方法来匹配对应的Controller方法然后执行该方法并将返回结果封装成HTTP响应返回给客户端。Getmapping是通过RequestMappingHandlerMapping类的getMappingForMethod方法来处理的该方法会根据方法上的GetMapping注解和请求的URL来匹配对应的方法。 1、Java吸引你的地方是什么?
支持多线程可跨平台面向对象
2、面向对象的重点是什么?
封装、继承、多态、抽象
3、Java是如何实现跨平台的?
通过jvm实现也有一个叫jmm的内存模型概念它能实现屏蔽硬件和操作系统的内存访问差异
4、如何实现线程安全?
可以加锁也可以通过原子操作类或threadlocal类对需要的数据保证线程安全也可以使用volatile修饰状态记录变量保证数据安全
5、spring和springboot的区 别?
springboot有自动装配功能能够更简化开发者的工程量
6、如何注入同一个bean对象?
可以设置bean的作用域为单例模式并在需要注入这个bean的地方属性设置中注入这个bean
7、你了解的设计模式有哪些?
8、jvm的堆内存有什么内容?
7月22号
面试经典题
为什么重写 equals 还要重写 hashcode 答重写过首先先了解下hashcode()方法的作用是什么hashcode()方法用来获取哈希码实际上就是返回一个int整数。这个哈希码的作用是用来获取对象在哈希表中的位置hashcode()定义在JDK中的Object类中因此意味着java中的任何类都包含hashcode()函数。这个哈希表存储着键值对可以通过键快速检索出对应的值。 我通过hashset来解释hashcode的作用当我们存对象到hashset中时hashset会先获取该对象的hashcode值来判断对象的存储位置同时也会将其与已经加入对象的hashcode值作比较如果不存在相同的hashcode值则hashset同意加入该对象。如果存在hashcode值相等的对象则会使用equals()方法来检查hashcode值相等的对象是否真的相同。如果相同则hashset不会让加入操作成功如果不同则将该对象散列到其他位置。而java中解决这种哈希冲突的方法是链地址法就是数组中的每个元素为一个桶这个桶对应一个链表在java8中链表插入新元素用的是尾插法但是使用数组和链表的构存在查询时间过长的问题用数组加链表的话查询时间为链表的长度也就是O(N)当链表太长的话查询时间也就变长为了解决这个问题在java8中规定当链表长度大于8时使用红黑树存储数据查询时间为O(lgn)用这种先比较hashcode再用equals的方式大大减少了equals的次数提高了执行速度。 如果两个对象相等则hashcode一定相等 如果hashcode相同则用equals方法比较不一定相等 如果用equals比较相等的话hashcode一定相等。 hashcode不相同则用equals方法比较一定不相等 hashcode用比较intequals比较对象地址要保证相等的对象具有相同的hashcode。 和 equals 比较的区别 答如果比较的是基本数据类型的话那么就是比较这两个数据的值是否相等如果比较的是两个对象的话那么比较的是这两个对象的内存地址是否相等。 equals判断两个对象是否相等但是他有两种使用情况第一种就是equals方法没有被类覆盖那么比较的是两个对象的内存地址第二种类覆盖了equals()方法通常都会使用重写该方法的方式去比较两个对象的值是否相等。 为啥有时会出现 4.0 - 3.6 0.40000001 这种现象 这种现象是由于Java中浮点数的精度问题造成的。 在Java中浮点数使用IEEE 754标准表示同样会存在舍入误差。由于计算机使用二进制来表示浮点数而有些十进制分数在二进制下是无限循环的因此在转换为二进制表示时就会出现精度损失。 在你的示例中4.0和3.6都无法用有限的二进制位数表示因此在计算时Java会使用最接近的浮点数来代替这两个数从而产生舍入误差。这种误差通常很小对于大多数计算结果的影响不大但是在某些情况下可能会导致计算结果出现较大误差。 为了避免浮点数误差问题可以使用BigDecimal(big dai si mo)类来进行精确计算。BigDecimal类可以精确表示任意精度的十进制数并且可以进行精确的加减乘除运算。如果需要进行高精度计算建议使用BigDecimal类。 final 关键字的作用 答final关键字一般用来修饰方法类变量 1.用来修饰变量的话有两种情况当修饰的是基本数据类型的变量那么该变量的值一旦完成初始化后就不能更改如果修饰引用类型的变量那么在完成初始化后该变量不能指向其他对象。 2.用来修饰类的话表明该类不能被继承且该类中的方法隐式为final方法。 3.使用final方法有两个原因第一个就是方法锁定防止继承类修改该方法的含义第二个原因是效率问题在早期的java版本中会把final方法内嵌调用如果方法过于庞大可能也难以看出内嵌调用带来效率的提升现在的java版本已经不需要使用final方法来实现性能的优化了类中的所有private方法都隐式的指定为final。 介绍 Java 的集合类 Java集合框架包括两个主要接口Collection和Map。Collection接口表示一组对象而Map接口表示一组键值对。 Java集合类的主要分类如下 ListList是一种有序的集合可以存储重复的元素。它的实现类包括ArrayList、LinkedList和Vector。SetSet是一种不允许重复元素的集合。它的实现类包括HashSet、TreeSet和LinkedHashSet。MapMap是一种键值对的映射表。它的实现类包括HashMap、TreeMap和LinkedHashMap。QueueQueue是一种先进先出FIFO的数据结构可以使用它来实现排队等待的功能。它的实现类包括LinkedList和PriorityQueue。StackStack是一种后进先出LIFO的数据结构可以使用它来实现撤销和回退等功能。它的实现类是Stack类本身。 ArrayList 和 LinkedList 的区别 ArrayList和LinkedList都是Java集合框架中List接口的实现类它们都可以存储有序的元素并且支持随机访问和修改元素。但是它们之间的实现方式和性能特点有所不同下面是它们的主要区别 内部实现方式ArrayList是基于动态数组实现的而LinkedList是基于双向链表实现的。查询操作对于查询操作ArrayList比LinkedList更加高效。因为ArrayList可以直接通过索引来访问元素而LinkedList需要从头节点或者尾节点开始遍历链表。插入和删除操作对于插入和删除操作LinkedList比ArrayList更加高效。因为LinkedList只需要修改相邻节点的指针而ArrayList需要移动其他元素的位置。内存空间占用对于相同数量的元素LinkedList比ArrayList占用更多的内存空间。因为LinkedList需要为每个节点额外分配内存空间来存储指针。 java 8 有哪些新特性 Java 8的一些主要新特性 Lambda表达式Lambda表达式是一个匿名函数可以作为参数传递给方法或作为返回值返回。它可以简化代码并提高可读性。Stream APIStream API是一种新的数据处理方式可以对集合和数组进行函数式操作。它提供了丰富的中间操作和终止操作可以帮助我们快速高效地处理数据。方法引用方法引用是一种简洁的Lambda表达式的替代方式用于引用已经存在的方法。接口的默认方法和静态方法在Java 8之前接口只能定义抽象方法。Java 8引入了接口的默认方法和静态方法使得接口具有更多的灵活性和功能。日期和时间APIJava 8引入了新的日期和时间API可以更方便地处理日期和时间避免了旧的Date和Calendar类的一些问题。Optional类Optional类是一种容器对象可以包含一个非空的值或者一个空值。它可以避免空指针异常的出现。 HashMap 在 jdk 1.7 和 1.8 的区别 在JDK 1.7中HashMap使用了数组和链表的结合来实现即当多个键映射到同一个桶时它们会被存储在同一个链表中。这种实现方式在并发环境下存在安全性问题需要使用锁来保证线程安全导致并发性能较差并且查询数据的时间与链表的长度有关即O(n)当链表长度过长查询效率低。 在JDK 1.8中HashMap的实现方式进行了优化采用了数组和链表的结合来实现当链表长度超过一定阈值时默认为8链表会转换为红黑树查找的时间父杂度为O(lgn)提高查找效率。此外JDK 1.8中引入了CAS操作和synchronized锁升级机制使得HashMap在并发环境下具有更好的性能。 什么是死锁死锁产生的条件 死锁是指在多线程程序中两个或多个线程被阻塞它们在等待相互持有的资源导致程序无法继续执行下去形成了一种僵局。 死锁通常发生在多线程程序中有两个或多个线程相互持有资源而它们同时又在等待其它线程持有的资源。这种情况下程序就会进入死锁状态不再向前执行。 死锁产生的条件有以下四个 互斥条件多个进程竞争同一个资源。请求与保持条件指某个进程因为没有获取到资源而阻塞这个进程不会因此放弃请求该资源而是保存阻塞状态。不剥夺条件指进程已获得的资源在未使用完之前不能被剥夺只能在使用完时由进程自己释放。环路等待条件指在发生死锁时必然存在一个进程–资源的环形链。 线程有哪几种状态 线程可以有以下几种状态 新建状态New当一个线程对象被创建时它处于新建状态。此时操作系统已经为该线程分配了资源但尚未开始执行线程的代码。 就绪状态Ready当线程的 run 方法被调用时线程进入就绪状态。此时线程已经准备好执行但还没有被分配到 CPU 时间片。 运行状态Running当线程被分配到 CPU 时间片后线程进入运行状态。此时线程的代码正在 CPU 上执行。 阻塞状态Blocked当线程需要等待某个事件发生时它可能会进入阻塞状态。例如线程等待一个锁或者等待一个 IO 操作完成时它都会进入阻塞状态。在阻塞状态下线程不会占用 CPU 资源直到等待的事件发生。 死亡状态Dead当线程完成了它的任务或者发生了未捕获的异常时线程进入死亡状态。此时线程不再执行任何代码并且不再占用任何资源。 发生了未捕获的异常时—-异常抛出和try-catch-finally 有哪些进程调度算法 操作系统中常见的进程调度算法有以下几种 先来先服务调度算法FCFS按照进程到达的先后顺序进行调度先到达的进程先执行直到该进程执行完毕或者发生阻塞。 短作业优先调度算法SJF按照进程需要运行的时间长短进行调度需要运行时间短的进程先执行。该算法可以减少平均等待时间和平均周转时间但是可能会导致长时间运行的进程饥饿。 优先级调度算法按照进程的优先级进行调度优先级高的进程先执行。优先级可以根据进程的重要性、紧急程度等因素进行设置。需要注意的是该算法可能会导致优先级低的进程长时间等待产生饥饿问题。 时间片轮转调度算法将 CPU 时间划分为固定长度的时间片每个进程分配一个时间片进行轮流执行。如果进程在时间片结束前没有执行完毕那么它会被放到队列的末尾等待下一次调度。该算法可以避免长时间运行的进程饥饿但是可能会导致进程切换频繁影响系统性能。 多级反馈队列调度算法将进程按照优先级分为多个队列并且每个队列都有自己的时间片大小。优先级高的进程分配更短的时间片而优先级低的进程分配更长的时间片。如果一个进程在当前队列中使用完了时间片还没有执行完毕那么它会被移到下一个队列中等待下一次调度。该算法可以根据进程的特点动态调整时间片大小和优先级从而提高系统的效率。 进程饥饿是指某个进程长时间得不到运行的机会一直处于等待状态无法执行其任务的现象。进程饥饿可能会导致系统出现性能问题甚至使系统崩溃。 什么是缓冲区溢出 缓冲区溢出是指程序试图向缓冲区写入超出其容量的数据导致数据溢出到相邻的内存区域从而覆盖相邻内存区域的数据甚至修改程序的执行流程从而导致程序崩溃或者被攻击者利用。 为了避免缓冲区溢出可以采用以下措施 使用 Java 提供的安全函数例如 StringBuffer、StringBuilder 等以避免缓冲区溢出。对输入的数据进行检查和过滤限制输入数据的长度。使用 Java 提供的安全库函数例如 Arrays.copyOf、Arrays.copyOfRange 等避免数组越界访问等问题。 Arrays.copyOf,Arrays.copyOfRange 可以用于数组的扩容 计算机网络各层有哪些协议 物理层定义了物理介质和数据传输的电气、机械、功能和规程常见的协议有Ethernet、Fast Ethernet、Gigabit Ethernet 等。数据链路层提供了数据传输的逻辑连接和物理地址寻址常见的协议有ARP、RARP、PPP、HDLC、IEEE 802.3、IEEE 802.11 等。网络层负责数据包的路由和转发常见的协议有IP、IPX、RIP、OSPF、BGP、ICMP、IGMP 等。传输层提供端到端的可靠数据传输服务常见的协议有TCP、UDP、SPX 等。会话层提供了进程之间的会话控制和同步常见的协议有RPC、NFS、SQL 等。表示层提供了数据的格式化和加密常见的协议有ASCII、EBCDIC、JPEG、MPEG、SSL 等。应用层提供了各种应用程序的服务常见的协议有HTTP、FTP、SMTP、DNS、Telnet、SSH 等。 TCP 和 UDP 协议的区别 TCPTransmission Control Protocol和 UDPUser Datagram Protocol是网络传输层常见的两种协议它们有以下几个方面的不同 连接方面TCP 是面向连接的协议UDP 是无连接的协议。TCP 在数据传输前需要先建立连接而 UDP 不需要建立连接直接发送数据报文。可靠性方面TCP 提供可靠的数据传输UDP 不保证数据传输的可靠性。TCP 在传输数据时会进行校验和错误检测如果发现数据包有错误会要求重新发送。而 UDP 不会进行重新发送如果数据包丢失或者错误就会丢失这些数据。传输速度方面UDP 传输速度比 TCP 更快。因为 TCP 需要进行连接的建立、数据包的确认等复杂操作会造成一定的传输延迟而 UDP 直接发送数据包没有这些额外的操作传输速度相对较快。数据量方面TCP 可以传输大量的数据而 UDP 只适合传输少量的数据。因为 TCP 在传输数据时需要进行分段、重组等操作对于大量数据的传输比较适合而 UDP 直接发送数据包对于数据量较小的传输比较适合。流量控制方面TCP 可以进行流量控制而 UDP 不能进行流量控制。TCP 可以通过拥塞控制等机制来控制数据的传输速度避免网络拥塞而 UDP 没有这些机制。 TCP 为什么需要三次握手和四次挥手 TCP协议是一种可靠的传输协议主要是通过三次握手和四次挥手来保证数据的可靠传输和连接的正常关闭。以下是对于TCP三次握手和四次挥手的详细解释。 三次握手 1.第一次握手客户端向服务器发送一个SYN标志的数据包请求建立连接此时客户端进入SYN_SEND状态。 2.第二次握手服务器收到客户端的SYN数据包后向客户端发送一个SYN/ACK标志的数据包表示同意建立连接此时服务器进入SYN_RECV状态。 3.第三次握手客户端收到服务器的SYN/ACK数据包后向服务器发送一个ACK标志的数据包表示确认连接请求此时客户端进入ESTABLISHED状态服务器也进入ESTABLISHED状态连接建立成功。 在三次握手过程中可以保证双方的状态都是同步的并且可以防止因网络延迟等原因导致的重复连接请求。 四次挥手 1.第一次挥手客户端向服务器发送一个FIN标志的数据包表示要关闭连接此时客户端进入FIN_WAIT_1状态。 2.第二次挥手服务器收到客户端的FIN数据包后向客户端发送一个ACK标志的数据包表示确认关闭连接此时服务器进入CLOSE_WAIT状态。 3.第三次挥手服务器向客户端发送一个FIN标志的数据包表示服务器也要关闭连接此时服务器进入LAST_ACK状态。 4.第四次挥手客户端收到服务器的FIN数据包后向服务器发送一个ACK标志的数据包表示确认关闭连接此时客户端进入TIME_WAIT状态等待2MSL后进入CLOSED状态服务器也进入CLOSED状态。 在四次挥手过程中可以保证双方都能正常关闭连接并且可以确保数据的完整性避免数据丢失或重复传输。 HTTP 和 HTTPS 协议的区别 HTTP和HTTPS协议是互联网上常用的两种协议它们之间的主要区别在于安全性和数据传输方式。以下是HTTP和HTTPS协议的区别 数据传输方式 HTTP协议是明文传输数据传输过程中不进行加密容易被窃听和篡改而HTTPS协议通过使用SSL/TLS协议对数据进行加密和解密保证数据传输的安全性。端口号 HTTP协议默认使用80端口进行数据传输而HTTPS协议默认使用443端口进行数据传输。证书验证 HTTPS协议需要使用数字证书来进行身份验证确保通信双方的身份和数据的完整性。HTTP协议没有这种机制很容易被伪造。连接速度 HTTPS协议因为需要进行加密和解密会增加数据传输的时间和连接的建立时间因此连接速度较HTTP协议慢。缓存 由于HTTPS协议的加密和解密过程数据无法在中间节点进行缓存因此缓存效率较HTTP协议低。 MySQL 索引的最左原则 MySQL索引的最左前缀原则是指在使用多列组成的联合索引时使用索引进行查询时必须从索引的最左边列开始使用不能跳过索引中的任何一个列这样才能保证索引的有效性。例如如果有一个联合索引(a, b, c)那么当查询条件包含a和b时可以使用该联合索引进行查询但是如果查询条件只包含b和c那么该联合索引就无法使用。 InnoDB 和 MyIsam 引擎的区别 InnoDB和MyISAM是MySQL常用的两种存储引擎它们在内部实现和特性上有很大的差异。以下是它们之间的一些区别 数据存储方式 MyISAM使用表级锁来实现对表的并发访问而InnoDB使用行级锁可以实现更细粒度的并发控制。这意味着在高并发读写的场景下InnoDB的性能更好。 事务支持 InnoDB支持ACID事务而MyISAM不支持事务。如果需要使用事务来保证数据的一致性和完整性应该选择InnoDB。 外键支持 InnoDB支持外键MyISAM不支持外键如果需要使用外键来保证数据的完整性和一致性应该选择InnoDB。 索引方式 MyISAM使用B树索引而InnoDB使用B树索引。B树索引相对于B树索引有更好的查询性能和更低的存储空间需求。 查询性能 由于InnoDB支持行级锁和事务因此它在高并发读写的场景下具有更好的查询性能和更高的并发控制能力。而MyISAM在读密集型场景下具有更好的查询性能。 有哪些优化数据库性能的方法 以下是优化数据库性能的一些方法 使用索引合理地创建索引可以提高查询效率减少查询时间和资源消耗。但是需要注意的是过多的索引会增加额外的存储空间和维护成本而且可能会导致索引的失效降低查询效率。优化SQL语句优化SQL语句可以减少查询时间和资源消耗。例如尽量使用简单的SQL语句、避免使用SELECT *、尽量使用WHERE子句限制查询范围等。使用缓存使用缓存可以减少数据库的访问次数提高访问速度和性能。例如使用Redis等缓存系统缓存查询结果避免重复查询数据库。数据库分库分表当数据量过大时可以将数据分为多个库或多个表以减少单个数据库的负载和提高查询效率。优化数据库服务器优化数据库服务器可以提高数据库的性能和稳定性。例如增加内存、优化磁盘、调整数据库参数等。使用连接池使用连接池可以避免频繁地创建和关闭数据库连接提高连接复用率和性能。优化数据模型优化数据模型可以提高数据的查询效率和性能。例如避免使用过多的关联表、避免使用过多的冗余数据等。 如何定位慢查询 在Java应用程序中慢查询通常是指执行时间较长的SQL查询语句或者方法调用。定位慢查询可以通过以下几个步骤来实现 确定阈值首先需要确定一个合理的执行时间阈值来定义什么是慢查询。可以根据系统的响应时间和资源利用率等因素来决定阈值。通常来说执行时间超过1秒的查询可以被视为慢查询。监控系统使用监控工具对系统进行监控收集SQL查询的执行时间、访问频率、资源利用率等信息。常用的监控工具包括JMX、JProfiler、Java Melody等。定位慢查询通过监控工具收集的信息可以定位到慢查询的具体SQL语句或者方法调用。可以使用数据库的慢查询日志或者ORM框架的日志来收集SQL语句的执行时间和执行计划等信息。同时还可以使用性能分析工具来分析方法调用的性能瓶颈。优化查询定位到慢查询后可以根据具体情况进行优化。例如可以通过添加索引、优化SQL语句、减少网络传输等方式来提高查询性能。同时还可以使用缓存等技术来减少对数据库的访问次数提高系统性能。 MySQL 支持行锁还是表锁分别有哪些优缺点 MySQL 支持行锁和表锁两种锁机制。 表锁是在对整张表进行加锁当一个事务对表进行更新时其他事务无法对该表进行任何修改操作直到该事务结束。表锁的优点是加锁简单、资源消耗少缺点是并发性能较差因为锁的粒度太大容易造成大量的阻塞和锁等待。 行锁是在对表中的行加锁当一个事务对某行进行更新时其他事务仍然可以对其他行进行修改操作不会造成整张表的锁定。行锁的优点是并发性能较好因为锁的粒度比较细可以减少锁等待时间和阻塞的情况缺点是加锁的成本比表锁高因为需要对每一行进行加锁。 在实际应用中行锁和表锁的选择取决于具体的业务需求和并发访问情况。如果应用场景中并发访问比较高建议使用行锁来提高并发性能。如果并发访问比较低或者需要对整张表进行更新操作可以使用表锁来简化锁的管理和消耗。 Spring 的 IOC 和 AOP 是什么有哪些优点 Spring的IOCInversion of Control控制反转和AOPAspect-Oriented Programming面向切面编程是Spring框架中的两个核心概念。 IOC是指将对象的创建、依赖注入等工作交由Spring容器来完成即控制反转将原本由程序员手动创建和管理对象的过程交由Spring框架来完成。这样可以降低程序员的开发难度提高代码的可重用性和可维护性。 AOP是指将系统中的横切关注点进行抽象和封装从而实现系统关注点的分离即面向切面编程。通过AOP技术可以将系统中的横切关注点如日志记录、安全控制、性能统计等从业务逻辑中剥离出来在需要时进行动态织入从而提高代码的可维护性和可重用性。 Spring的IOC和AOP的优点包括 降低了系统的复杂度和耦合度使得代码更加清晰易于维护和升级。提高了代码的可重用性和可扩展性使得程序员可以更加专注于业务逻辑的编写而不必关注框架底层的实现细节。提高了系统的可测试性使得开发人员可以更加方便地进行单元测试和集成测试。提高了系统的性能和可靠性使得系统更加稳定、安全和高效。增加了代码的可读性和可维护性使得开发人员可以更加方便地理解和修改代码。 Spring 框架用到了哪些设计模式 Spring框架使用了多种设计模式下面列举几个常用的设计模式 IOC容器使用了工厂模式和单例模式。Spring的IOC容器使用工厂模式来创建对象并且默认情况下使用单例模式来管理对象从而实现对象的统一管理和复用。AOP使用了代理模式。Spring的AOP功能主要是基于代理模式实现的通过动态代理技术来实现横切关注点的统一管理。MVC使用了前端控制器模式和模板模式。Spring的MVC框架采用前端控制器模式来处理请求同时采用模板模式来实现视图层的实现。事务管理使用了模板方法模式。Spring的事务管理采用模板方法模式将事务管理的流程抽象成模板方法让子类实现具体的业务逻辑从而实现事务管理的统一管理和复用。依赖注入使用了依赖注入模式。Spring的依赖注入功能主要是基于依赖注入模式实现的通过将对象之间的依赖关系交由IOC容器来管理从而实现对象的解耦和依赖关系的管理。 介绍 Spring Bean 的生命周期 MyBatis 如何实现延迟加载 介绍 MyBatis 的多级缓存机制 如何解决提交冲突 提交不小心出现误操作如何撤销 什么是 Git Flow它有什么好处 如何查看某个进程的运行状态 如何在 Linux 上查看 2 G 的大文件 Linux 软链接和硬链接的区别 单例模式有哪些实现方式有哪些优缺点请手写其中一种 你用过哪些设计模式为什么用它 Redis 为什么快 Redis 有哪些常用的数据结构 Redis RDB 和 AOF 持久化的区别如何选择 如何解决缓存击穿、缓存穿透、雪崩问题 如何用 Redis 实现点赞功能怎么设计 Key / Value 使用消息队列有哪些优缺点 如何保证消息消费的幂等性 消息队列有哪些路由模型 你是否用过消息队列解决过什么问题 Nginx 有哪些作用 Nginx 为什么支持高并发 Nginx 有哪些负载均衡策略 什么是 Nginx 惊群问题如何解决它 Netty 有哪些优点 什么是 NIO 介绍 Netty 的零拷贝机制 什么是微服务有哪些优缺点 什么是注册中心能解决什么问题 什么是容器 使用 Docker 有哪些好处 如何快速启动多个 Docker 节点
Java8新特性详解
好的下面是一些具体的代码示例演示Java 8的一些新特性
Lambda表达式
ListString names Arrays.asList(Alice, Bob, Charlie);// 使用Lambda表达式对集合进行遍历和操作
names.forEach(name - System.out.println(Hello, name));// 使用Lambda表达式对集合进行过滤和统计
long count names.stream().filter(name - name.startsWith(A)).count();
System.out.println(The number of names starting with A is: count);names.stream().filter含义names.stream().filter()是Java 8中Stream API提供的一种数据处理方式用于对集合中的元素进行筛选和过滤。Stream API
ListInteger numbers Arrays.asList(1, 2, 3, 4, 5);// 使用Stream API对集合进行操作
int sum numbers.stream().filter(n - n % 2 0).mapToInt(Integer::intValue).sum();
System.out.println(The sum of even numbers is: sum);::含义::是Java 8中方法引用的操作符可以用来引用类的静态方法、对象的实例方法和构造方法。方法引用
ListString names Arrays.asList(Alice, Bob, Charlie);// 使用方法引用对集合进行排序
names.sort(String::compareToIgnoreCase);接口的默认方法和静态方法
interface Greeting {void sayHello();default void sayHi() {System.out.println(Hi!);}static void sayBye() {System.out.println(Bye!);}
}class GreetingImpl implements Greeting {public void sayHello() {System.out.println(Hello!);}
}// 使用接口的默认方法和静态方法
Greeting greeting new GreetingImpl();
greeting.sayHello();
greeting.sayHi();
Greeting.sayBye();日期和时间API
// 使用新的日期和时间API
LocalDate today LocalDate.now();
System.out.println(Todays date is: today);LocalDateTime now LocalDateTime.now();
System.out.println(Current date and time is: now);LocalDateTime christmas LocalDateTime.of(2023, Month.DECEMBER, 25, 0, 0);
System.out.println(Christmas is on: christmas);以上这些代码示例演示了Java 8的一些新特性包括Lambda表达式、Stream API、方法引用、接口的默认方法和静态方法、日期和时间API等。这些新特性可以使得Java的代码更加简洁、易读、高效。
异常处理详解
异常抛出throw和 try-catch-finally是 Java 中用于处理异常的两种机制。
异常抛出指的是在程序执行过程中当发生异常时可以使用 throw 语句将异常对象抛出从而将异常传递给上层调用者。
try-catch-finally
try 块中包含可能会抛出异常的代码。catch 块用于捕获和处理 try 块中抛出的异常。catch 块中的代码会根据抛出的异常类型进行匹配如果匹配成功则执行 catch 块中的代码否则程序将会继续抛出异常。finally 块中的代码无论是否抛出异常都会被执行。finally 块通常用于释放资源、关闭连接等操作。
在 Java 中try-catch 和 try-finally 是两种不同的异常处理机制它们之间是可以单独使用的也可以组合使用。
如果我们只想捕获异常并进行处理而不需要在 finally 块中执行任何代码那么可以省略 finally 块。例如
try {// 可能会抛出异常的代码
} catch (Exception e) {// 处理异常
}如果我们只需要在 finally 块中执行必须被执行的代码而不需要捕获和处理异常那么可以省略 catch 块。例如
try {// 可能会抛出异常的代码
} finally {// 必须被执行的代码
}需要注意的是如果 try 块中的代码抛出了异常并且没有被 catch 块捕获和处理那么该异常将会被抛出给上层调用者处理可能会导致程序崩溃。因此建议在编写 try-finally 代码时至少加入一个 catch 块来捕获和处理异常。
MySQL 索引的最左原则详解
创建索引是SQL优化的一种常见手段可以通过创建合适的索引来提高查询效率和性能。
以下是一个使用MySQL联合索引并遵循最左前缀原则的查询示例代码
假设有一个名为users的表其中包含三个列id、name和age。为了提高查询效率我们可以创建一个联合索引(name, age)代码如下
CREATE INDEX idx_users_name_age ON users(name, age);现在我们想要查询所有名字为Tom且年龄为30岁的用户我们可以使用以下SQL语句进行查询
SELECT * FROM users WHERE name Tom AND age 30;由于查询条件是从索引的最左边开始的而且查询条件涵盖了索引的所有列因此MySQL可以使用联合索引进行查询提高查询效率。
另外如果我们只查询名字为Tom的用户那么也可以使用该联合索引进行查询因为查询条件包含了索引的最左列示例代码如下
SELECT * FROM users WHERE name Tom;而如果我们只查询年龄为30岁的用户那么该联合索引就无法使用因为查询条件没有涵盖索引的最左列需要进行全表扫描示例代码如下
SELECT * FROM users WHERE age 30;综上所述最左前缀原则可以提高MySQL索引的查询效率因此在设计和使用索引时需要遵循这个原则。
当创建了索引时
当执行以下查询语句时
SELECT * FROM users WHERE name Tom AND age 30;如果users表上创建了(name, age)联合索引并且该索引已经被MySQL选择使用那么MySQL会按照以下步骤进行查询
MySQL会根据(name, age)联合索引中的name列进行查找找到所有name为’Tom’的行。对于找到的所有行MySQL会继续根据(age)索引中的age列进行过滤只保留age30的行。对于符合条件的行MySQL会到原始数据表中获取所有相关的列数据即使用SELECT *语句获取所有列的值。
**由于联合索引中的列顺序是按照(name, age)的顺序进行排序的因此MySQL必须先使用name列进行查找然后才能使用age列进行过滤。**这样可以最大化地利用索引提高查询效率。
没创建索引
当执行以下查询语句时
SELECT * FROM users WHERE name Tom AND age 30;如果users表上没有创建(name, age)联合索引MySQL就无法利用索引进行查询需要进行全表扫描即按顺序扫描users表中的每一行逐行判断是否满足查询条件。具体的执行过程如下
MySQL会从users表的第一行开始扫描获取该行的name和age列的值。对于获取的每一行MySQL会判断name是否为’Tom’并且判断age是否为30。如果该行满足条件MySQL会将该行的所有列的值都返回给客户端。如果该行不满足条件MySQL会继续扫描下一行重复上述步骤。如果扫描到表的末尾仍没有找到符合条件的行MySQL会返回空结果集。
由于该查询没有使用索引MySQL需要扫描整个users表无法利用索引的优势因此查询效率较低。在实际应用中如果需要频繁进行类似的查询可以考虑在name和age列上创建联合索引以提高查询效率。
spring 什么是Spring框架 Spring框架是一个开源的Java应用开发框架提供了一种轻量级的编程和配置模型用于构建企业级应用程序。它提供了依赖注入DI、面向切面编程AOP、事务管理、Web开发支持等功能。 Spring框架的 核心特点是什么 Spring框架的核心特点包括 松耦合通过依赖注入和面向接口编程实现了组件之间的松耦合。面向切面编程提供了面向切面编程的支持用于处理横切关注点。容器管理提供了一个容器Application Context用于管理和配置应用程序中的组件和对象。组件重用通过配置和注解实现了组件的重用和模块化。统一的异常处理提供了统一的异常处理机制方便开发者处理异常情况。 Spring的核心模块有哪些 Spring的核心模块包括 Spring Core提供了依赖注入和控制反转的功能是整个Spring框架的核心。Spring AOP提供了面向切面编程的支持。Spring JDBC提供了对JDBC的简化封装和易用性。Spring ORM提供了对各种ORM框架如Hibernate、MyBatis的集成支持。Spring Web提供了对Web应用程序的开发支持包括MVC框架、RESTful Web服务等。 什么是依赖注入DI 依赖注入是Spring框架的核心特性之一它是一种通过容器自动将依赖关系注入到对象中的机制。开发者不需要手动创建和管理对象而是通过配置或注解的方式由Spring容器负责创建和维护对象的依赖关系。 Spring中的Bean是什么 在Spring中Bean是由Spring容器管理的对象。Bean可以是应用程序中的任何一个对象通过配置或注解告知Spring容器如何创建、初始化和管理该对象。 Spring框架中的AOP是什么 AOPAspect-Oriented Programming是一种编程范式用于处理横切关注点。在Spring框架中AOP通过将横切关注点如事务管理、日志记录从业务逻辑中分离出来并将其模块化提供了更好的代码重用性和可维护性。 Spring的事务管理是如何实现的 Spring提供了声明式的事务管理机制通过配置和注解的方式实现事务管理。开发者可以通过在方法或类上添加事务相关的注解告知Spring容器如何管理事务。Spring使用AOP和底层事务管理器如JDBC事务、JTA事务来实现事务管理。 Spring MVC是什么它的作用是什么 Spring MVC是Spring框架中的一个Web开发模块用于构建基于MVC模式的Web应用程序。它提供了一组组件和功能用于处理HTTP请求、请求路由、视图解析、数据绑定等。Spring MVC的作用是简化Web应用程序的开发过程实现灵活的请求处理和响应生成。 Spring框架中的国际化支持是什么 Spring提供了国际化i18n和本地化l10n的支持。通过Spring的国际化支持开发者可以在应用程序中实现多语言支持根据用户的语言偏好提供不同的语言资源和消息。 Spring Boot和Spring框架有什么区别 Spring框架是一个用于构建企业级应用程序的开发框架提供了一系列的模块和功能。而Spring Boot是基于Spring框架的一个快速开发框架旨在简化Spring应用程序的初始配置和部署。Spring Boot提供了自动配置、开箱即用的特性使得开发者可以更快地搭建和部署Spring应用程序。
springMVC
它是一个基于Java的实现的MVC设计模式的请求驱动类型的轻量级web框架。它主要用于处理Web层的请求并将业务逻辑、数据和视图进行分离实现各个组件之间的解耦从而提高代码的可读性和可维护性。
具体来说Spring MVC的核心结构由模型Model、视图View和控制器Controller三部分组成。模型负责处理业务逻辑和数据视图用于呈现数据给用户而控制器则负责处理用户请求并返回相应的视图。
工作原理通常是用户的请求先到达控制器控制器根据请求的信息调用相应的模型进行处理模型处理完成后将结果返回给控制器然后控制器根据模型返回的结果调用相应的视图生成用户可见的页面。
Spring MVC的优点包括 低分层设计Spring MVC将应用程序分为不同的层次包括数据访问层、业务逻辑层、控制层和视图层提高了代码的模块化程度便于维护和测试。 轻量级Spring MVC是一个轻量级的框架使用灵活没有过多的约束可以自由选择适合自己的技术。 强大的注解支持Spring MVC提供了丰富的注解来简化配置例如RequestMapping、RequestParam等使开发人员能够更专注于业务逻辑的实现。 与Spring框架的集成Spring MVC可以与Spring框架的其他组件无缝集成例如Spring Security用于实现安全性控制Spring Data JPA用于简化数据库操作等。
总之Spring MVC是一款优秀的Java Web框架它采用了MVC设计模式简化了外部开发的工作流程提高了代码的可读性和可维护性同时提供了丰富的注解支持使开发人员能够更专注于业务逻辑的实现。
springboot
Springboot是spring的子项目称为一站式解决方案集成了外部很多的优秀的框架如常用的mysql、jdbcSpring Boot旨在简化Spring应用程序的开发和部署。
主要优点
通过maven导入各种jar包可以减少jar包的冲突屏息了繁琐的xml配置文件集成的开发框架可以做到开箱即用
主要缺点
学习曲线陡峭
开箱即用—在初始的状态下即可使用无需额外的配置或自定义设置。一站式解决方案—一站式解决方案在许多领域中都有应用如云计算、企业资源规划ERP、客户关系管理CRM等。它们旨在简化复杂性提高效率并为用户提供一个一站式的平台来满足他们的需求。什么是 Spring Boot
多年来随着新功能的增加spring 变得越来越复杂。只需访问 https://spring.io/projects
页面我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如果必
须启动一个新的 Spring 项目我们必须添加构建路径或添加 Maven 依赖关系配置应用程
序服务器添加 spring 配置。因此开始一个新的 spring 项目需要很多努力因为我们现
在必须从头开始做所有事情。
Spring Boot 是解决这个问题的方法。Spring Boot 已经建立在现有 spring 框架之上。使用
spring 启动我们避免了之前我们必须做的所有样板代码和配置。因此Spring Boot 可以
帮助我们以最少的工作量更加健壮地使用现有的 Spring 功能。
Spring Boot 有哪些优缺点
Spring Boot 的优点有
减少开发测试时间和努力。使用 JavaConfig 有助于避免使用 XML。避免大量的 Maven 导入和各种版本冲突。提供意见发展方法。通过提供默认值快速开始开发。没有单独的 Web 服务器需要。这意味着你不再需要启动 TomcatGlassfish 或其他任何东西。需要更少的配置 因为没有 web.xml 文件。只需添加用 Configuration 注释的类然后添加用Bean 注释的方法Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将Autowired 添加到 bean 方法中以使 Spring 自动装入需要的依赖关系中。基于环境的配置使用这些属性您可以将您正在使用的环境传递到应用程序-Dspring.profiles.active {enviornment}。在加载主应用程序属性文件后Spring 将在application{environment} .properties中加载后续的应用程序属性文件。
Spring Boot 的缺点有
什么是Spring Boot Spring Boot是一个开源的Java框架用于快速创建和部署独立的、生产级别的Spring应用程序。 它的主要优点是什么 通过maven导入各种jar包可以减少jar包的冲突屏息了繁琐的xml配置文件集成的开发框架可以做到开箱即用 Spring Boot和Spring框架之间的关系是什么 Spring Boot是构建在Spring框架之上的它简化了Spring应用程序的开发和部署。Spring Boot利用Spring框架的核心功能并提供了额外的自动化配置和便利的特性。 Spring Boot利用Spring框架的核心功能IOC和AOP。 ioc为了解决对象管理和对象依赖的问题。本来要手动new出来的对象现在交给spring的ioc容器进行管理ioc容器可以理解为一个对象工厂我们把对象交给工厂处理工厂管理对象的创建以及依赖关系当我们需要使用对象的时候从工厂获取即可。控制反转是一种思想依赖注入是实现的方式。依赖注入有三种实现方式分别是构造函数注入setter方法注入字段注入字段注入要使用Autowired注解进行标记。ioc好处就是方便对对象进行集中管理和解耦合提高代码的可复用性以及降低开发成本减少基础代码的编写和维护。如果你自己new对象的话那什这个对象还得你自己去管理甚至自己还得去创建工厂但这些也是spring提供了的并且spring还有一套完整的生命周期管理直接拿来用即可。spring aop 是非业务代码抽取他的底层是动态代理在spring中实现的依赖是BeanPostProcessor如果我们需要在某个上下文中插入一些重复性的非业务代码那就可以使用spring aop。代理模式好处出就是解耦方便业务的拓展把公共业务交给代理角色做好业务的分工。静态代理和动态代理静态代理可以理解为租客去找专门的中介去租房但是会存在一个问题每个租客去租房的时候要找自己想要的那个房子的中介也就是说每次都要创建代理类造成代码冗余而动态代理很好的解决了这个问题动态代理在运行时生成代理对象。 如何创建一个Spring Boot应用程序请简要描述创建一个简单的Spring Boot应用程序的步骤。 创建一个新的Maven或Gradle项目。添加Spring Boot的起步依赖。创建一个主应用程序类并使用SpringBootApplication注解进行标记。编写业务逻辑和处理程序。使用构建工具Maven或Gradle构建和运行应用程序。 Spring Boot的自动配置是如何工作的它是如何简化开发过程的 Spring Boot通过扫描类路径和配置文件中的依赖关系自动配置应用程序的各个部分。自动配置基于条件化根据应用程序的类路径和配置属性决定启用哪些功能。自动配置大大减少了开发人员需要手动配置的工作量简化了应用程序的搭建和部署过程。 如何在Spring Boot应用程序中配置数据库连接 在application.properties或application.yml文件中配置数据库连接属性如数据库URL、用户名和密码。使用Spring Boot提供的数据源自动配置例如spring-boot-starter-data-jpa、spring-boot-starter-data-mongodb等。 Spring Boot中的Starter是什么它们的作用是什么 Starter是一组预配置的依赖项用于简化特定功能的集成。Starter提供了所需的依赖项和自动配置以便快速启动和使用特定的技术栈或功能。 如何在Spring Boot应用程序中处理跨域请求 在主应用程序类上使用CrossOrigin注解或使用全局配置WebMvcConfigurer来处理跨域请求。 如何在Spring Boot中实现日志记录
Spring Boot默认使用Logback作为日志记录框架。通过在application.properties或application.yml中配置日志级别和输出格式可以自定义日志记录行为。 Spring Boot中的Actuator是什么它提供了哪些功能 Actuator是Spring Boot的一个扩展模块提供了监控和管理应用程序的功能。它可以提供应用程序的健康状况、性能指标、配置信息等还可以暴露端点用于远程管理和监控。 如何在Spring Boot应用程序中进行单元测试 使用JUnit等测试框架编写测试类。使用Spring Boot的测试注解如SpringBootTest、MockBean等。使用MockMvc或TestRestTemplate进行集成测试。 Spring Boot的优点是什么它在开发中的实际应用场景是什么 Spring Boot简化了Spring应用程序的开发、配置和部署。它提供了自动配置、起步依赖、快速开发和可扩展性等特性。Spring Boot适用于构建各种类型的应用程序包括Web应用、微服务、RESTful API等。 如何处理Spring Boot应用程序的异常和错误 使用Spring的异常处理机制例如ControllerAdvice和ExceptionHandler。自定义异常类并创建适当的异常处理程序。使用Spring Boot提供的错误处理机制来处理未捕获的异常和错误。 SpringBoot启动时配置文件的运行顺序。 application.properties/application.yml这是默认的配置文件位于classpath的根目录下。它包含了应用程序的通用配置。application-{profile}.properties/application-{profile}.yml这些是针对特定配置文件的配置文件其中{profile}是激活的配置文件的名称。例如如果激活了dev配置文件那么Spring Boot将加载application-dev.properties或application-dev.yml。在Spring Boot中可以使用spring.config.name和spring.config.location属性来指定其他的配置文件名称和位置。spring.config.name用于指定配置文件的基本名称不包括文件扩展名spring.config.location用于指定配置文件的位置。如果指定了spring.config.locationSpring Boot将只加载指定位置的配置文件并忽略默认的配置文件。配置文件的加载顺序是按照上述规则从上到下的顺序进行的。在加载过程中后面加载的配置文件会覆盖前面加载的配置文件中的相同属性。
springcloud
什么是Spring Cloud Spring Cloud是一个用于构建分布式系统和微服务架构的开发工具集合。它提供了一系列开箱即用的模块和组件用于解决微服务架构中的常见问题如服务发现、服务调用、负载均衡、配置管理等。 Spring Cloud和Spring Boot之间的关系是什么 Spring Boot是用于快速创建和部署独立的Spring应用程序的框架而Spring Cloud是构建在Spring Boot之上的用于开发分布式系统和微服务的工具集合。Spring Boot简化了Spring应用程序的开发和部署而Spring Cloud提供了更多的分布式系统的功能和支持。 什么是服务注册和发现Spring Cloud中如何实现服务注册和发现 服务注册和发现是指将各个微服务实例注册到服务注册中心并通过服务注册中心来发现和获取服务实例的过程。Spring Cloud中常用的服务注册和发现组件是Netflix Eureka和Consul。服务提供者通过向服务注册中心注册自己的信息而服务消费者则通过查询服务注册中心获取可用的服务实例列表。 什么是服务调用和负载均衡Spring Cloud中如何实现服务调用和负载均衡 服务调用是指在微服务架构中一个服务通过网络调用另一个服务提供的接口或方法。负载均衡是指将请求分发到多个服务实例上以实现请求的均衡分配和高可用性。Spring Cloud中常用的服务调用和负载均衡组件是Netflix Ribbon和OpenFeign。它们提供了客户端负载均衡的能力可以根据配置和算法选择合适的服务实例来进行请求。 什么是配置中心Spring Cloud中如何实现配置中心 配置中心是用于集中管理和动态配置微服务应用程序的配置信息的系统。它可以将应用程序的配置信息独立于代码进行管理实现配置的集中化和动态更新。Spring Cloud中常用的配置中心组件是Spring Cloud Config。它通过将配置文件存储在版本控制系统如Git中并提供RESTful接口来实现配置的集中管理和动态更新。 什么是断路器模式Spring Cloud中如何实现断路器模式 断路器模式是一种容错机制用于处理分布式系统中的故障和异常情况防止故障扩散和系统崩溃。它通过在调用链路上设置断路器当某个服务出现故障或超时时可以快速失败并返回预先定义的降级响应。Spring Cloud中常用的断路器模式组件是Netflix Hystrix。它提供了断路器、隔离、降级、缓存等功能可以帮助开发者构建弹性和可靠的分布式系统。 什么是服务网关Spring Cloud中如何实现服务网关 服务网关是位于微服务架构前端的入口用于统一访问和处理来自客户端的请求。它可以提供路由、认证、鉴权、限流、日志记录等功能。Spring Cloud中常用的服务网关组件是Spring Cloud Gateway和Netflix Zuul。它们提供了灵活的路由配置和过滤器机制可以对请求进行转发、过滤和增强。
redis 什么是Redis RedisRemote Dictionary Server是一个开源的内存数据存储系统它支持键值对、数据结构、发布/订阅等功能。它被广泛用作缓存、消息队列、会话存储等。 Redis支持哪些数据结构 Redis支持多种数据结构包括字符串Strings、哈希Hashes、列表Lists、集合Sets、有序集合Sorted Sets等。这些数据结构可以满足不同场景下的需求。 Redis的优点是什么 Redis具有以下优点 高性能Redis存储在内存中读写速度非常快。支持丰富的数据结构Redis提供了多种数据结构使其适用于不同类型的应用。数据持久化Redis支持将数据持久化到磁盘以防止数据丢失。高可用性Redis支持主从复制和哨兵机制实现高可用性和故障转移。扩展性Redis可以通过集群模式进行水平扩展处理大规模数据集。 Redis与Memcached有什么区别 Redis和Memcached都是常用的内存数据存储系统但有以下区别 数据结构Redis支持丰富的数据结构而Memcached只支持简单的键值对。数据持久化Redis支持数据持久化到磁盘而Memcached不支持。复制和故障转移Redis支持主从复制和哨兵机制实现高可用性和故障转移而Memcached没有内置的复制和故障转移机制。扩展性Redis可以通过集群模式进行水平扩展而Memcached需要使用客户端分片来进行扩展。 Redis的持久化方式有哪些 Redis有两种持久化方式 RDBRedis Database持久化将内存中的数据定期快照保存到磁盘上的二进制文件。AOFAppend-Only File持久化将每个写操作追加到文件中以记录数据变化的日志。 Redis如何处理并发访问 Redis是单线程的但通过使用事件驱动的方式处理并发请求。它使用事件循环和非阻塞I/O来实现高效的并发处理。此外Redis提供了事务和乐观锁等机制来处理并发访问。 Redis的数据淘汰策略是什么 Redis提供了多种数据淘汰策略包括 LRULeast Recently Used淘汰最近最少使用的数据。LFULeast Frequently Used淘汰使用频率最低的数据。TTLTime To Live设置数据的过期时间在过期后自动淘汰。 Redis支持哪些复制方式 Redis支持主从复制。主节点将数据同步到一个或多个从节点从节点可以接受读请求提高读取性能和可用性。 Redis如何实现发布/订阅 Redis使用发布/订阅模式来实现消息发布和订阅。客户端可以通过订阅特定的频道当有消息发布到该频道时客户端将收到相应的消息。 Redis的应用场景有哪些 Redis的应用场景包括 缓存作为高性能的缓存存储提高访问速度。会话存储存储用户会话信息实现分布式会话管理。消息队列通过Redis的列表结构实现简单的消息队列。计数器和排行榜使用Redis的计数器和有序集合实现计数和排行功能。实时数据处理存储和处理实时数据如实时统计、在线用户等。
MybatisPlus 什么是MyBatis-Plus MyBatis-Plus简称MP是一个基于MyBatis的增强工具提供了一系列简化开发的特性和功能。它扩展了MyBatis的功能提供了更方便的CRUD操作、代码生成、分页查询、乐观锁、逻辑删除等功能。 MyBatis-Plus和MyBatis之间的关系是什么 MyBatis-Plus是基于MyBatis的增强工具它简化了MyBatis的开发流程提供了更多的便捷特性和功能。可以说MyBatis-Plus是在MyBatis的基础上进行扩展和增强的工具。 MyBatis-Plus的核心特性有哪些 MyBatis-Plus的核心特性包括 简化的CRUD操作提供了基础的增删改查操作减少了编写重复代码的工作量。代码生成支持根据数据库表结构自动生成实体类、Mapper接口和XML映射文件。分页查询提供了简单的分页查询功能方便处理大量数据的分页显示。乐观锁支持乐观锁机制用于处理并发修改时的数据一致性问题。逻辑删除提供了逻辑删除的功能通过标记删除状态而不是真正删除数据。条件构造器支持使用链式调用构建复杂的查询条件。自动填充支持在插入或更新数据时自动填充指定的字段值。 如何使用MyBatis-Plus进行代码生成 可以使用MyBatis-Plus提供的代码生成器功能来自动生成实体类、Mapper接口和XML映射文件。需要配置生成器的相关参数如数据库连接信息、表名、生成路径等。执行代码生成命令后就会根据配置生成对应的代码文件。 MyBatis-Plus如何实现分页查询 MyBatis-Plus通过Page对象和PageHelper类实现分页查询。可以在查询方法中传入Page对象作为参数并使用PageHelper类提供的静态方法进行分页设置然后通过Page对象获取分页查询的结果。 MyBatis-Plus如何实现乐观锁 MyBatis-Plus通过在实体类中添加Version注解并在数据库表中添加版本号字段实现乐观锁。在更新数据时会比较版本号是否一致如果一致则更新数据并增加版本号如果不一致则表示数据已被其他线程修改需要进行相应的处理。 如何使用MyBatis-Plus进行条件查询 MyBatis-Plus通过QueryWrapper和LambdaQueryWrapper提供了强大的条件构造器可以使用链式调用的方式构建复杂的查询条件。可以通过设置条件、排序、分组等来筛选出满足条件的数据。 MyBatis-Plus支持哪些数据库 MyBatis-Plus支持多种数据库包括MySQL、Oracle、SQL Server、PostgreSQL等常见的关系型数据库。 如何实现逻辑删除功能 MyBatis-Plus通过在实体类的逻辑删除字段上添加TableLogic注解并配置逻辑删除的值实现逻辑删除功能。在删除数据时会将逻辑删除字段的值更新为指定的逻辑删除标记而不是真正删除数据。 MyBatis-Plus与Spring Boot集成需要哪些配置 需要在application.properties或application.yml中配置MyBatis-Plus的相关属性如数据源配置、实体类扫描路径、Mapper接口扫描路径等。同时还需要在启动类上添加MapperScan注解指定Mapper接口的扫描路径。
spring security 什么是Spring Security Spring Security是一个用于在Java应用程序中提供身份验证和授权的强大框架。它可以用于保护Web应用程序、REST API和方法级别的安全性提供了各种功能如用户认证、访问控制、记住我功能、单点登录等。 Spring Security的核心原理是什么 Spring Security的核心原理是基于过滤器链Filter Chain的安全处理机制。请求经过一系列的过滤器每个过滤器负责执行特定的安全任务如用户认证、权限检查等。通过配置不同的过滤器可以实现不同的安全策略。 Spring Security提供的身份验证方式有哪些 Spring Security提供了多种身份验证方式包括基于表单的身份验证、HTTP基本身份验证、LDAP身份验证、OpenID身份验证等。可以根据应用程序的需求选择合适的身份验证方式。 如何配置Spring Security 可以通过在Spring配置文件中配置Spring Security的相关属性来进行配置。可以设置用户认证方式、访问控制规则、记住我功能、登录页面等。另外还可以使用Java配置或注解方式进行Spring Security的配置。 Spring Security中的角色和权限有什么区别 角色和权限是Spring Security中的两个重要概念。角色是用于对用户进行分类的表示用户具有的某种角色而权限表示用户可以执行的特定操作或访问的资源。一个用户可以具有多个角色而每个角色可以拥有多个权限。 如何实现自定义的用户认证 可以实现自定义的用户认证逻辑通过实现UserDetailsService接口的loadUserByUsername()方法自定义加载用户信息的逻辑。可以从数据库、LDAP等数据源中获取用户信息并返回一个实现了UserDetails接口的对象。 如何实现方法级别的安全性控制 可以使用Spring Security的PreAuthorize和PostAuthorize注解来实现方法级别的安全性控制。通过在方法上添加这些注解并提供相应的表达式可以对方法的访问进行权限控制。 Spring Security中的记住我功能是如何实现的 Spring Security的记住我功能通过在用户登录成功后生成一个持久的cookie并将该cookie存储在客户端。下次用户访问时系统会自动读取cookie中的用户信息并进行自动登录。 如何实现单点登录SSO 实现单点登录可以使用Spring Security提供的AuthenticationEntryPoint和AuthenticationSuccessHandler接口结合其他技术如OAuth、SAML等实现。在SSO场景中用户只需要登录一次即可访问多个关联应用提供了便捷和安全的用户体验。 如何处理Spring Security的异常 Spring Security抛出的异常通常需要进行适当的处理可以使用ExceptionTranslationFilter和AuthenticationEntryPoint来处理认证和授权异常。可以配置自定义的异常处理器用于捕获和处理Spring Security抛出的异常。
git 什么是Git Git是一个分布式版本控制系统用于追踪和管理项目代码的变化。它允许多个开发者在同一个项目上并行工作并提供了版本控制、分支管理、合并等功能。 Git和SVN有什么区别 Git是分布式的而SVN是集中式的版本控制系统。在Git中每个开发者都可以在本地拥有完整的代码仓库可以在没有网络连接的情况下进行工作。而在SVN中开发者需要依赖中央服务器来获取代码。 Git的工作流程是什么样的 Git的工作流程通常包括克隆Clone、修改Modify、提交Commit、推送Push和拉取Pull。开发者通过克隆远程仓库获取代码在本地进行修改并提交到本地仓库然后将变更推送到远程仓库其他开发者可以拉取最新代码。 Git中的分支是什么如何创建和切换分支 分支是Git中用于并行开发和管理代码变化的重要概念。可以使用git branch命令创建新分支并使用git checkout命令切换到不同的分支。 Git的常用命令有哪些 常用的Git命令包括git clone克隆远程仓库、git add添加文件到暂存区、git commit提交变更到本地仓库、git push推送变更到远程仓库、git pull拉取最新代码、git branch查看分支、git checkout切换分支、git merge合并分支等。 如何解决代码冲突 当多个开发者对同一个文件的同一部分进行修改时就会产生代码冲突。解决冲突通常需要手动编辑冲突文件查看冲突标记并选择合适的代码。解决冲突后需要重新提交变更。 Git中的.gitignore文件的作用是什么 .gitignore文件用于指定Git忽略的文件和文件夹以避免将其纳入版本控制。通常在该文件中添加临时文件、编译输出文件、IDE生成的文件等。 如何撤销已提交的变更 可以使用git revert命令撤销单个提交并生成一个新的提交来还原变更。或者使用git reset命令回退到之前的提交但要注意这种操作会改变提交历史可能会造成数据丢失。 如何查看提交历史 可以使用git log命令查看提交历史记录。可以添加不同的选项来获取不同的提交信息如作者、日期、变更等。 如何将本地仓库与远程仓库关联 可以使用git remote add命令将本地仓库与远程仓库关联起来以便进行推送和拉取操作。
微服务
什么是微服务 微服务是一种架构风格将一个大型应用程序拆分为一组小型、独立部署的服务。每个服务都可以独立开发、部署和扩展并通过轻量级的通信机制如HTTP/REST进行通以下优点 独立开发和部署每个微服务可以独立开发、测试和部署提高了开发效率和灵活性。松耦合每个微服务都是独立的可以使用不同的技术栈和语言降低了耦合性。可扩展性每个微服务可以独立地进行水平扩展以满足不同服务的需求。容错性一个微服务的故障不会影响整个应用程序提高了容错性和可用性。易于维护由于每个微服务都相对较小因此更容易理解和维护。 微服务架构的挑战是什么 微服务架构面临以下挑战 分布式系统复杂性微服务架构涉及多个分布式服务之间的通信和协调增加了系统的复杂性。服务间通信微服务之间的通信需要设计和管理可能会引入网络延迟和故障。数据一致性数据的一致性变得更加复杂需要使用合适的机制来处理数据一致性问题。部署和运维微服务架构需要对大量的服务进行部署、监控和管理增加了运维的复杂性。团队组织和沟通微服务架构需要跨多个团队进行协作需要良好的组织和沟通。 如何实现微服务之间的通信 微服务之间的通信可以使用多种方式包括 HTTP/REST通过HTTP协议和RESTful风格的API进行通信。消息队列使用消息队列作为中间件实现异步通信和解耦。RPC使用远程过程调用RPC框架进行微服务之间的通信。事件驱动通过事件发布和订阅机制进行微服务之间的通信。 如何保证微服务架构中的数据一致性 在微服务架构中保证数据一致性可以使用以下方法 异步通信通过消息队列等方式实现异步通信降低了数据一致性的要求。两阶段提交2PC使用两阶段提交协议来保证分布式事务的一致性。补偿事务当某个服务发生故障时使用补偿事务来回滚之前的操作。事件溯源使用事件溯源机制来记录和回放事件保证数据的一致性和可追溯性。 微服务架构和单体架构相比有什么优势和劣势
微服务架构的优势包括灵活性、可扩展性、独立部署和维护性而劣势包括系统复杂性、服务间通信和数据一致性的挑战。
微服务架构中的服务发现和负载均衡如何实现
服务发现可以使用服务注册中心如Consul、Eureka来实现微服务通过注册到服务注册中心其他服务可以通过查询服务注册中心来发现服务。负载均衡可以通过使用负载均衡器如Nginx、Ribbon来实现将请求分发到不同的服务实例上。
如何进行微服务架构的监控和容错处理
监控可以通过使用监控工具如Prometheus、Grafana来收集和可视化微服务的运行指标。容错处理可以使用断路器如Hystrix来实现当某个服务出现故障时断路器可以快速切换到备用逻辑避免级联故障。
什么是API网关API Gateway
API网关是微服务架构中的入口点负责处理所有的外部请求并将其路由到相应的微服务。它可以实现请求转发、负载均衡、安全认证、缓存等功能。 如何实现微服务的部署和自动化运维 微服务的部署和自动化运维可以使用容器技术如Docker、Kubernetes来实现通过容器化每个微服务并使用自动化工具如Jenkins、Ansible来进行部署和管理。
7月30号 java实习广东小厂面试
自我介绍
Java8新特性详解
介绍 Java 的集合类
spring中的注解有哪些
spring事务处理
post和get POST和GET是HTTP协议中常用的两种请求方法用于在客户端如浏览器和服务器之间传递数据。它们有不同的特点和用途 GET请求 GET用于从服务器获取资源或数据。GET请求将参数附加在URL的查询字符串中以?符号分隔URL和参数参数之间使用符号分隔。GET请求的参数通常会显示在URL中因此不适合传递敏感信息。GET请求可以被缓存可以被收藏为书签。GET请求具有幂等性即多次发送相同的GET请求不会对服务器产生副作用。 POST请求 POST用于向服务器提交数据通常用于创建、更新或发送数据到服务器上的资源。POST请求将参数包含在请求的主体中而不是在URL中。POST请求的参数不会在URL中显示因此适合传递敏感信息。POST请求不会被缓存不能被收藏为书签。POST请求不具有幂等性即多次发送相同的POST请求可能会对服务器产生不同的副作用。 对cookie和session了解存储位置
异常处理
springcloud中的组件了解哪些
http中关于各个状态码怎么分类的了解哪些
1xx信息类表示接收的请求正在处理。
100 Continue服务器已接收到请求的初始部分并且客户端应继续发送剩余的请求。
2xx成功表示请求已成功处理。
200 OK请求成功服务器已返回请求的内容。201 Created请求已成功处理并在服务器上创建了新的资源。204 No Content服务器已成功处理请求但没有返回任何内容。
3xx重定向表示需要进一步操作才能完成请求。
301 Moved Permanently请求的资源已永久移动到新位置。302 Found请求的资源临时移动到新位置。304 Not Modified客户端可以使用缓存的版本因为资源未被修改。
4xx客户端错误表示请求包含错误或无法完成请求。
400 Bad Request请求无效服务器无法理解。401 Unauthorized请求需要身份验证。404 Not Found请求的资源不存在。
5xx服务器错误表示服务器在处理请求时遇到错误。
500 Internal Server Error服务器遇到意外错误无法完成请求。503 Service Unavailable服务器当前无法处理请求通常是由于过载或维护。
过滤器和拦截器的区别
1、触发时机不同 过滤器Filter是在请求进入容器后但在进入servlet之前进行预处理请求结束是在servlet处理完以后。拦截器 Interceptor 是在请求进入servlet后在进入Controller之前进行预处理的Controller 中渲染了对应的视图之后请求结束。
2、拦截的请求范围不同 过滤器Filter执行了两次拦截器Interceptor只执行了一次。这是因为过滤器几乎可以对所有进入容器的请求起作用而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。 8月6号 某小厂面试
1.spring ioc aop IOCInversion of Control是一种设计原则它将原本由程序员手动创建和管理的对象交给Spring容器来管理。Spring容器充当对象工厂的角色负责对象的创建和依赖关系的管理。通过IOC当我们需要使用对象时只需从容器中获取即可。 实现IOC的方式之一是依赖注入Dependency Injection。依赖注入可以通过以下三种方法来实现 注解注入使用注解如Autowired、Resource来标注需要注入的依赖对象Spring容器会根据注解信息自动完成对象的创建和注入。Setter注入通过为依赖对象提供对应的setter方法在XML配置或者注解中配置依赖关系Spring容器在创建对象时会自动调用setter方法来完成依赖注入。构造方法注入通过在构造方法中声明依赖参数Spring容器会根据构造方法的参数信息来创建对象并完成依赖注入。 AOPAspect-Oriented Programming是一种编程范式它允许在程序的某个特定点切入点插入非业务性的代码比如日志记录等。这些代码被称为切面Aspect可以通过AOP来实现。 2.arraylist和linkedlist哪个查询快 ArrayList和LinkedList在查询、删除和插入操作上具有不同的性能特点。 查询ArrayList的查询速度较快因为它内部使用数组实现可以通过索引直接访问元素时间复杂度为O(1)。而LinkedList需要从头或尾开始遍历链表直到找到目标元素时间复杂度为O(n)。删除和插入LinkedList在删除和插入操作上比ArrayList更快。当需要删除或插入元素时ArrayList需要移动其他元素以保持连续性导致时间复杂度为O(n)。而LinkedList只需要更改相邻节点的指针时间复杂度为O(1)。特别是在链表的首尾操作上LinkedList表现更为突出。 3.java基本数据类型 基本数据类型指的是Java语言中的基本数据类型包括整型、浮点型、布尔型和字符型。以下是Java中的基本数据类型 整型 int用于表示整数占用4个字节。byte1个字节范围为-128到12long用于表示长整数占用8个字节。short用于表示短整数占用2个字节。 浮点型 float用于表示单精度浮点数占用4个字节。double用于表示双精度浮点数占用8个字节。 布尔型 boolean用于表示逻辑值只有两个取值true和false。 字符型 char用于表示单个字符占用2个字节。 4.自动装箱拆箱 自动装箱就是将基本数据类型用对应的引用数据类型封装起来 比如 int a1; Interge wa; 自动拆箱就是指将包装类对象自动转换为对应的基本数据类型。 比如 Interge a1; int wa; 5.关系型数据库用过吗 用过比如mysqlsqlserver 6.mysql连接方式 JDBC连接使用Java数据库连接JDBCAPI通过驱动程序连接到MySQL数据库导入库在配置文件中配置urlusernamepassword。命令行连接使用MySQL命令行客户端通过命令行界面连接到MySQL数据库mysql -u -pusername为主机名或者主机的IP地址。图形化工具连接使用图形化工具如Navicat Premium 15等连接到MySQL数据库。编程语言连接通过编程语言的MySQL连接库如Python的MySQLdb、PHP的mysqli扩展等连接到MySQL数据库。 7.内连接和外连接 内连接内连接根据两个或多个表之间的匹配条件返回同时在这些表中存在的行。只有满足连接条件的行才会被返回其他行将被过滤掉。外连接外连接根据连接条件返回左表左外连接或右表右外连接中的所有行同时根据连接条件匹配的行将被返回。如果没有匹配的行将使用NULL值填充缺失的列。 将使用一个名为 Employees 的表和一个名为 Departments 的表来演示。 Employees 表包含员工的信息具有以下列 EmployeeID: 员工IDEmployeeName: 员工姓名 DepartmentID: 所属部门ID 下面是 Employees 表的示例数据 EmployeeIDEmployeeNameDepartmentID1John12Mary23David14Lisa3 Departments 表包含部门的信息具有以下列 DepartmentID: 部门IDDepartmentName: 部门名称 下面是 Departments 表的示例数据 DepartmentIDDepartmentName1Sales2Marketing3Finance4HR 现在我们可以使用内连接和外连接来获取不同的结果 内连接Inner Join 内连接会返回同时存在于两个表中的匹配行。 示例查询 SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentID Departments.DepartmentID;查询结果 EmployeeNameDepartmentNameJohnSalesMaryMarketingDavidSalesLisaFinance上述结果显示了员工的姓名和他们所属的部门名称仅包括存在于 Employees 表和 Departments 表中的匹配行。 左外连接Left Outer Join 左外连接会返回所有的左表行以及与左表匹配的右表行。如果右表中没有匹配的行则使用 NULL 值填充右表的列。 示例查询 SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments ON Employees.DepartmentID Departments.DepartmentID;查询结果 EmployeeNameDepartmentNameJohnSalesMaryMarketingDavidSalesLisaFinance注意左外连接的查询结果与内连接的结果相同。这是因为在这个示例中所有的员工都有所属的部门没有员工没有部门。 右外连接Right Outer Join 右外连接会返回所有的右表行以及与右表匹配的左表行。如果左表中没有匹配的行则使用 NULL 值填充左表的列。 示例查询 SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments ON Employees.DepartmentID Departments.DepartmentID;查询结果 EmployeeNameDepartmentNameJohnSalesMaryMarketingDavidSalesNULLHR上述结果显示了部门的名称以及与之匹配的员工姓名。注意到最后一行中的员工姓名为 NULL这是因为 “HR” 部门在 Employees 表中没有匹配的员工。 8.主键和外键 主键主键是用于唯一标识表中每一行数据的列或列组合。它具有唯一性和非空性约束用于确保每一行都有唯一的标识并且不允许为空值。主键可以帮助在表中快速查找和识别特定的行。外键外键是表中的一个列它创建了与另一个表中的主键之间的关联。外键用于建立表之间的关系它指向其他表中的主键用于实现表之间的引用完整性。外键可以用于实现表之间的关联查询和数据一致性。 8月15
华创云鼎面试:
1、项目:项目业务介绍、项目人员组成
2、分布式锁用过哪些 基于数据库的锁可以使用关系型数据库的事务和行级锁来实现分布式锁。通过在数据库中创建一个标志位或特定的锁表来表示资源的锁定状态其他进程在访问该资源之前需要先获取该锁。这种方法的优势是使用了数据库的事务机制来确保锁的原子性。 基于缓存的锁使用分布式缓存系统如Redis或Memcached来实现锁。通过在缓存中设置一个特定的键值对来表示资源的锁定状态其他进程在访问该资源之前需要先获取该锁。这种方法的优势是缓存系统的高性能和支持分布式部署。 基于ZooKeeper的锁ZooKeeper是一个开源的分布式协调服务可以用于实现分布式锁。通过在ZooKeeper中创建一个临时顺序节点来表示资源的锁定状态其他进程可以通过比较自己创建的节点与已存在节点的顺序来判断是否获取到锁。这种方法的优势是ZooKeeper提供了强一致性和高可靠性。 3、Linux常用命令 ls列出目录中的文件和子目录。cd切换当前工作目录。pwd显示当前工作目录的路径。mkdir创建新目录。rm删除文件或目录。cp复制文件或目录。mv移动文件或目录也可用于重命名文件。cat连接文件并打印到标准输出设备上。grep在文件中搜索指定模式的文本。chmod修改文件或目录的权限。chown修改文件或目录的所有者。chgrp修改文件或目录的所属组。tar打包和解压文件。find在指定目录中查找文件。ssh通过安全外壳协议远程登录到另一台计算机。ping向目标主机发送网络数据包以测试连接性。ifconfig显示和配置网络接口信息。wget从网络上下载文件。top实时显示系统中运行的进程和系统资源使用情况。ps显示当前运行的进程。 4、java8新特性 1、Lambda表达式和函数式接口使用Lambda表达式可以更简洁地编写函数式代码例如在集合中进行筛选、映射和聚合操作。您可以创建自定义的函数式接口并将Lambda表达式作为参数传递给接受函数式接口的方法。 2、Stream APIStream API提供了许多便利的方法来处理集合数据。例如您可以使用filter()方法过滤集合中的元素使用map()方法将元素进行转换使用sorted()方法对元素进行排序使用collect()方法将结果收集到一个新的集合中等等。 3、方法引用方法引用可以简化代码使得代码更加可读和易于维护。您可以使用方法引用来引用现有的方法例如静态方法、实例方法或构造方法。 4、新的日期和时间API新的日期和时间APIjava.time包提供了一套更好的日期和时间处理工具。您可以使用LocalDate、LocalTime和LocalDateTime等类来表示日期和时间执行各种日期和时间的计算和操作。 5、Spring的理解IOC、AOP在实际项目中怎么用的 Spring是一个开源的Java框架用于开发企业级应用程序。它提供了一种轻量级的、非侵入式的开发方式通过使用控制反转Inversion of ControlIoC和面向切面编程Aspect-Oriented ProgrammingAOP等技术简化了Java应用程序的开发过程。 控制反转IoC IoC是Spring框架的核心概念之一。它通过将对象的创建、依赖解析和生命周期管理等任务交给Spring容器来实现。在实际项目中您可以通过以下方式使用IoC 定义Bean在Spring配置文件如XML文件或使用注解如Component、Service等来标识类为Bean。Spring容器会负责创建和管理这些Bean。依赖注入Dependency InjectionDI通过构造函数、Setter方法或字段上的注解将依赖对象注入到目标对象中。Spring容器会自动解析依赖关系并将所需的依赖对象注入到目标对象中。 面向切面编程AOP AOP是一种编程范式用于解耦横切关注点如日志记录、事务管理等和核心业务逻辑。在Spring中您可以使用AOP来实现以下功能 切面Aspect定义横切关注点的行为如日志记录、事务管理等。切点Pointcut定义在哪些连接点Join Point上应用切面。通知Advice定义在切点上执行的具体操作如在方法执行前后进行日志记录等。织入Weaving将切面应用到目标对象的过程可以通过编译期织入、类加载期织入或运行时织入来实现。 在实际项目中您可以使用AOP来实现日志记录、事务管理、安全性检查等横切关注点。通过将这些关注点与核心业务逻辑进行分离可以提高代码的可维护性和重用性。 综合来说Spring框架提供了IoC容器来管理对象的创建和依赖注入以及AOP功能来实现横切关注点的解耦。通过合理地使用IoC和AOP可以使项目代码更加模块化、可测试和易于扩展。 6、数据库性能优化、SQL优化 确保适当的索引索引是加快数据库查询速度的关键。根据查询模式和表结构创建合适的索引可以显著提高查询性能。优化查询语句通过分析查询语句的执行计划可以确定性能瓶颈并进行优化。使用适当的JOIN语句、WHERE子句和排序等操作减少不必要的数据访问和处理。避免全表扫描尽量避免执行全表扫描操作可以使用索引或其他查询优化技术来减少查询所需的数据量。优化数据库设计良好的数据库设计可以提高查询和更新操作的性能。合理划分表和字段避免冗余和不必要的复杂性。调整数据库参数根据数据库系统的特点和硬件环境调整数据库参数如缓冲区大小、并发连接数等以提高性能。缓存数据和查询结果使用缓存技术可以减少数据库的访问次数提高响应速度。可以使用内存缓存、分布式缓存或查询结果缓存等方式。 7、用过什么设计模式 当解释设计模式时我将使用Java代码示例来说明单例模式、工厂模式和策略模式的概念和用法。 单例模式Singleton Pattern 单例模式确保一个类只有一个实例并提供一个全局访问点。 java public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数防止外部实例化}public static Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}
}在上述示例中通过将构造函数声明为私有的防止外部直接实例化对象。通过静态方法getInstance()来获取唯一的实例如果实例还不存在则创建一个新的实例并返回。这样可以确保在整个应用程序中只有一个Singleton实例。 工厂模式Factory Pattern 工厂模式通过使用工厂方法或抽象工厂来创建对象而不是直接实例化对象。 java public interface Product {void doSomething();
}public class ConcreteProduct implements Product {Overridepublic void doSomething() {System.out.println(Doing something in ConcreteProduct.);}
}public interface ProductFactory {Product createProduct();
}public class ConcreteProductFactory implements ProductFactory {Overridepublic Product createProduct() {return new ConcreteProduct();}
}在上述示例中Product是一个接口定义了产品的行为。ConcreteProduct是实现了Product接口的具体产品类。ProductFactory是一个工厂接口定义了创建产品的方法。ConcreteProductFactory是实现了ProductFactory接口的具体工厂类负责创建ConcreteProduct对象。 策略模式Strategy Pattern 策略模式定义了一系列算法将每个算法封装起来并使它们可以互换使用使得算法可以独立于使用它的客户端而变化。 java public interface Strategy {void execute();
}public class ConcreteStrategyA implements Strategy {Overridepublic void execute() {System.out.println(Executing strategy A.);}
}public class ConcreteStrategyB implements Strategy {Overridepublic void execute() {System.out.println(Executing strategy B.);}
}public class Context {private Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy strategy;}public void executeStrategy() {strategy.execute();}
}在上述示例中Strategy是一个接口定义了策略的行为。ConcreteStrategyA和ConcreteStrategyB是实现了Strategy接口的具体策略类分别表示不同的算法或行为。Context是上下文类维护一个对策略接口的引用并提供设置策略和执行策略的方法。 使用策略模式时可以创建一个Context对象并根据需要设置具体的策略然后调用executeStrategy()方法执行策略。这样可以在运行时动态切换不同的策略。 8、mysql索引数据结构为什么用它? 在MySQL中常用的索引数据结构包括B-tree索引和哈希索引。 B-tree索引 B-treeBalanced Tree是一种自平衡的树状数据结构常用于数据库索引。MySQL中的B-tree索引是基于B树实现的具有以下特点 支持范围查询B-tree索引可以高效地支持范围查询例如大于、小于、区间查询等。适用于有序数据B-tree索引对于有序数据的查询效率较高。支持高效的插入和删除B-tree索引在插入和删除数据时能够自动进行平衡调整保持树的平衡状态。提供数据的有序访问B-tree索引的叶子节点是按照索引顺序存储的可以提供有序的数据访问。 为什么使用B-tree索引 加快查询速度使用B-tree索引可以快速定位到满足查询条件的数据行提高查询效率。支持排序和范围查询B-tree索引可以高效地支持排序和范围查询操作。适用于大数据量B-tree索引适用于处理大量数据的情况可以提供较好的查询性能。 哈希索引 哈希索引使用哈希表来存储索引数据将索引键映射到哈希表中的桶bucket。MySQL中的哈希索引具有以下特点 快速哈希查找哈希索引使用哈希函数进行查找具有非常快速的查找速度通常为O(1)时间复杂度。不支持范围查询哈希索引只能支持精确匹配的查询不适合范围查询或排序操作。不支持部分索引键查询哈希索引要求查询条件必须包含所有哈希索引的键列。 为什么使用哈希索引 高速查找哈希索引在等值查询例如根据主键进行查询时具有非常快速的查找速度。适用于内存数据哈希索引适用于数据完全加载到内存中的情况可以提供非常高效的查询性能。 选择何种索引数据结构取决于具体的应用场景和查询需求。一般而言B-tree索引适用于大部分常见的查询场景而哈希索引适用于需要快速等值查询的内存数据。在MySQL中常见的索引类型包括主键索引、唯一索引、普通索引等可以根据具体的表结构和查询需求选择合适的索引类型和数据结构。 8月17号
衡泰一面
怎么安排工作进行工作的作为队长 需求分析阶段2022/12/22——2022/12/31 确定项目目标和参赛要求。分配团队成员的任务和侧重分工。提供参赛手册和项目简介引导团队成员广泛查阅资料和收集论文。组织讨论会确保团队对项目背景、规则和作品要求有整体性把握。 系统设计阶段2023/1/1——2023/1/20 根据需求分析阶段的成果组织团队进行系统设计。对多目标遗传算法和模拟退火算法模型进行对比并最终确定使用多目标遗传算法。完成架构设计、模块设计、接口设计和数据库设计。 系统实现阶段2023/1/21——2023/3/20 根据设计阶段的成果指导团队成员编写软件代码。进行单元测试确保每个模块的功能正常运行。进行系统测试和系统优化。完成系统相关文档的编写。 系统测试阶段2023/3/21——2023/3/31 制定测试计划包括功能测试、性能测试、安全测试和兼容性测试。按计划进行测试用例编写和执行进行缺陷管理。 撰写方案并系统提交阶段2023/4/1——2023/4/17 完善项目方案进行评估和审查。确保团队通过充分沟通和协作保证智能排班系统的可行性和合理性。提前发现和解决问题确保项目的顺利实施。完善研发成果和相关材料并按时提交给客户。 在以上每个阶段作为队长您需要与团队成员保持良好的沟通、协调和监督确保任务按时完成并提供必要的支持和指导。同时您还可以定期召开会议进行进度更新、问题解决和团队合作的促进。 怎么停止线程 要停止线程可以采用以下方法 使用标志位在线程的执行逻辑中使用一个标志位来控制线程是否继续执行。在外部需要停止线程的地方将标志位设为相应的值使得线程在下一次循环或条件判断时退出执行。 java // 定义标志位
private volatile boolean running true;// 线程执行逻辑
public void run() {while (running) {// 线程执行的操作// 检查标志位if (!running) {break; // 退出循环停止线程}}
}// 停止线程的方法
public void stopThread() {running false;
}在上述示例中线程的执行逻辑中通过检查标志位running来判断是否继续执行。在外部需要停止线程的地方调用stopThread()方法将标志位设为false从而使线程退出循环停止执行。 使用Thread的interrupt()方法可以调用线程的interrupt()方法来中断线程的执行。在线程的执行逻辑中在适当的地方通过检查Thread.currentThread().isInterrupted()来判断是否接收到中断信号并在必要的情况下退出线程的执行。 java // 线程执行逻辑
public void run() {while (!Thread.currentThread().isInterrupted()) {// 线程执行的操作}
}// 停止线程的方法
public void stopThread() {thread.interrupt();
}衡泰二面
之前 单例模式怎么实现懒汉写法怎么保证线程安全加synchronized,怎么加加在哪 单例模式的懒汉写法是一种延迟加载的方式在需要时才创建实例。实现懒汉写法的单例模式可以通过以下方式 java public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数}public static synchronized Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}
}在懒汉写法中通过在getInstance()方法上加上synchronized关键字可以保证线程安全。synchronized关键字用于保证在同一时间只有一个线程能够进入该方法从而避免了多线程环境下创建多个实例的问题。 synchronized关键字可以加在getInstance()方法上也可以加在代码块内部如下所示 java public static Singleton getInstance() {synchronized (Singleton.class) {if (instance null) {instance new Singleton();}}return instance;
}jvm的底层有了解过么 JVMJava虚拟机的底层是虚拟机实现的它负责将Java字节码转换为机器码并执行。JVM包括了类加载、内存管理、垃圾回收、线程管理等功能是Java程序运行的基础。 动态代理怎么实现的 常用的包有哪些并发包和集合包当时怎么也想不起来并发包这个名词就知道并发包里有哪些 提示了并发包和集合包后就让你说说包里面都有哪些常用的说一下你自己熟悉的经常用的。我说了集合类那些以及一些锁 常用的并发包和集合包包括 并发包java.util.concurrent Lock和ReentrantLock提供了替代synchronized关键字的锁机制。Semaphore用于控制同时访问某个资源的线程数量。CountDownLatch用于等待其他线程执行完毕再继续执行。CyclicBarrier用于多个线程之间的同步。ThreadPoolExecutor用于创建线程池。BlockingQueue用于实现线程间的数据共享。 集合包java.util List有序可重复集合如ArrayList、LinkedList。Set无序不可重复集合如HashSet、TreeSet。Map键值对集合如HashMap、TreeMap。 说下spring的理解 Spring是一个开源的Java框架用于简化Java应用程序的开发。它提供了一种轻量级的编程模型通过依赖注入和面向切面编程等技术使得开发人员可以更加专注于业务逻辑而不需要过多关注底层的技术细节。 说下springboot里面常用的注释 在Spring Boot中常用的注解包括 RestController用于标识一个类是RESTful风格的控制器。RequestMapping用于映射HTTP请求的URL路径。Autowired用于自动注入依赖对象。Resource java的注解属性较多type无法分辨时可以用name分辨 Autowired spring的注解一个属性type无法分辨时需要借助Qualifier注解才能使用Service用于标识一个类是服务层组件。Repository用于标识一个类是数据访问层组件。Component用于标识一个类是普通组件。Configuration用于标识一个类是配置类。Value用于注入配置属性值。 说下springmvc的底层实现以及自我理解 Spring MVC是基于Servlet API的MVCModel-View-Controller框架用于开发Web应用程序。它的底层实现主要依赖于Servlet容器如Tomcat。Spring MVC的工作流程如下 客户端发送HTTP请求到前置控制器。前置控制器根据请求的URL路径调用相应的Controller方法。Controller方法处理请求进行业务逻辑处理并返回ModelAndView对象。前置控制器根据视图解析器View Resolver解析视图并将模型数据传递给视图。视图渲染生成响应结果。前置控制器将响应结果返回给客户端。 说下mysql的函数有哪些怎么用 MySQL提供了许多内置函数用于在查询和处理数据时进行各种操作和计算。以下是一些常用的MySQL函数及其用法的示例 COUNT 函数用于计算满足条件的行数。 SELECT COUNT(*) FROM 表名; -- 计算表中的总行数
SELECT COUNT(列名) FROM 表名 WHERE 条件; -- 计算满足条件的行数SUM 函数用于计算某个列或表达式的总和。 SELECT SUM(列名) FROM 表名; -- 计算列的总和
SELECT SUM(列名) FROM 表名 WHERE 条件; -- 计算满足条件的列的总和AVG 函数用于计算某个列或表达式的平均值。 SELECT AVG(列名) FROM 表名; -- 计算列的平均值
SELECT AVG(列名) FROM 表名 WHERE 条件; -- 计算满足条件的列的平均值MAX 函数用于获取某个列或表达式的最大值。 SELECT MAX(列名) FROM 表名; -- 获取列的最大值
SELECT MAX(列名) FROM 表名 WHERE 条件; -- 获取满足条件的列的最大值MIN 函数用于获取某个列或表达式的最小值。 SELECT MIN(列名) FROM 表名; -- 获取列的最小值
SELECT MIN(列名) FROM 表名 WHERE 条件; -- 获取满足条件的列的最小值给你一个正在面试的场景面试官面试者动作进行类的创建 Static的理解 静态变量使用 static 关键字声明的变量称为静态变量或类变量。它们在内存中只有一份拷贝被所有类的实例共享。静态方法使用 static 关键字声明的方法称为静态方法。静态方法属于类不依赖于任何实例。可以通过类名直接调用静态方法而不需要创建类的实例。静态代码块使用 static 关键字定义的代码块称为静态代码块。它在类被加载时执行用于初始化静态变量或执行一些静态的初始化操作。 String为什么不可变 因为string是由final char value[] 表示的字符串是一个常量 Stringbuild如果加了final能改变内容吗 StringBuilder 类是可变的字符串序列可以用于拼接和修改字符串。当使用 final 关键字修饰 StringBuilder 对象时表示该对象的引用不可更改但对象本身仍然可以修改。因为StringBuilder类继承了AbstractStringBuilder 类的在这个类里面是用char value[]没有被final修饰的字符数组表示的所以是可变的. Jvm运行与编译的理解 JVM运行过程如下 编写Java源代码.java 文件。使用Java编译器javac 命令将源代码编译成字节码文件.class 文件。JVM将字节码文件加载到内存中。JVM解释执行字节码指令将字节码转换为机器码并运行。 编译是将高级语言代码转换为机器可以执行的指令的过程。在Java中编译器将Java源代码编译为字节码而不是直接编译为机器码。这使得Java程序可以实现平台无关性因为字节码可以在任何支持Java虚拟机的平台上运行。这也是java语言跨平台特性的原因。 垃圾回收 垃圾回收Garbage Collection是一种自动化的内存管理机制用于自动释放不再使用的内存对象。在Java中垃圾回收器负责跟踪和回收不再被引用的对象以释放内存空间并防止内存泄漏。 垃圾回收的工作原理如下 标记阶段垃圾回收器从根对象如栈和静态变量开始标记所有可达的对象。清除阶段垃圾回收器清除所有未标记的对象并回收它们所占用的内存空间。压缩阶段可选垃圾回收器将存活的对象压缩使它们连续存放以减少内存碎片化。 Mysql索引 主键索引Primary Key Index 主键索引是用于唯一标识数据库表中每一行的索引。它是一种特殊的唯一索引用于保证表中的每一行都具有唯一的标识符。主键索引的值不能为NULL并且在表中只能有一个主键索引。 例如考虑一个名为users的用户表其中有一个名为id的列作为主键索引。每个用户在id列上都有一个唯一的标识符可以通过该主键索引快速准确定位和访问。 唯一索引Unique Index 唯一索引是保证表中某一列或多列的值都是唯一的索引。唯一索引允许NULL值但在索引列中的非NULL值必须是唯一的。 例如考虑一个名为emails的电子邮件表其中有一个名为email_address的列使用唯一索引。该唯一索引确保每个电子邮件地址在email_address列上都是唯一的避免重复的邮件地址。 普通索引Normal/Index 普通索引是最常见的索引类型用于加快对表中列的查询速度。它没有唯一性或主键约束可以包含重复值。普通索引可以在表的一个或多个列上创建。 例如考虑一个名为products的产品表其中有一个名为product_name的列使用普通索引。这个普通索引可以加快根据产品名称进行查询的速度。 全文索引Full-Text Index 全文索引是用于执行全文搜索的一种特殊索引类型。它允许在文本字段中进行关键字搜索而不仅仅是精确匹配。全文索引适用于包含大量文本数据的列如文章内容或博客评论。 例如考虑一个名为articles的文章表其中有一个名为content的列使用全文索引。通过全文索引可以在content列中进行关键字搜索以找到包含特定词语或短语的文章。 给你一个场景问你索引会不会失效 使用不等于操作符 、!或IS NOT NULL条件。 对索引列进行函数操作或类型转换。 在查询条件中使用 OR 连接多个条件。 对索引列进行模糊搜索如使用通配符 %。
吉因加面试
1、线程创建方法
1、继承 Tread类 重写 run方法2、实现 Runnable接口实现 run方法3、实现 Callable接口实现 call方法该方式可以获取线程的执行结果2、多目标遗传算法实现
3、简历项目每个细节都要说清楚 重要
4、动态代理实现方式2个
1、JDK动态代理
2、Cglib动态代理5、状态码
1. 1xx信息类表示接收的请求正在处理。- 100 Continue服务器已接收到请求的初始部分并且客户端应继续发送剩余的请求。2. 2xx成功表示请求已成功处理。- 200 OK请求成功服务器已返回请求的内容。
- 201 Created请求已成功处理并在服务器上创建了新的资源。
- 204 No Content服务器已成功处理请求但没有返回任何内容。3. 3xx重定向表示需要进一步操作才能完成请求。- 301 Moved Permanently请求的资源已永久移动到新位置。
- 302 Found请求的资源临时移动到新位置。
- 304 Not Modified客户端可以使用缓存的版本因为资源未被修改。4. 4xx客户端错误表示请求包含错误或无法完成请求。- 400 Bad Request请求无效服务器无法理解。
- 401 Unauthorized请求需要身份验证。
- 404 Not Found请求的资源不存在。5. 5xx服务器错误表示服务器在处理请求时遇到错误。- 500 Internal Server Error服务器遇到意外错误无法完成请求。
- 503 Service Unavailable服务器当前无法处理请求通常是由于过载或维护。6、数组的扩容机制
2数组进行扩容时会将老数据中得元素重新拷贝一份道新的数组中每次数组容量得增长大于时原用量得1.5倍。3默认空参创建ArrayList长度是0当然也可以在创建时指定长度也可以放一个集合进去他就会使用c的大小做为容量如果放入的集合 为null的话会报空值针异常4第一次add添加时会默认初始化长度为105addAll没有元素时扩容为Math.max(10,实际元素个数)有元素时为Math.max(原容量1.5倍实际元素个数)
如果使用addAll添加元素时要添加的元素长度超过下一次要扩容的长度时他会使用要添加的元素作为扩容反正他们两个谁长度大就用谁。7、maven项目的目录 8、http的传输数据的方式
1GET获取资源GET方法用来请求访问已被URL识别的资源2POST传输实体主体POST方法用来请求服务器传输信息实体的主体GET和POST的区别首先使用目标不同GET方法只是用来查询不会对浏览器上的信息产生影响每次GET的方法都是相同的其次大小不同GET是放在URL首部因此大小随着浏览器而定而POST则是在报文中只要没有具体限制文件的大小是没限制的然后安全性不同GET采用的是明文传输而POST是放在报文内部无法看到从使用场景的角度来说一般像用户注册登录这种信息都是私密的采用POST而针对查询等为了快速大多采用GET传输。3PUT传输文件PUT要求在请求报文的主体中包含文件内容然后保存到请求URL指定的位置4HEAD获得报文首部HEAD和GET方法一样只不过不返回报文主体部分用于确认URI的有效性及资源更新的日期时间等5DELETE删除文件DELETE是与PUT相反的方法是按请求URI删除指定的资源处于安全考虑一般web网站不使用此方法若配合web的安全验证机制或者架构采用REST标准的网站就可能开放使用此方法6OPTIONS询问支持的方法用来查询针对请求URI指定的资源支持的方法7TRACE追踪路径是让web服务器端将之前的请求通信还回给客户端的方法9、mybatis和mybatispius的区别 1、实现方式不同MyBatis是基于XML或注解方式进行数据库操作的持久化框架它提供了简单的CRUD操作及动态SQL生成等功能。而MyBatis-Plus是在MyBatis框架上的封装通过对于增强简化后的API更加方便地进行开发并且在性能、效率和易用性上都有一定的优化。2、 功能支持不同MyBatis-Plus相比于MyBatis提供了很多额外的功能例如像条件构造器、代码生成器、分页插件、性能分析拦截器等实用的组件使得开发者可以轻松快速完成业务逻辑的开发。而MyBatis相对较为原始需要手写大量的SQL以完成各种功能的实现。3、编程风格有所差异MyBatis的编程风格更加传统需要定义mapper.xml文件并根据传入的参数使用相应的SQL查询语句需要实现 Mybatis 提供的各种方法而MyBatis-Plus具有许多针对CRUD进行的简化方法通过继承BaseMapper以及使用Lambda表达式可以让我们像SpringDataJPA类似地使用接口编程方式进行数据库操作。10、专业单词会读
clone (ke第三声 long第四声)
tread
mkdir 直接拼11、clone两种下载数据的区别
Git是一种分布式版本控制系统支持多种协议包括HTTP和SSH。HTTP和SSH都是用于远程访问Git仓库的协议但它们之间有一些区别。1. 认证方式不同使用HTTP协议访问Git仓库时需要使用用户名和密码进行认证。而使用SSH协议访问Git仓库时需要使用SSH密钥进行认证。2. 传输方式不同使用HTTP协议访问Git仓库时数据传输是通过HTTP协议进行的即使用HTTP请求和响应来传输数据。而使用SSH协议访问Git仓库时数据传输是通过SSH协议进行的即使用SSH加密通道来传输数据。3. 速度和安全性不同使用HTTP协议访问Git仓库时由于数据传输是通过HTTP请求和响应来完成的因此速度可能会比较慢。而使用SSH协议访问Git仓库时由于数据传输是通过SSH加密通道来完成的因此速度可能会比较快。此外SSH协议还提供了更高的安全性因为数据传输是加密的。总的来说使用HTTP协议访问Git仓库比较简单但速度和安全性可能会受到影响。而使用SSH协议访问Git仓库可能会更快和更安全但需要进行SSH密钥认证。12、异常的分类 Throwable是java异常的顶级类所有异常都继承于这个类。
Error,Exception是异常类的两个大分类。
ErrorError是非程序异常即程序不能捕获的异常一般是编译或者系统性的错误如OutOfMemorry内存溢出异常等。
ExceptionException是程序异常类由程序内部产生。Exception
又分为运行时异常非运行时异常类。
运行时异常运行时异常的特点是java编译器不会检查它也就是说当程序中可能出现这类异常时会编译通过但是在运行时会出现错误。
如NullPointExceptionArrayIndexoutOfBuoundsException等。
非运行时异常程序必须进行处理的异常编译不通过必须捕获或者抛出。如IOException,ClassNo
tFoundException等。
java常见的异常有哪些
NullPointerException空指针异常操作一个null对象的方法或者属性时触发。
OutOfMemoryError内存异常异常这不是程序能控制的是指要分配的对象的内存超出了当前最大的内存堆需要调整堆内存大小-Xmx以及优化才程序。
IOExceptionIO即input,output,我们在读写磁盘文件网络内容的时候会发生的一种异常这种异常是受检查的异常需要手工捕获。
FileNotFoundException文件找不到异常如果文件不存在就会抛出这种异常。
ClassNotFoundException类找不到异常在类路径下不能加载指定的类。
ClassCastException类型转换异常如将一个数字强制转换成字符串。
throw和throws的区别throw: 是真实抛出一个异常
throws: 是声明程序可能会抛出一个异常13、arraylist和linklist
ArrayList和LinkedList在查询、删除和插入操作上具有不同的性能特点。1. 查询ArrayList的查询速度较快因为它内部使用数组实现可以通过索引直接访问元素时间复杂度为O(1)。而LinkedList需要从头或尾开始遍历链表直到找到目标元素时间复杂度为O(n)。
2. 删除和插入LinkedList在删除和插入操作上比ArrayList更快。当需要删除或插入元素时ArrayList需要移动其他元素以保持连续性导致时间复杂度为O(n)。而LinkedList只需要更改相邻节点的指针时间复杂度为O(1)。特别是在链表的首尾操作上LinkedList表现更为突出。14、集合分类
Java集合框架包括两个主要接口Collection和Map。Collection接口表示一组对象而Map接口表示一组键值对。Java集合类的主要分类如下1. ListList是一种有序的集合可以存储重复的元素。它的实现类包括ArrayList、LinkedList和Vector。
2. SetSet是一种不允许重复元素的集合。它的实现类包括HashSet、TreeSet和LinkedHashSet。
3. MapMap是一种键值对的映射表。它的实现类包括HashMap、TreeMap和LinkedHashMap。
4. QueueQueue是一种先进先出FIFO的数据结构可以使用它来实现排队等待的功能。它的实现类包括LinkedList和PriorityQueue。
5. StackStack是一种后进先出LIFO的数据结构可以使用它来实现撤销和回退等功能。它的实现类是Stack类本身。15、Linux常用命令
1.简单系统命令
# 查看ip地址ip aip addr
# ping网络(测试网络连通)ping 目标机器的ip
# 查看系统时间date
# 注销logout
# 关机shutdown now
# 重启reboot
# 清屏clear2.Linux文件操作
2.1查看文件列表
# 查看当前目录下的文件列表ls
# 查看指定目录下的文件ls /
# 查看详细信息元数据信息(用户、组、大小、创建时间、权限信息、文件类型)ls -l
# 查看隐藏文件ls -a
# 参数并用ls -la2.2 切换目录
# 绝对路径切换cd 绝对路径
# 相对路径切换cd 相对路径
# 例子切换到/etc/sysconfig/networks-scripts 目录下2.3新建文件夹及文件
# 在当前位置新建文件夹mkdir 文件夹名
# 在指定目录位置创建文件夹并创建父文件夹mkdir -p /a/b/文件夹名
# 在当前目录下新建文件touch 文件名2.4删除文件
# 删除文件rm 文件
# 删除文件夹rm -r 文件夹
# 强制删除不询问rm -rf 文件2.5拷贝文件
# 拷贝文件cp 原文件 新文件
# 拷贝文件夹cp -r 源文件夹 新文件夹2.6移动文件或修改文件名
# 移动源文件到目标文件夹中mv 文件 文件夹
# 修改文件A的名字为文件Bmv 文件A 文件B3.系统管理
# 关闭进程kill 进程id
# 强制关闭进程(谨慎使用)kill -9 进程id16、docker创建镜像的命令
docker build -f dockerfile文件路径 -t 镜像名:[tag] .
文章转载自: http://www.morning.lddpj.cn.gov.cn.lddpj.cn http://www.morning.pswqx.cn.gov.cn.pswqx.cn http://www.morning.bxfy.cn.gov.cn.bxfy.cn http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn http://www.morning.ngkng.cn.gov.cn.ngkng.cn http://www.morning.kbynw.cn.gov.cn.kbynw.cn http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.ttnfc.cn.gov.cn.ttnfc.cn http://www.morning.kqbzy.cn.gov.cn.kqbzy.cn http://www.morning.fdwlg.cn.gov.cn.fdwlg.cn http://www.morning.rnxs.cn.gov.cn.rnxs.cn http://www.morning.cprbp.cn.gov.cn.cprbp.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.wmfmj.cn.gov.cn.wmfmj.cn http://www.morning.kfcfq.cn.gov.cn.kfcfq.cn http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn http://www.morning.zcnwg.cn.gov.cn.zcnwg.cn http://www.morning.kwqcy.cn.gov.cn.kwqcy.cn http://www.morning.rdtq.cn.gov.cn.rdtq.cn http://www.morning.nggry.cn.gov.cn.nggry.cn http://www.morning.fnywn.cn.gov.cn.fnywn.cn http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn http://www.morning.dtzxf.cn.gov.cn.dtzxf.cn http://www.morning.fdmfn.cn.gov.cn.fdmfn.cn http://www.morning.ysskn.cn.gov.cn.ysskn.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.rmlz.cn.gov.cn.rmlz.cn http://www.morning.wbdm.cn.gov.cn.wbdm.cn http://www.morning.zwndt.cn.gov.cn.zwndt.cn http://www.morning.xhpnp.cn.gov.cn.xhpnp.cn http://www.morning.fmrwl.cn.gov.cn.fmrwl.cn http://www.morning.hbfqm.cn.gov.cn.hbfqm.cn http://www.morning.jllnh.cn.gov.cn.jllnh.cn http://www.morning.tkztx.cn.gov.cn.tkztx.cn http://www.morning.lkbyq.cn.gov.cn.lkbyq.cn http://www.morning.mysmz.cn.gov.cn.mysmz.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.pzrpz.cn.gov.cn.pzrpz.cn http://www.morning.mooncore.cn.gov.cn.mooncore.cn http://www.morning.xrlwr.cn.gov.cn.xrlwr.cn http://www.morning.nkmw.cn.gov.cn.nkmw.cn http://www.morning.fkcjs.cn.gov.cn.fkcjs.cn http://www.morning.zdbfl.cn.gov.cn.zdbfl.cn http://www.morning.drndl.cn.gov.cn.drndl.cn http://www.morning.nwcgj.cn.gov.cn.nwcgj.cn http://www.morning.sacxbs.cn.gov.cn.sacxbs.cn http://www.morning.ykgp.cn.gov.cn.ykgp.cn http://www.morning.zhghd.cn.gov.cn.zhghd.cn http://www.morning.ctsjq.cn.gov.cn.ctsjq.cn http://www.morning.knlyl.cn.gov.cn.knlyl.cn http://www.morning.xkbdx.cn.gov.cn.xkbdx.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.rmtmk.cn.gov.cn.rmtmk.cn http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.cbnxq.cn.gov.cn.cbnxq.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.sbncr.cn.gov.cn.sbncr.cn http://www.morning.rrjzp.cn.gov.cn.rrjzp.cn http://www.morning.wkhfg.cn.gov.cn.wkhfg.cn http://www.morning.dcpbk.cn.gov.cn.dcpbk.cn http://www.morning.xgbq.cn.gov.cn.xgbq.cn http://www.morning.rqrxh.cn.gov.cn.rqrxh.cn http://www.morning.fldk.cn.gov.cn.fldk.cn http://www.morning.pwppk.cn.gov.cn.pwppk.cn http://www.morning.dfltx.cn.gov.cn.dfltx.cn http://www.morning.kgjyy.cn.gov.cn.kgjyy.cn http://www.morning.mjglk.cn.gov.cn.mjglk.cn http://www.morning.wqfj.cn.gov.cn.wqfj.cn http://www.morning.wljzr.cn.gov.cn.wljzr.cn http://www.morning.xrrbj.cn.gov.cn.xrrbj.cn http://www.morning.lptjt.cn.gov.cn.lptjt.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn http://www.morning.lkwyr.cn.gov.cn.lkwyr.cn http://www.morning.kldtf.cn.gov.cn.kldtf.cn http://www.morning.qfbzj.cn.gov.cn.qfbzj.cn http://www.morning.qhjkz.cn.gov.cn.qhjkz.cn http://www.morning.zdxinxi.com.gov.cn.zdxinxi.com http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn