搜索词>>冒泡排序 耗时0.0020
  • java常见面试题

    java常见面试题之冒泡排序<h2>引言</h2> 记录常见的java面试题及解决思路方法。 <h2>java冒泡排序</h2> <pre> <code class="language-java">package net.xqlee.project; public class TestMaoPao { public static void main(String[] args) { int[] arr = new int[] { 0, 2, 3, 7, -1, 90, 290, -1, 100 }; int swap = 0; for (int i = 0; i < arr.length; i++) { for (int j = i; j < arr.length; j++) { if (arr[j] > arr[i]) { swap = arr[i]; arr[i] = arr[j]; arr[j] = swap; } } } System.out.println(arr[0]); } } </code></pre> <br /> 冒泡排序原理: 从第一个开始,与后面的每一个比较,找到比他大/小的就交换,一轮下来就可以将最大/小值放在索引的第一个位置,后面以此类推。 <h2><strong>servlet执行流程</strong></h2>   客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。 <h2><strong>springMVC的执行流程</strong></h2>   springMVC是由dispatchservlet为核心的分层控制框架。首先客户端发出一个请求web服务器解析请求url并去匹配dispatchservlet的映射url,如果匹配上就将这个请求放入到dispatchservlet,dispatchservlet根据mapping映射配置去寻找相对应的handel,然后把处理权交给找到的handel,handel封装了处理业务逻辑的代码,当handel处理完后会返回一个逻辑视图modelandview给dispatchservlet,此时的modelandview是一个逻辑视图不是一个正式视图,所以dispatchservlet会通过viewresource视图资源去解析modelandview,然后将解析后的参数放到view中返回到客户端并展现。 <h2><strong>Java设计模式思想(单列模式,工厂模式,策略模式,共23种设计模式)</strong></h2> <ul> <li>a) 单例模式:单例模式核心只需要new一个实例对象的模式,比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加一再放回去,有人退出登陆的时候取出来减一再放回去,但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。</li> <li>b) 策略模式:就是将几个类中公共的方法提取到一个新的类中,从而使扩展更容易,保证代码的可移植性,可维护性强。比如有个需求是写鸭子对象,鸭子有叫,飞,外形这三种方法,如果每个鸭子类都写这三个方法会出现代码的冗余,这时候我们可以把鸭子中的叫,飞,外形这三个方法提取出来,放到鸭父类中,让每个鸭子都继承这个鸭父类,重写这三个方法,这样封装的代码可移植性强,当用户提出新的需求比如鸭子会游泳,那么对于我们oo程序员来讲就非常简单了我们只需要在鸭父类中加一个游泳的方法,让会游泳的鸭子重写游泳方法就可以了。</li> <li>c) 工厂模式:简单的工厂模式主要是统一提供实例对象的引用,通过工厂模式接口获取实例对象的引用。比如一个登陆功能,后端有三个类,controller类,interface类,实现接口的实现类。当客户端发出一个请求,当请求传到controller类中时,controller获取接口的引用对象,而实现接口的实现类中封装好了登陆的业务逻辑代码。当你需要加一个注册需求的时候只需要在接口类中加一个注册方法,实现类中实现方法,controller获取接口的引用对象即可,不需要改动原来的代码,这种做法是的可拓展性强。</li> </ul> <h2><strong>内部类与外部类的调用</strong></h2> <ul> <li>a) 内部类可以直接调用外部类包括private的成员变量,使用外部类引用的this.关键字调用即可</li> <li>b) 而外部类调用内部类需要建立内部类对象</li> </ul> <h2><strong>AOP与IOC的概念(即spring的核心)</strong></h2> <ul> <li>a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度。而spring的核心是IOC控制反转和AOP面向切面编程。IOC控制反转主要强调的是程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由我们创建对象获取依赖对象,而在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。</li> <li>b) AOP:面向切面编程,主要是管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面(aspect),切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。</li> </ul> <h2><strong>Arraylist与linkedlist的区别</strong></h2> a) 都是实现list接口的列表,arraylist是基于数组的数据结构,linkedlist是基于链表的数据结构,当获取特定元素时,ArrayList效率比较快,它通过数组下标即可获取,而linkedlist则需要移动指针。当存储元素与删除元素时linkedlist效率较快,只需要将指针移动指定位置增加或者删除即可,而arraylist需要移动数据。 <h2><strong>数据库优化</strong></h2> <ul> <li>a) 选择合适的字段,比如邮箱字段可以设为char(6),尽量把字段设置为notnull,这样查询的时候数据库就不需要比较null值</li> <li>b) 使用关联查询( left join on)查询代替子查询</li> <li>c) 使用union联合查询手动创建临时表</li> <li>d) 开启事物,当数据库执行多条语句出现错误时,事物会回滚,可以维护数据库的完整性</li> <li>e) 使用外键,事物可以维护数据的完整性但是它却不能保证数据的关联性,使用外键可以保证数据的关联性</li> <li>f) 使用索引,索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快的多的速度检索特定的行,特别是对于max,min,order by查询时,效果更明显</li> <li>g) 优化的查询语句,绝大多数情况下,使用索引可以提高查询的速度,但如果sql语句使用不恰当的话,索引无法发挥它的特性。</li> </ul> <h2>Java集合类框架的基本接口有哪些</h2> Collection集合接口,<br /> List、set实现Collection接口,<br /> arraylist、linkedlist,vector实现list接口,<br /> stack继承vector,Map接口,<br /> hashtable、hashmap实现map接口 <h2><strong>事物的理解</strong></h2> <ul> <li>a) 事物具有原子性,一致性,持久性,隔离性</li> <li>b) 原子性:是指在一个事物中,要么全部执行成功,要么全部失败回滚。</li> <li>c) 一致性:事物执行之前和执行之后都处于一致性状态</li> <li>d) 持久性:事物多数据的操作是永久性</li> <li>e) 隔离性:当一个事物正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。</li> </ul> <h2><strong>对象的创建</strong></h2> <ul> <li>a) 遇到一个新类时,会进行类的加载,定位到class文件</li> <li>b) 对所有静态成员变量初始化,静态代码块也会执行,而且只在类加载的时候执行一次</li> <li>c) New 对象时,jvm会在堆中分配一个足够大的存储空间</li> <li>d) 存储空间清空,为所有的变量赋默认值,所有的对象引用赋值为null</li> <li>e) 根据书写的位置给字段一些初始化操作</li> <li>f) 调用构造器方法(没有继承)</li> </ul> <h2>JAVA WEB 九大内置对象</h2>   九大内置对象分别是: request response session application out page config exception pageContent<br /> <br />   其中: <ul> <li>request  response  out page config exception pageContent对象的有效范围是当前页面的应用 </li> <li>session 有效范围是当前会话(当前客户端的所有页面)</li> <li>application 有效范围是整个应用程序,只要服务器不关闭对象就有效</li> </ul> ====================================================================<br /> request<br /> ====================================================================<br /> request.getParameter();获得用户提交的表单信息<br /> request.setCharacterEncoding("UTF-8");设置请求编码,防止乱码<br /> request.setAttribute("Unmae", new Object());将数据保存到request范围内的变量中<br /> request.forward(String Url);转发<br /> request.getRequestURL();获得当前页的IE地址<br /> request.getHeader("resref");获得请求也的IE地址<br /> request.getRemoteAddr();获得用户的IP地址<br /> ====================================================================<br /> cookie<br /> ====================================================================<br /> cookie.getCookies()获得所有cookie对象的集合<br /> cookie.getName()获得指定名称的cookie<br /> cookie.getValue()获得cookie对象的值<br /> URLEncoder.encode();将需要保存到cookie中的数据进行编码<br /> URLEncoder.decode();读取cookie信息时将信息解码<br /> ====================================================================<br /> response<br /> ====================================================================<br /> response.addCookie()将一个cookie对象发送到客户端<br /> response.sendRedirect(String path); 重定向<br /> ====================================================================<br /> application<br /> ====================================================================<br /> application.setAttribute(key,value);给application添加属性值<br /> application.getAttribute(key,value);获取指定的值<br /> ====================================================================<br /> session<br /> ====================================================================<br /> session.setMaxInactiveInterval(int num);设置session对象的有效活动时间<br /> session.isNew();判断是否为新用户  返回Boolean<br /> session.setAttribute();<br /> session.getAttribute();<br /> session.invalidate();销毁当前session<br /> ====================================================================
  • Java 8使用多个comparators进行集合分组排序

    Java 8使用多个comparators进行集合分组排序Java 8使用多个comparators进行集合分组排序
  • java 8 stream 多字段排序

    java 8 stream 多字段排序,本例子主要使用stream进行多个字段的排序,使用了 comparators和Comparator.thenComparing()方法。比较器之间返回一个字典排序。他的排序效果有点像SQL中的group by条件。java 8 stream 多字段排序
  • Java 8 字符串日期排序

    首先定义一个包含字符串日期的数据对象​public class ObjectDto implements Serializable { private static final long serialVersionUID = 858首先定义一个包含字符串日期的数据对象​public class ObjectDto implements Serializable { private static final long serialVersionUID = 8589835559483231840L; private String date;   //get set.. } 接下来初始化一些数据,并进行排序 ​​​​​​​ public static void main(String[] args){      List<ObjectDto> list = new ArrayList()<>;      ObjectDto on1 = new ObjectDto();      on1.setDate("2018-05-17");         ObjectDto on2 = new ObjectDto();         on2.seDate("2018-05-16");         ObjectDto on3 = new ObjectDto();         on3.setDate("2018-05-18");         ObjectDto on4 = new ObjectDto();         on4.setDate("2018-05-15");          list.add(on1);     list.add(on2);     list.add(on3);     list.add(on4);   //升序   List<ObjectDto> collect = list.stream().sorted(new Comparator<ObjectDto>() {       @Override       public int compare(ObjectDto o1, ObjectDto o2) {           try {               Date d1 = DateUtil.parseTime(o1.getDate(), "yyyy-MM-dd");               Date d2 = DateUtil.parseTime(o2.getDate(), "yyyy-MM-dd");                  return d1.compareTo(d2);           } catch (ParseException e) {               e.printStackTrace();           }           return 0;       }   }).collect(Collectors.toList()); }核心点在于Java 8的stream,以及内部的字符串日期转换为Date日期进行比较。 图像 小部件
  • 一名3年工作经验的java程序员应该具备的技能

    一名3年工作经验的java程序员应该具备的技能<p>一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价、拿到的薪水势必也越高。</p> <h2>1、基本语法</h2> <p>        这包括static、final、transient等关键字的作用,foreach循环的原理等等。今天面试我问你static关键字有哪些作 用,如果你答出static修饰变量、修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满 意,因为能看出你非常热衷研究技术。</p> <p>        最深入的一次,我记得面试官直接问到了我Volatile关 键字的底层实现原理(顺便插一句,面试和被面试本身就是相对的,面试官能问这个问题同时也让面试者感觉到面试官也是一个喜爱研究技术的人,增加了面试者对 公司的好感,我最终选择的就是问了这个问题的公司),不要觉得这太吹毛求疵了—-越简单的问题越能看出一个人的水平,别人对你技术的考量绝大多数都是以深度优先、广度次之为标准的,切记。</p> <h2>2、集合</h2> <p>        非常重要,也是必问的内容。基本上就是List、Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。</p> <p>集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、 HashSet的实现原理,能流利作答,当然能掌握CopyOnWrite容器和Queue是再好不过的了。另外多说一 句,ConcurrentHashMap的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于ConcurrentHashMap, 我给网友朋友们提供三点回答或者是研究方向:</p> <p>(1)ConcurrentHashMap的锁分段技术。</p> <p>(2)ConcurrentHashMap的读是否要加锁,为什么。</p> <p>(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器。</p> <h2>3、框架</h2> <p>        老生常谈,面试必问的东西。一般来说会问你一下你们项目中使用的框架,然后给你一些场景问你用框架怎么做,比如我想要在Spring初始化bean 的时候做一些事情该怎么做、想要在bean销毁的时候做一些事情该怎么做、MyBatis中$和#的区别等等,这些都比较实际了,平时积累得好、有多学习 框架的使用细节自然都不成问题。</p> <p>        如果上面你的问题答得好,面试官往往会深入地问一些框架的实现原理。问得最多的就是Spring AOP的实现原理,当然这个很简单啦,两句话就搞定的的事儿,即使你不会准备一下就好了。我遇到的最变态的是让我画一下Spring的Bean工厂实 现的UML图,当然面对这样一个有深度的问题,我是绝对答不出来的/(ㄒoㄒ)/~~</p> <h2>4、数据库</h2> <p>        数据库十有八九也都会问到。一些基本的像和 all的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,如果对于数据库的性能优化一窍不通,那么有时间,还是建议你在面试前花一两天专门 把SQL基础和SQL优化的内容准备一下。</p> <p>        不过数据库倒是不用担心,一家公司往往有很多部门,如果你对数据库不熟悉而基本技术又非常好,九成都是会要你的,估计会先把你放到对数据库使用不是要求非常高的部门锻炼一下。</p> <h2>5、Web方面的一些问题</h2> <p>Java主要面向Web端,因此Web的一些问题也是必问的。</p> <p>我碰到过问得最多的两个问题是:</p> <p>谈谈分布式Session的几种实现方式。(大家可以聊下你们知道的实现方法)</p> <p>常用的四种能答出来自然是让面试官非常满意的。</p> <p>另外一个常问的问题是:讲一下Session和Cookie的区别和联系以及Session的实现原理。这两个问题之外,web.xml里面的内容是重点,Filter、Servlet、Listener,不说对它们的实现原理一清二楚吧,至少能对它们的使用知根知底。另外,一些细节的方面比如get/post的区别、forward/重定向的区别、HTTPS的实现原理也都可能会被考察到。</p> <h2>6、数据结构和算法分析</h2> <p>        数据结构和算法分析,对于一名程序员来说,会比不会好而且在工作中绝对能派上用场。数组、链表是基础,栈和队列深入一些但也不难,树挺重要的,比较 重要的树AVL树、红黑树,可以不了解它们的具体实现,但是要知道什么是二叉查找树、什么是平衡树,AVL树和红黑树的区别。记得某次面试,某个面试官和 我聊到了数据库的索引,他问我:你知道索引使用的是哪种数据结构实现吗?</p> <p>我答到用的Hash表吧,答错。他又问,你知道为什么要使用树吗?我答到因为Hash表可能会出现比较多的冲突,在千万甚至是上亿级别的数据面 前,会大大增加查找的时间复杂度。而树比较稳定,基本保证最多二三十次就能找到想要的数据,对方说不完全对,最后我们还是交流了一下这个问题,我也明白了 为什么要使用树,这里不说,网友朋友们觉得索引为什么要使用树来实现呢?</p> <p>至于算法分析,不会、不想研究就算了,记得某次面试对方问我,Collections.sort方法使用的是哪种排序方法,额,吐血三升。当然为了 显示我的博学,对算法分析也有一定的研究(⊙﹏⊙)b,我还是硬着头皮说了一句可能是冒泡排序吧。当然答案肯定不是,有兴趣的网友朋友们可以去看一下 Collections.sort方法的源代码,用的是一种叫做TimSort的排序法,也就是增强型的归并排序法。</p> <h2>7、Java虚拟机</h2> <p>        出乎我的意料,Java虚拟机应该是很重要的一块内容,结果在这几家公司中被问到的概率几乎为0。要知道,我去年可是花了大量的时间去研究Java虚拟机的,光周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》,我就读了不下五遍。</p> <p>        言归正传,虽然Java虚拟机没问到,但我觉得还是有必要研究的,我就简单地列一个提纲吧,谈谈Java虚拟机中比较重要的内容:</p> <p>(1)Java虚拟机的内存布局</p> <p>(2)GC算法及几种垃圾收集器</p> <p>(3)类加载机制,也就是双亲委派模型</p> <p>(4)Java内存模型</p> <p>(5)happens-before规则</p> <p>(6)volatile关键字使用规则</p> <p>也许面试无用,但在走向大牛的路上,不可不会。</p> <h2>8、设计模式</h2> <p>        本来以为蛮重要的一块内容,结果只在阿里巴巴B2B事业部面试的时候被问了一次,当时问的是装饰器模式。</p> <p>        当然咱们不能这么功利,为了面试而学习,设计模式在工作中还是非常重要、非常有用的,23种设计模式中重点研究常用的十来种就可以了,面试中关于设计模式的问答主要是三个方向:</p> <p>(1)你的项目中用到了哪些设计模式,如何使用。</p> <p>(2)知道常用设计模式的优缺点。</p> <p>(3)能画出常用设计模式的UML图。</p> <h2>9、多线程</h2> <p>        这也是必问的一块了。因为三年工作经验,所以基本上不会再问你怎么实现多线程了,会问得深入一些比如说Thread和Runnable的区别和联 系、多次start一个线程会怎么样、线程有哪些状态。当然这只是最基本的,出乎意料地,几次面试几乎都被同时问到了一个问题,问法不尽相同。</p> <p>总结起来是 这么一个意思:</p> <p>        假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?</p> <p>        聪明的网友们对这个问题是否有答案呢?不难,java.util.concurrent下就有现成的类可以使用。(大家可以留言讨论下用的什么方法实现)</p> <p>        另外,线程池也是比较常问的一块,常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。</p> <p>最后,虽然这次面试问得不多,但是多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、 synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等。</p> <h2>10、JDK源码</h2> <p>        要想拿高工资,JDK源码不可不读。上面的内容可能还和具体场景联系起来,JDK源码就是实打实地看你平时是不是爱钻研了。我面试过程中被问了不 少JDK源码的问题,其中最刁钻的一个问了我,String的hashCode()方法是怎么实现的,幸好我平时String源代码看得多,答了个大 概。</p> <p>JDK源码其实没什么好总结的,纯粹看个人,总结一下比较重要的源码:</p> <p>(1)List、Map、Set实现类的源代码</p> <p>(2)ReentrantLock、AQS的源代码</p> <p>(3)AtomicInteger的实现原理,主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的</p> <p>(4)线程池的实现原理</p> <p>(5)Object类中的方法以及每个方法的作用</p> <p>        这些其实要求蛮高的,我去年一整年基本把JDK中重要类的源代码研究了个遍,真的花费时间、花费精力,当然回头看,是值得的—-不仅仅是为了应付面试。</p> <p>        最后,如果有兴趣有时间,建议学习、研究一下SOA和RPC,面向服务体系,大型分布式架构必备,救命良方、包治百病、屡试不爽。</p>
  • Java8中的流Stream

    jdk8新特性流的使用<h2><strong>java 8中的流(Stream)</strong></h2> 之前因为工作原因经常需要对查询的数据库的数据集合进行筛选或者排序之类的操作,今天看了下jdk8特性,根据stream可以自动满足这些操作。 <p>流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)</p> <p>Java 8中的Stream API可以让你写出这样的代码:</p> <p> 声明性——更简洁,更易读</p> <p> 可复合——更灵活</p> <p> 可并行——性能更好<br /> <br /> 首先看一下使用流和不使用流的区别,需求: 把集合中年龄小于等于20的人的名字取出来并排序<br /> 不使用流:</p> <pre> <code class="language-java">//传统JDK排序抽取数据 // 把集合中年龄小于等于20的人的名字取出来并排序 // 第一步:取年龄 <= 20的用户 List<User> tmpList = new ArrayList<>(); for (User u : list) { if (u.getAge() <= 20){ tmpList.add(u); } } // 第二步:排序 Collections.sort(tmpList, new Comparator<User>() { public int compare(User u1, User u2) { return u1.getName().compareTo(u2.getName()); } }); // 第三步 List<String> userNames = new ArrayList<>(); for(User u : tmpList){ userNames.add(u.getName()); }</code></pre> <p>jdk8流新特性<br />  </p> <pre> <code class="language-java">//JDK流新特性 //为了利用多核架构并行执行这段代码,只需要把stream()换成parallelStream(): List<String> userNames = list.stream() .filter(userJdk8 -> userJdk8.getAge() <= 20) .sorted(Comparator.comparing(User::getName)) .map(User::getName) .collect(Collectors.toList()); System.out.println(userNames.toString());</code></pre> <p> </p> <h2><strong>流与集合的区别:</strong></h2> <p>集合与流之间的差异就在于什么时候进行计算。集合是一个内存中的数据结构,它包含数据结构中目前所有的值——集合中的每个元素都得先算出来才能添加到集合中。(你可以往集合里加东西或者删东西,但是不管什么时候,集合中的每个元素都是放在内存里的,元素都得先算出来才能成为集合的一部分。)相比之下,流则是在概念上固定的数据结构(你不能添加或删除元素),其元素则是按需计算的。 从另一个角度来说,流就像是一个延迟创建的集合:只有在消费者要求的时候才会计算值。以质数为例,要是想创建一个包含所有质数的集合,那这个程序算起来就没完没了了,因为总有新的质数要算,然后把它加到集合里面。而流的话,仅仅从流中提取需要的值,而这些值——在用户看不见的地方,只会按需生成。<br /> 流只能被消费一次,如果被消费多次,则会抛出异常:</p> <pre> <code>java.lang.IllegalStateException: stream has already been operated upon or closed</code></pre> <p>如下代码所示: 这段代码的意思是遍历 lists 集合</p> <pre> <code class="language-java">List<String> lists = Arrays.asList("java8","lambda","stream"); Stream<String> stringStream = lists.stream(); Consumer<String> consumer = (x) -> System.out.println(x); stringStream.forEach(consumer); //stream has already been operated upon or closed stringStream.forEach(consumer);</code></pre> <p>之前测试类完整代码,更多stream参考<a rel="external nofollow" target="_blank" href="https://docs.oracle.com/javase/8/docs/api/">jdk8API在线文档</a>:<br />  </p> <pre> <code class="language-java">package com.yeyue; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** * @ClassName: JDK8Test * @Description: jdk8流的作用 此例是把集合中年龄小于等于20的人的名字取出来并排序 * @author: xiaoboLi * @date: 2017/11/22 14:32 * @Copyright: 2017 All rights reserved. */ public class JDK8Test { public static void main(String[] args) { List<User> list = new ArrayList<>(); User user = new User(11, "zhangsan", 1); list.add(user); user = new User(19, "lisi", 1); list.add(user); user = new User(10, "wanger", 0); list.add(user); user = new User(7, "wangmazi", 0); list.add(user); user = new User(25, "hanmeimei", 0); list.add(user); user = new User(30, "lilei", 0); list.add(user); //传统JDK排序抽取数据 // 把集合中年龄小于等于20的人的名字取出来并排序 // 第一步:取年龄 <= 20的用户 List<User> tmpList = new ArrayList<>(); for (User u : list) { if (u.getAge() <= 20){ tmpList.add(u); } } // 第二步:排序 Collections.sort(tmpList, new Comparator<User>() { public int compare(User u1, User u2) { return u1.getName().compareTo(u2.getName()); } }); // 第三步 List<String> userNames = new ArrayList<>(); for(User u : tmpList){ userNames.add(u.getName()); } System.out.println(userNames.toString()); //JDK流新特性 //为了利用多核架构并行执行这段代码,只需要把stream()换成parallelStream(): userNames = list.stream() .filter(userJdk8 -> userJdk8.getAge() <= 20) .sorted(Comparator.comparing(User::getName)) .map(User::getName) .collect(Collectors.toList()); System.out.println(userNames.toString()); //取小于20岁的人员信息并且根据年龄升序排序 List<User> aList = list.stream() .filter(userJdk8 -> userJdk8.getAge() <= 20) .sorted(Comparator.comparing(User::getAge)) .collect(Collectors.toList()); for (User u : aList) { System.out.println(u.getName()); } } } class User { private int age; private String name; private int sex; public User(int age, String name, int sex) { this.age = age; this.name = name; this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } }</code></pre>
  • java HashSet使用教程

    java HashSet使用教程,HashSet常见的内置方法使用,HashSet 排序/迭代循环java HashSet使用教程
  • MySQL查询结果添加序号

    MySQL查询结果添加序号常规查询结果如下:SQL命令:SELECT * FROM test;​现在我们需要添加一行序列号,也就是1,2,3,4...那种MySQL查询结果添加序号常规查询结果如下:SQL命令:SELECT * FROM test;​现在我们需要添加一行序列号,也就是1,2,3,4...那种。SQL命令如下:SELECT (@sn :=@sn + 1) sn,a.* from test a,(select @sn :=0) b;执行结果如下:​搞定收工。如果需要倒序则再进行一次子查询根据SN排序即可。
  • bootstrap table插件使用说明demo

    bootstrap table插件使用说明demo该插件是基于bootstrap框架开发的一个table插件,功能强大实用性强<br /> 展示结果截图:<br /> <img alt="bootstrap table插件使用效果图" class="img-thumbnail" src="/assist/images/blog/6a731324-c558-4ca7-8e9a-08affc0a941c.png" style="height:561px; width:1117px" /><br /> 1.下载bootstrap table插件,<a href="https://github.com/wenzhixin/bootstrap-table" rel="nofollow" target="_blank">下载</a><br /> 2.导入插件相关的css和js文件,当然bootstrap框架的基本组件必须导入 <pre> <code class="language-html"><link rel="stylesheet" href="bootstrap3/plugins/bootstrap-table/dist/bootstrap-table.min.css"> <script src="bootstrap3/plugins/bootstrap-table/dist/bootstrap-table.js"></script> <script src="bootstrap3/plugins/bootstrap-table/dist/locale/bootstrap-table-zh-CN.js"></script></code></pre> 3.body中添加一个table,给一个id,添加一个搜索的工具栏 <pre> <code class="language-html"><div class="search_bar form-inline" id="search_bar"> <span>著作:</span> <select class="form-control" id="search_copyright"> <option value="">全部</option> <option value="Original">原创</option> <option value="Reproduced">转载</option> <option value="Translation">翻译</option> </select> <span>状态:</span> <select class="form-control" id="search_status"> <option value="">全部</option> <option value="Normal">已发布</option> <option value="UnAudit">待审核</option> </select> <span>排序:</span> <select class="form-control" id="search_order"> <option value="createTime" title="创建时间排序">创时</option> <option value="updateTime" title="更新时间排序" selected="selected">更时</option> </select> <span>标题:</span> <input type="text" class="form-control" placeholder="输入博客标题" id="serach_title">&nbsp;<button class="btn btn-default" id="search_btn">查询</button>&nbsp; </div> <table id="table"></table></code></pre> 4.写js <pre> <code class="language-javascript">$(function(){     $('#table').bootstrapTable({         url:'manager/blog/list.json',         method:'get',         contentType:'application/json',         showColumns: true, //显示隐藏列           showRefresh: true,  //显示刷新按钮         toolbar:'#search_bar',         queryParams:queryPrams,          pagination: true,           pageSize: 10,          pageList:[10],          sidePagination: "server",         columns: [{             field: 'title',             title: '博客标题'         },{             field: 'authorName',             title: '作者'         },{             field:'copyright',             title:'版权',             formatter:function(value,row,index){                 var cp=value;                 if(value=='Reproduced'){                     cp='转载';                 }else if(value=='Translation'){                     cp='翻译';                 }else if(value=='Original'){                     cp='原创';                 }                 return cp;             },              width:50         },{             field: 'autoAuditDate',             title: '自动审核日期'         },{             field: 'status',             title: '状态',             formatter:function(value,row,index){                 var status=value;                 if(value=='Normal'){                     status='正常';                 }else if(value=='UnAudit'){                     status='待审核';                 }else if(value=='Refuse'){                     status='驳回';                 }else if(value=='AutoAudit'){                     status='自审核';                 }                 return status;             },             width:60         },{             field: 'updateTime',             title: '更新时间',             formatter:function(value,row,index){                 return $.timestamp2string(value,'yyyy-MM-dd hh:mm:ss');             },             width:170         },{             field: 'id',              title:'操作',             formatter:function(value,row,index){                 var p='<a class="btn btn-xs btn-default" title="预览博客" href="manager/blog/view/'+value+'.html" target="_blank">预</a>&nbsp;';                 var a='<button class="btn btn-xs btn-success" title="通过审核" onclick="audit('+value+')">审</button>&nbsp;';                 var auto='<button class="btn btn-xs btn-success" title="定时自动审核" onclick="auditAuto('+value+')">定</button>&nbsp;';                 var r='<button class="btn btn-xs btn-default" title="拒绝审核" onclick="auditCanncel('+value+')">驳</button>&nbsp;';                 return p+a+auto+r;             },             width:130         }]     }) //查询事件绑定     $('#search_btn').click(function(){         $("#table").bootstrapTable('refresh');     });     $('#search_status').change(function(){         $("#table").bootstrapTable('refresh');     });     $('#search_copyright').change(function(){         $("#table").bootstrapTable('refresh');     });     $('#search_order').change(function(){         $("#table").bootstrapTable('refresh');     });</code></pre> <br /> <br />  
  • MySQL索引优化_MySQL索引类型_MySQL索引怎么用怎么创建

    MySQL索引优化,MySQL索引类型,MySQL索引怎么用MySQL索引怎么创建这里将会通过一些简单得sql进行讲解<h2>引言</h2>     本文用于MySQL数据库通过创建索引来调优的讲解。主要讲解的内容有:MySQL索引优化查询/MySQL索引类型/怎么创建MySQL的索引。<br />     通常大型网站单日就可能会产生几十万甚至几百万的数据,对于没有索引的表,单表查询可能几十万数据就是瓶颈。 <h2>一.简单的对比测试</h2>  测试表结构: <pre> <code class="language-sql">--创建一个测试用article表 CREATE TABLE article ( id bigint(20) NOT NULL AUTO_INCREMENT, title CHAR(255) NOT NULL, content LONGTEXT, TIME INT(10), PRIMARY KEY(id) )</code></pre> <p>以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万条数据,平均每条数据源都重复大概10万次,表结构比较简单,仅包含一个自增ID,一个char类型,一个text类型和一个int类型,单表2G大小,使用MyIASM引擎。开始测试未添加任何索引。</p> <p>执行下面的SQL语句:</p> <pre> <code class="language-sql">mysql>SELECT id,FROM_UNIXTIME(time) FROM article a WHERE a.title='测试标题';</code></pre> 查询需要的时间非常恐怖的,如果加上联合查询和其他一些约束条件,数据库会疯狂的消耗内存,并且会影响前端程序的执行。这时给title字段添加一个BTREE索引: <pre> <code class="language-sql">mysql> ALTER TABLE article ADD INDEX index_article_tite (title);</code></pre> <h5>MySQL索引的概念</h5> <p>  索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。上述SQL语句,在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000”,那么你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?(注:一般数据库默认都会为主键生成索引)。</p> <p>索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。</p> <h5>MySQL索引的类型</h5> <h3>1.普通索引</h3> <p>这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。</p> <pre> <code class="language-sql">--直接创建索引 CREATE INDEX index_article_title ON article(title(255)); ---修改表结构方式添加索引 ALTER TABLE article ADD INDEX index_article_title (title); --创建表的时候创建索引 CREATE TABLE article ( id bigint(20) NOT NULL AUTO_INCREMENT, title CHAR(255) NOT NULL, content LONGTEXT, TIME INT(10), PRIMARY KEY(id), INDEX index_article_title (title(255)) ); --删除索引 DROP INDEX index_article_title ON article; </code></pre> <h3>2.唯一索引</h3> <p>与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。<br />  </p> <pre> <code class="language-sql">--创建唯一索引 CREATE UNIQUE INDEX index_article_title ON article(title(255)); --修改表结构方式创建唯一索引 ALTER TABLE article ADD UNIQUE INDEX index_article_title (title(255)); --创建表的时候创建索引 CREATE TABLE article ( id bigint(20) NOT NULL AUTO_INCREMENT, title CHAR(255) NOT NULL, content LONGTEXT, TIME INT(10), PRIMARY KEY(id), UNIQUE index_article_title (title(255)) ); </code></pre>   <h3>3.全文索引(FULLTEXT)</h3> <p>    MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。<br />  </p> <pre> <code class="language-sql">--创建表的时候创建索引 CREATE TABLE article ( id bigint(20) NOT NULL AUTO_INCREMENT, title CHAR(255) NOT NULL, content LONGTEXT, TIME INT(10), PRIMARY KEY(id), FULLTEXT (content) ); --修改表结构添加全文索引 ALTER TABLE article ADD FULLTEXT index_article_content(content); --直接创建索引 CREATE FULLTEXT INDEX index_article_content ON article(content);</code></pre> <p>4. 单列索引、多列索引</p> <p>多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。</p> <p>5. 组合索引(最左前缀)</p> <p>平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步提高MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:</p> <p>–title,time</p> <p>–title</p> <p>为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:<br />  </p> <pre> <code class="language-sql">--使用到上面的索引 SELECT * FROM article WHERE title='测试' AND time=1234567890; SELECT * FROM article WHERE utitle='测试'; --不使用上面的索引 SELECT * FROM article WHERE time=123456789; </code></pre> <h2>二.MySQL索引优化</h2> <p>上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。</p> <h3>1. 何时使用聚集索引或非聚集索引?</h3> <table align="center" border="1" cellpadding="0" cellspacing="0" class="table table-bordered table-hover"> <tbody> <tr> <td>动作描述</td> <td>使用聚集索引</td> <td>使用非聚集索引</td> </tr> <tr> <td>列经常被分组排序</td> <td>使用</td> <td>使用</td> </tr> <tr> <td>返回某范围内的数据</td> <td>使用</td> <td>不使用</td> </tr> <tr> <td>一个或极少不同值</td> <td>不使用</td> <td>不使用</td> </tr> <tr> <td>小数目的不同值</td> <td>使用</td> <td>不使用</td> </tr> <tr> <td>大数目的不同值</td> <td>不使用</td> <td>使用</td> </tr> <tr> <td>频繁更新的列</td> <td>不使用</td> <td>使用</td> </tr> <tr> <td>外键列</td> <td>使用</td> <td>使用</td> </tr> <tr> <td>主键列</td> <td>使用</td> <td>使用</td> </tr> <tr> <td>频繁修改索引列</td> <td>不使用</td> <td>使用</td> </tr> </tbody> </table> <p>事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。其实这个具体用法我还不是很理解,只能等待后期的项目开发中慢慢学学了。</p> <h3>2. 索引不会包含有NULL值的列</h3> <p>只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。</p> <h3>3. 使用短索引</h3> <p>对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。</p> <h3>4. 索引列排序</h3> <p>MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。</p> <h3>5. like语句操作</h3> <p>一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。</p> <h3>6. 不要在列上进行运算</h3> <p>例如:</p> <pre> <code class="language-sql">select * from users where YEAR(adddate)<2007;</code></pre> <p><br /> 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:</p> <pre> <code class="language-sql">select * from users where adddate<’2007-01-01′</code></pre> <p>关于这一点可以围观:<a href="http://www.zendstudio.net/archives/single-quotes-or-no-single-quotes-in-sql-query" rel="external nofollow" target="_blank">一个单引号引发的MYSQL性能损失。</a></p> <p>最后总结一下,MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。而理论上每张表里面最多可创建16个索引,不过除非是数据量真的很多,否则过多的使用索引也不是那么好玩的,比如我刚才针对text类型的字段创建索引的时候,系统差点就卡死了。</p>