Mysql函数FIND_IN_SET()的使用方法

FIND_IN_SET(str,strlist)

字符串str 在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行.

java 中的IO

java中的IO流分为两种:字符流和字节流。

根据数据的流向分为输入,输出流

这里写图片描述

java流操作有关的类和接口:

img

流的概念和作用

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
  • 字节流:一次读入或读出是8位二进制。
  • 字符流:一次读入或读出是16位二进制。

设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流

输入流和输出流

输入流只能进行读操作,输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

输入字节流 InputStream

  • InputStream 是所有的输入字节流的父类,它是一个抽象类。
  • ByteArrayInputStreamStringBufferInputStreamFileInputStream 是三种基本的介质流,它们分别从Byte 数组StringBuffer、和本地文件中读取数据。
  • PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
  • ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

输出字节流 OutputStream

  • OutputStream 是所有的输出字节流的父类,它是一个抽象类。
  • ByteArrayOutputStreamFileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
  • PipedOutputStream 是向与其它线程共用的管道中写入数据。
  • ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。

总结:

  • 输入流:InputStream或者Reader:从文件中读到程序中;
  • 输出流:OutputStream或者Writer:从程序中输出到文件中;

节点流

节点流:直接与数据源相连,读入或读出。
直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。
这里写图片描述

常用的节点流

  • 父 类 :InputStreamOutputStreamReaderWriter
  • 文 件 :FileInputStreamFileOutputStreanFileReaderFileWriter 文件进行处理的节点流
  • 数 组 :ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
  • 字符串 :StringReaderStringWriter 对字符串进行处理的节点流
  • 管 道 :PipedInputStreamPipedOutputStreamPipedReaderPipedWriter 对管道进行处理的节点流

处理流

处理流和节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
这里写图片描述

常用的处理流

  • 缓冲流:BufferedInputStreanBufferedOutputStreamBufferedReaderBufferedWriter 增加缓冲功能,避免频繁读写硬盘。
  • 转换流:InputStreamReaderOutputStreamReader实现字节流和字符流之间的转换。
  • 数据流: DataInputStreamDataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来。

转换流

InputStreamReaderOutputStreamWriterInputStreamOutputStream作为参数,实现从字节流到字符流的转换。

构造函数

1
2
3
4
InputStreamReader(InputStream);        //通过构造函数初始化,使用的是本系统默认的编码表GBK。
InputStreamWriter(InputStream,String charSet); //通过该构造函数初始化,可以指定编码表。
OutputStreamWriter(OutputStream); //通过该构造函数初始化,使用的是本系统默认的编码表GBK。
OutputStreamwriter(OutputStream,String charSet); //通过该构造函数初始化,可以指定编码表。

注意:

  1. 在实际的项目中,所有的IO操作都应该放到子线程中操作,避免堵住主线程。
  2. FileInputStream在读取文件内容的时候,我们传入文件的路径("D:/abc.txt"), 如果这个路径下的文件不存在,那么在执行readFile()方法时会报FileNotFoundException异常。
  3. FileOutputStream在写入文件的时候,我们传入文件的路径("D:/abc.txt"), 如果这个路径下的文件不存在,那么在执行writeFile()方法时, 会默认给我们创建一个新的文件。还有重要的一点,不会报异常。

阻塞和非阻塞IO:

JavaIO的各种流阻塞。这意味着,当一个线程调用read()或write()方法时,该线程被阻塞,直到有一些数据被读取,或者数据完全写入。该线程在此期间不能干任何事情了,java NIO的非组赛模式,是一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据

什么叫重入锁?

博客

重入锁:可重复可递归调用的锁,在外层调用锁,在内层仍然可以使用,并且不发生死锁(前提是同一个对象或者class),ReentrantLock和sychronized都是重入锁。

不可重入锁:即当前线程执行某个方法已经获取到了该锁,那么在方法中尝试在次获取锁时,就会获取不到被阻塞。

可中断锁:在等待获取锁的过程可以被中断。

公平锁:按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利。

读写锁:对资源读取和写入的时候拆分为2部分处理,读的时候可以多线程一起读,写的时候必须同步的写。

synchronized与lock的区别?

博客

类别 synchronized Lock
存在层次 Java的关键字,在jvm层面上 是一个类
锁的释放 1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁 在finally中必须释放锁,不然容易造成线程死锁
锁的获取 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待 分情况而定,Lock有多个锁获取的方式,具体下面会说道,大致就是可以尝试获得锁,线程可以不用一直等待
锁状态 无法判断 可以判断
锁类型 可重入 不可中断 非公平 可重入 可判断 可公平(两者皆可)
性能 少量同步 大量同步

