1、sql语句执行缓慢如何优化?
1、大多数情况下很正常,偶尔很慢,则有如下原因
(1)、数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。
(2)、执行的时候,遇到锁,如表锁、行锁。
2、这条 SQL 语句一直执行的很慢,则有如下原因。
(1)、没有用上索引:例如该字段没有索引;由于对字段进行运算、函数操作导致无法用索引。
(2)、数据库选错了索引。
2、什么是IO流?
流就是一系列的数据,当不同的介质之间有数据交互的时候,JAVA就使用流来实现。 数据源可以是文件,还可以是数据库,网络甚至是其他的程序。 比如读取文件的数据到程序中,站在程序的角度来看,就叫做输入流。 输入流:InputStream ; 输出流:OutputStream
3、常用的Java API:
java.lang.Math
提供sin, cos, tan, exp, log, log10 等类方法,PI和E等类字段
java.lang.String(StringBuffer线程安全,StringBuilder线程不安全)
char charAt(int index):返回给定位置的代码单元
boolean equals(Object other):如果字符串与other相等,返回true
boolean equalsIngoreCase(String other) :忽略大小写
int length() 返回字符串的长度
java.lang.Object
String toString() 返回描述该对象值的字符串
boolean equals(Object otherObject) 比较两个对象是否相等。
java.util.Scanner
String nextLine() 读取输入的下一行内容
String next() 读取输入的下一个单词(以空格作为间隔)
java.util.Arrays
static void sort(type[] a) 采用优化的快速排序算法对数组进行排序
static void binarySearch(type[] a, type v) 使用二分搜索算法查找值v
4、MyBatis(框架)是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
5、(java安全框架)是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序
6、Bootstrap(web框架)是基于HTML、CSS、Javascript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。
7、如何使用JDBC技术:
1:注册驱动;2:返回数据库连接对象;3:准备sql文(含有占位符);4:返回ps对象,对sql进行预编译;5:设置参数(替换占位符,没有可以跳过此步骤);6:执行;7:关闭
8、B/S就是“Browser/Server”的缩写,即“浏览器/服务器”模式。
C/S就是“Client/Server”的缩写,即“客户端/服务器”模式。
9、三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
1:数据访问层:主要看你的数据层里面有没有包含逻辑处理,实际上他的各个函数主要完成各个对数据文件的操作。而不必管其他操作。
2:业务逻辑层:主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。
3:表示层:主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。
10、反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。实际上,我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象。
1:获取类对象:获取类对象有3种方式
Class.forName()(常用)
Hero.class
new Hero().getClass()
11、Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。
作用在代码的注解是
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@Target - 标记这个注解应该是哪种 Java 成员。
12、Tomcat服务器:
所谓服务器其实就是代码编写的一个可以根据用户请求实时的调用执行对应的逻辑代码的一个容器。在普通用户看来就是一个安装程序。我们只需要将服务器在操作系统上进行安装,并将我们事先编写好的逻辑处理代码根据规则放到服务器的指定位置,启动服务器,那么服务器就自动的会根据接收到请求调用并执行对象的逻辑代码进行处理。
13、Java Servlet
它是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
14、多线程
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
Java 提供了三种创建线程的方法:
通过实现 Runnable 接口;
通过继承 Thread 类本身;
通过 Callable 和 Future 创建线程
15、Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、linkedList、HashSet、linkedHashSet、HashMap、linkedHashMap 等等。
集合框架是一个用来代表和操纵集合的统一架构。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中
16.1、什么是线程安全和线程不安全呢?
假设A和B同时去不同ATM上取同一张卡的1000块钱,如果是线程不安全,那么A和B可以同时取到1000块钱(两人赚大发啦),而如果线程安全呢,就只有一个人能取出来1000块钱。
线程安全是指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性。
线程不安全就是不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
16.2、是什么决定的线程安全问题呢?
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
16.3、有哪些可以解决多线程并发访问资源的安全问题呢?
有三种方式:分别是 同步代码块 、同步方法和锁机制(Lock)
1)同步代码块:
synchronized(同步锁)
{
//方法体
}
2)同步方法:给多线程访问的成员方法加上synchronized修饰符
public synchronized void test(){
//方法体
}
(3)锁机制(Lock)
//Java提供的同步代码块的另一种机制,比synchronized关键字更强大也更加灵活。
//这种机制基于Lock接口及其实现类(例如:ReentrantLock)
//它比synchronized关键字好的地方:
//1、提供了更多的功能。tryLock()方法的实现,这个方法试图获取锁,
//如果锁已经被其他线程占用,它将返回false并继续往下执行代码。
//2、Lock接口允许分离读和写操作,允许多个线程读和只有一个写线程。
//3、具有更好的性能
public class PrintQueue {
private final Lock A=new ReentrantLock();
//...
}
17、存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
18、如果您通过网页获取用户输入的数据并将其插入一个MySQL语句到数据库,那么就有可能发生SQL注入安全的问题。所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
19、事务、主键自增?
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括:读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
20、一、使用自增主键的好处
1. 自增型主键有利于插入性能的提高
2. 自增型主键设计(int,bigint)可以降低二级索引的空间,提升二级索引的内存命中率
3. 自增型的主键可以减小page的碎片,提升空间和内存的使用
4. 无主键的表删除,在row模式的主从架构,会导致备库夯住
21、public static final double pi=3.1415926
22、ConcurrentHasMap实现了Map接口,是线程安全的
23、第一个项目银行管理系统是一个java的GUI编程,其基本思路是以Jframe为顶层窗口,添加了网格布局管理器。控制层添加高级事件,实现了事件接口ActionListener,对鼠标、键盘、组件的动作进行响应。
前端数据的读写使用的是文件的I/O流,对数据进行读写操作
24、创建线程的三种方式的对比
1. 采用实现 Runnable、Callable 接口的方式创建多线程时,
线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。
2. 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,
则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。
25、Mysql中存储过程的实现
26、线程安全以及不安全的集合
线程安全 非线程安全
Collection Vector ArrayList、linkedList
HashSet、TreeSet
Map HashTable HashMap、TreeMap
ConcurrentHashMap
字符串 StringBuffer StringBuilder
27、HashMap底层原理:
HashMap由数组+链表(jdk7之前)组成的/
数组+链表+红黑树(jdk8) 组成的,链表长度大于8才会变为红黑树。
数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
HashMap有4个构造器,其他构造器如果用户没有传入initialCapacity (初始容量)和loadFactor(负荷系数)这两个参数,会使用默认值,initialCapacity默认为16,loadFactory默认为0.75
当发生哈希冲突并且size大于阈值的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍的新的数组,然后将当前的Entry数组中的元素全部传输过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。
28、HashSet:不能存入相同的元素,如果new了两个对象,但是里面的两个属性是一样的,可以存入HashSet, 但是我们不希望存入这两个元素到HashSet中,此时就需要重写HashCode()方法 和 equales()方法。
29、AOP:面向切面编程:通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
30、新线程创建之后,需要主动调用它的 start()方法它才会运行线程。
31、Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性。
32、Java并发编程:要想并发程序正确地执行,必须要保证“原子性”、“可见性”以及“有序性”。只要有一个没有被保证,就有可能会导致程序运行不正确。
volatile(关键字):对于"可见性",Java提供了volatile关键字来保证可见性。
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
33、volatile关键字及指令重排序;详细见 java笔记-html.
指令重排序:一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。但是要注意,虽然处理器会对指令进行重排序,但是它会保证程序最终结果会和代码顺序执行结果相同。
34、 MyISAM 和 InnoDB 比较;详细见 java笔记-html.
35、一级缓存、二级缓存?
目前所有主流处理器大都具有一级缓存和二级缓存,少数高端处理器还集成了三级缓存。
其中,一级缓存可分为一级指令缓存和一级数据缓存。
一级指令缓存用于暂时存储并向CPU递送各类运算指令;
一级数据缓存用于暂时存储并向CPU递送运算所需数据,这就是一级缓存的作用。
二级缓存就是一级缓存的缓冲器:一级缓存制造成本很高因此它的容量有限,二级缓存的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。
同样道理,三级缓存和内存可以看作是二级缓存的缓冲器,它们的容量递增,但单位制造成本却递减。
36、POJO全称是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻译成:普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO。
37、Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean 。但通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat) 的,所以 Java Bean 应具有一个无参的构造器,另外,通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。 Java Bean 是不能被跨进程访问的。JavaBean是一种组件技术。