lock常用方法

  • lock():获取锁,如果锁被暂用则一直等待
  • unlock():释放锁
  • tryLock(): 注意返回类型是boolean,如果获取锁的时候锁被占用就返回false,否则返回true
  • tryLock(long time, TimeUnit unit):比起tryLock()就是给了一个时间期限,保证等待参数时间
  • lockInterruptibly():用该锁的获得方式,如果线程在获取锁的阶段进入了等待,那么可以中断此线程,先去做别的事

什么时候用ReentrantLock取代synchronied:

时间锁等候,无块结构锁,多个条件变量或者锁投票;性能更高:jvm将花费更少的时间来调度线程,把更多的时间用在执行程序上。必须使用finally来释放锁。

有关于synchronized代码同步块的说明:

漫画 | Java多线程与并发(一)

自我总结:

1.当一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。

2.当一个线程访问一个对象的同步方法时,另一个线程是不能同时访问这个同步方法。

3.当一个线程访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。

当一个线程访问的一个对象的同步代码块时,需要视情况而定,看sychronized锁住的是什么,如果锁住的是整个对象的话,当有另一个线程访问该方法还是对象中的其他同步代码块时都是不能同时访问的,但如果锁住的不是同一个对象,是可以同时访问对象中的其他代码块。

笔试题部分主要注重java基础知识:

1.spring AutoWried和Resource的区别?

1.AutoWired和Resource都可以用来装配bean,都可以写在字段上,或者写在setter方法上。

2.AutoWired默认按照类型装配(这个注解属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的requied属性为false,@Autowired(required=false)

3.Resource(这个属于j2ee,减少了与spring的耦合),默认按照名字进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名字查找。

2.mybatis如何分页?如何设置缓存?

​ 方法1:数组分页,查询出全部数据,然后再list中截取需要的部分; ArrayList的subList()方法,截取需要的list.

​ 方法2:

​ 方法3:

3.简述JMM以及垃圾回收机制?

4.HashMap原理?

5.什么是JDBC?解释下驱动在JDBC中的角色和作用?

6.列出java IO常用的接口,类以及方法?字节流和字符流的区别?IO和NIO的区别?

7.ArrayList和LinkedList的区别?

8.Servlet的生命周期?初始化?

9.java集合框架的基本接口有哪些?

  1. Java支持的数据类型有哪些?什么是自动拆装箱?

  2. Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

  3. 接口和抽象类的区别是什么?

  4. 线程和进程的区别?什么是多线程?如何实现多线程?如何安全的终止线程?run()方法和start()方法的区别?多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

    多线程有两种实现方法:继承Thread类和实现Runnable接口。

  1. 什么是值传递和引用传递?

  2. 同步方法和同步代码块的区别是什么?

  3. 什么死锁(deadlock)?

  4. 如何保证n个线程可以访问Ng个资源又不会发生死锁?

  5. spring的事务机制?sql的事务特性?

  6. HashMap和HashTable的区别?

  7. 数组(Array)和列表(ArrayList)有什么区别?什么时候用Array什么时候用ArrayList?ArrayListheLinkedList的区别?

  8. 如何权衡是使用无序的数组还是有序的数组?

  9. String StringBuffer的区别?

  10. 说出ArrayList,Vector, LinkedList的存储性能和特性

  11. 、Collection 和 Collections的区别

  12. &和&&的区别?

  13. final finally finallize的区别?

  14. sleep()和wait()有什么区别?

  15. 接口是否可继承接口?

  16. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

  17. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

  18. 编程题: 写一个Singleton出来

  19. Java中的异常处理机制的简单原理和应用? java有多少种异常?

33.简述synchronized和java.util.concurrent.locks.Lock的异同

主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。
Lock是一个类,synchronized是一个关键字
synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放

34.JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

35.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

36.垃圾回收机制的原理

37.什么是java序列化,如何实现java序列化?

38.是否可以从一个static方法内部发出对非static方法的调用?

​ 不可以,如果其中包含对象的method();不能保证对象初始化。

39.List、Map、Set三个接口,存取元素时,各有什么特点?

​ List 以特定次序来持有元素,可有重复元素。
​ Set 无法拥有重复元素,内部排序。
​ Map 保存key-value值,value可多值。

40.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

​ 指引用的变量不能变,引用变量所指向的对象中的内容还是可以变的。例如,对于如下语句:

41.线程如何同步和通讯?

42.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序

43.heap和stack的区别?

44.单例的实现?

45.linux 查找文件的命令?

46.有关泛型的了解?

​ jdk1.5 新增泛型。

​ 是一种安全的

47.什么是TreeMap

面试也主要注重java基础知识以及电商行业的知识点还有就是项目中运用到技术点

1.常用的数据运算方法?

2.jdk1.8版本的新特性?

3.项目中使用软件的版本总结?

spring.version 4.2.5.RELEASE

mybatis.version 3.4

jdk1.8

mysql 5.7.19

dubbo.version 2.8.4

Maven 3.5

4.平时如何解决问题的?

关于interface中定义变量的注意事项

1.interface 定义的变量默认修饰符为 public static final 类型。当然,你的变量也可以不定义成static类型,因为成员变量被定义为public型,实例化的对象可以直接访问。

2.接口可以继承接口,带有成员变量的接口也可以被继承,但是不能对成员变量做修改。

3.由于接口中的成员变量不能修改,所以在定义接口的时候要为其赋值。

4.成员变量在定义的时候不加任何修饰符,但是系统在编译的时候会将其默认为static final 类型,所以为了程序的可读性,建议加上修饰符。

什么是jvm(java虚拟机)?

java 虚拟机是可以执行字节码(.class)文件的虚拟机进程。

为什么java被称为与平台无关的语言?

因为不同的平台装有不同的jvm,它们能够将相同的.class文件解释成不同平台所需要的机器码。正因为有jvm的存在,java被称为跨平台的编程语言。

什么是平台?

CPU和操作系统的总称。

cpu进行计算和控制计算机系统;操作系统:管理计算机硬件和软件资源的系统软件,为计算机提供公共服务。

什么是跨平台?

平台无关,不是说源程序(.java)和平台无关,能运行在各个不同的平台;而是说 源程序编译后的.class文件能够在不同的平台上运行(只要不同的平台上安装jvm)

java源程序不是直接编译成机器码,而是二次编译的。第一次对java源程序被javac编译成.class文件(这个文件与平台无关)。第二次.class文件在被jvm中的解释器编译,解释器为不同平台所需要的机器码。

javac和jvm都包含在jdk(java developement toolkit)

jvm内存管理

jvm运行时的几大数据区:

img

方法区,堆,java栈,pc寄存器,本地方法栈。

堆:存放所有new 对象。堆占据JVM的大部分内存。因此也是java的GC,垃圾收集器的主要工作目标区域。

方法区:存放类装载进来后的和这个类相关的所有运行时需要的信息(如类的静态变量,常量,类的全局名称,方法信息等)。线程共享区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据。

运行时常量池:方法区的一部分,用于存放编译器生成的各种字面量和符号引用。

栈:用于存放基本类型,对象、数组的引用。

栈内存中存放的可以看做是运行时的临时数据,主要表现为本地变量,操作符,对象引用地址等。这些数据会在方法执行结束后立即会回收,不会驻留。对存储空间的占用也只是执行函数指令时所必须的空间。不会造成内存的瓶颈。而方法区中的对象对应的类信息,函数表,构造函数,静态常量等。这些信息在类加载时按需只会在方法区中存储一份,不会产生额外的存储空间。所以主要的内存消耗是java堆内存。

前言

在ES6出现之前,js中声明变量就只有通过var关键字,函数声明是通过function关键字,而在ES6之后,声明的方式有var,let,const,function,class,现在主要考虑var const let的区别;

比较

  1. 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域。

​ var定义的变量可以修改,如果没有进行初始化会输出undefined,不会报错。

  1. let 声明的变量只在它所在的代码块有效;块作用域由{}包括,if语句和for语句里面的{}也属于块作用域。

    let是块级作用域,函数内部使用let定义后,对函数外部无影响。只能在块作用域里访问,也不能跨函数访问。

  2. const 定义的变量无法修改,而且必须初始化。只能在块作用域里访问。

OLTP和OLAP的介绍和比较

1.介绍

数据处理大致分为:

OLAP(on-line analytical processing )联机分析处理:数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。OLAP强调数据分析,强调sql执行市场,强调磁盘I/O,强调分区等。

OLTP(on-line transaction processing )l联机事务处理:传统的关系型数据库的主要应用,主要是基本的,日常的事务,例如银行交易。OLTP强调数据库内存效率,强调内存各种指标的命令率

2.比较

img

OLTP:表示事务性非常高的系统,一般是高可用的在线系统,以小的事物以及小的查询为主,评估其系统的时候,一般看其每秒执行的Transaction以及ExecuteSQL的数量。

OLAP:联机分析处理,有的时候也叫DSS决策支持系统,就是我们说的数据仓库。磁盘子系统的吞吐量。

决策支持系统(DDS,decision support system )典型的操作是全表扫描,长查询,长事务,但是一般事务的个数很少,往往是一个事务独占系统。

什么是事件冒泡

子元素的触发会影响到父元素事件。

取消事件冒泡

什么是事件捕获

父元素的事件会影响子元素。

什么是事件委托

事件委托也称事件代理,就是利用冒泡的原理把加事件加到父级上,触发执行效果。

其实事件委托还有第二个优点:就是新添加的元素还会有之前的事件。