zoukankan      html  css  js  c++  java
  • 面试总结

    1.jemeter 性能测试注重

    结果:聚合报告 {平均响应时间  中位数(50%的用户响应时间)  90%用户的响应时间 最小响应时间 最大响应时间 错误率 每秒从服务端接收到的数据量(吞吐量)KB/Sec}

    jemeter基本概念  测试计划  线程组Thread Group:(一定数量的并发用户) 取样器(Sample):模拟各种请求(http ftp请求)监听器:负责收集测试结果   断言 (Assert) 

    定时器:定义线程请求的延迟

    2.测试百度输入一段字符搜索跳转很慢的原因  :

    (客户端 服务器 网络三方面进行考虑 客户端(本身性能很差) 服务器(太多并发线程影响速度) 网络(网络问题))

    3.java final 关键字    final用来声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能派生出新的子类) final属性:被final修饰的常量不可变 (引用不可变 对象不可变)final方法:一个方法声明为final时,该方法不允许任何子类重写(覆盖)这个方法,子类任然可以使用这个方法   final类:此类不能被继承,所有方法不能被重写。

     finally标识符 :  作为异常处理的一部分,只能用在try/catch语句中

     finalize   :Object类的一个方法 在垃圾回收器执行时会被调用

    4. java static 关键字  作用:为某种特定数据类型或对象分配单一的存储空间,与创建对象的个数无关。实现某个方法、属性与类关联在一起,而不是实例对象 (也就是在不创建对象的情况下就可以通过类来直接调用方法或属性)

         4种使用情况: 1)成员变量:在内存中只存在一个复制,类被加载的时候。静态变量就会被分配空间,就可以使用。注:不能在方法中定义static变量

                             2)成员方法: 不需要创建对象就可以被调用。不能使用this或super关键字,不能调用非static方法,只能访问所属类的静态成员变量和方法。

                             3)static代码块:静态代码块,独立于成员变量和成员函数的。只是被执行一次

                             4)static内部类:不依赖于外部类实例对象而被实例化,只能访问外部类的静态成员和静态方法。

    (扩展)java static final关键字      变量:一旦赋值就不可更改,通过类名可以访问

                                                    方法:该方法不可重写,可以通过类名直接访问

    5. java 多线程 

    1)java实现多线程的方式    继承Thread类,重写run()方法;     实现Runable()接口,重写run()方法 ;      实现Callable接口,重写call()方法 

    2)Thread 类中的start() 和 run() 方法有什么区别?

      start()方法被用来启动新创建的线程,此时线程处于就绪状态,而非运行状态,意味着这个线程可以被JVM调度执行。JVM通过调用了run()方法来执行实际操作。异步地调用run()方法,可以实现多线程。; 直接用线程类的run()方法,当做普通函数,任然只有主线程这一个线程,是同步的。

    3)多线程同步的实现方法

    1.synchronized关键字 每个对象有一个对象锁,任何时候只允许被一个线程调用。通过synchronized块指定上锁的对象,结束后释放

    2.wait()与notify()方法 在synchronized代码被执行期间,线程通过调用对象的wait()方法,释放对象锁,进入等待状态 ,调用notify()(只唤醒等待队列中的第一个)或notifyAll()(唤醒所有等待这个对象的线程去竞争)方法通知正在等待的其他线程

    3.Lock()   lock()以阻塞的方式获取锁,如果获得了锁立即返回,如果别的线程持有锁,当前线程等待,直到获取锁后返回。

                  trylock() 以非阻塞的方式获取锁,尝试性地获取一下锁,如果获取到立即返回true,否则返回false

    4)sleep()方法与wait()方法区别

        原理不同。sleep()方法是Thread类的静态方法,使此线程暂停一段时间,时间一到自动苏醒。wait()是Object类的方法,使当前拥有对象锁的进程等待,直到其他线程调用notify()方法。

        对锁的处理机制不同。sleep()方法不涉及线程间的通信,对象锁不会释放。wait()方法会释放对象锁,供其他线程使用。

        使用区域不同。 sleep()可以在任何地方使用   wait()方法必须放在同步控制方法或者同步语句块中。

    5)终止线程的方法  stop()(释放以锁定的所有资源)    suspend()方法(容易发生死锁,不会释放锁)。

    6.测评百度搜索与360搜索,从哪些方面去考虑?(功能上 搜索内容谁更全面有用,准确度高(关键词搜索的准确度);关键词搜索的专业度(大的正规的网站和官网摆在首位)链接更齐全;  UI设计:谁更美观简洁;图标的颜色位置设计  性能:谁的跳转比较迅速;不会出现卡机;安全:密码保密方式,病毒链接的警告防护能力 兼容性:不同语言的正确识别,不同平台Mac ,Linux后者windows的兼容性  360在医疗方面做的比百度好,但是百度无广告,360有广告)

    7.堆排序的原理:堆是一种特殊的树形结构,每个节点都有一个值,堆是一颗完全二叉树,根节点的值小于(或大于)两个子节点的值,根节点的两个子树也分别是一个堆。

                          堆排序是一树形选择排序,将R[1,n]看成一颗完全二叉树的顺序存储。有最大堆和最小堆之分。

                           堆排序的思想:对于给定的N个记录,初始是顺序存储的二叉树,然后调整为一个大顶堆,将最后一个元素与堆顶元素交换。接着将n-1各元素重新调整为大顶堆,再交换,重复此过程直到只剩下一个元素为止。

      利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。

        其基本思想为(大顶堆):

        1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无须区;

        2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 

        3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

    8.哈夫曼编码哈弗曼树:

     哈夫曼树(Huffman Tree),又叫最优二叉树,指的是对于一组具有确定权值的叶子结点的具有最小带权路径长度的二叉树。

    1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
    2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
    3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
    4)重复2)和3),直到集合F中只有一棵二叉树为止。

     哈夫曼编码:

    根据哈夫曼树可以解决报文编码问题。假设需要一个字符串“abcdabcaba”进行编码,将它转换为唯一的二进制码,但要求转换出来的二进制编码的长度最小。对于“abcdabcaba”,共有a、b、c、d4个字符,出现次数分别为4、3、2、1,相当于它们的权值,将a、b、c、d以出现次数为权值构造哈夫曼树。从哈夫曼树根节点开始,对左子树分配代码“0”,对右子树分配“1”,一直到达叶子节点。然后,将从树根沿着每条路径到达叶子节点的代码排列起来,便得到每个叶子节点的哈夫曼编码。

     从图中可以看出,a、b、c、d对应的编码分别为0、10、110、111,然后将字符串“abcdabcaba”转换为对应的二进制码就是0101101110101100100,长度仅为19。这也就是最短二进制编码,也称为哈夫曼编码。

    9. 进程的通信机制主要包括无名管道、有名管道、消息队列、信号量、共享内存以及信号等。这些机制都是由linux内核来维护的,实现起来都比较复杂,而且占用大量的系统资源。

    10.线程间的通信机制实现   1)共享内存   2)管道(首先建立管道流,并将管道流的输入输出对象进行链接;将管道流加入到生产对象(线程)中;通过管道流引出输入输出流,并在线程中对这些流进行操作;)

    11.测试百度网页    

    1.功能测试:

    ● 链接测试
    链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面:
    1)测试所有链接是否按指示的那样确实链接到了该链接的页面;
    2)测试所链接的页面是否存在;
    3)保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

    ●表单测试
    当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。

    ●Cookies测试
    Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作而且对这些信息已经加密。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。

    ●设计语言测试
    Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如[url=]Java[/url]、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。

     ●数据库测试
    在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
    在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。

    2.性能测试:
    网站的性能测试主要从三个方面进行:连接速度测试、负荷测试(Load)和压力测试(Stress).连接速度测试指的是打开网页的响应速度测试。负荷测试指的是进行一些边界数据的测试,压力测试更像是恶意测试,压力测试倾向应该是致使整个系统崩溃。

    ●连接速度测试
    用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。
    另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。
    ●负载测试
    负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?
    ●压力测试
    负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。
    进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
    压力测试的区域包括表单、登陆和其他信息传输页面等。
    3。接口测试
    在很多情况下,web 站点不是孤立。Web 站点可能会与外部服务器通讯,请求数据、验证数据或提交订单。
    ●服务器接口
    第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。
    ●外部接口

    有些 web 系统有外部接口。例如,网上商店可能要实时验证信用卡数据以减少欺诈行为的发生。测试的时候,要使用 web 接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。如果商店只使用 Visa 卡和 Mastercard 卡, 可以尝试使用 Discover 卡的数据。(简单的客户端脚本能够在提交事务之前对代码进行识别,例如3 表示 American Express,4 表示 Visa,5 表示Mastercard,6 代表Discover。)通常,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。

    ●错误处理
    最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,看看会发生什么情况?订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?如果用户自己中断事务处理,在订单已保存而用户没有返回网站确认的时候,需要由客户代表致电用户进行订单确认。

    4 可用性测试

    ●导航测试
    导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。

    ●图形测试
    在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。

    ●内容测试
    内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。

    ●整体界面测试
    整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?

    5. 兼容性测试

    ●平台测试
    市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等

    ●浏览器测试

    6.安全性测试

    ●目录设置

    ●登录
    现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。
    ●Session
    Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。
    ●日志文件
    为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。
    ●加密
    当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。
    ●安全漏洞
    服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。

    12.测试百度App的语音识别功能

    13.选择排序 和插入排序

    public class ChoiceSort {  
      
        public static void _choiceSort(Integer[] a) {  
            if (a == null || a.length <= 0) {  
                return;  
            }  
            for (int i = 0; i < a.length; i++) {  
                int min = i; /* 将当前下标定义为最小值下标 */  
      
                for (int j = i + 1; j < a.length; j++) {  
                    if (a[min] > a[j]) { /* 如果有小于当前最小值的关键字 */  
                        min = j; /* 将此关键字的下标赋值给min */  
                    }  
                }  
                if (i != min) {/* 若min不等于i,说明找到最小值,交换 */  
                    int tmp = a[min];  
                    a[min] = a[i];  
                    a[i] = tmp;  
                }  
            }  
        }  
    } 

      

       public static void insertSort(int[] numbers)
        {
        int size = numbers.length;
        int temp = 0 ;
        int j =  0;
        
        for(int i = 1 ; i < size ; i++)
        {
            temp = numbers[i];
            //假如temp比前面的值小,则将前面的值后移
            for(j = i ; j > 0 ; j --)
            {
                if(numbers[j-1]>temp){
                    numbers[j]=numbers[j-1];
                    }
            }
            numbers[j] = temp;
        }
        }
    

     14.希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。 

                                

                                        

      

                                           

                  

         

  • 相关阅读:
    并发编程(IO多路复用)
    411. 格雷编码
    120. 单词接龙 (BFS)
    1244. Minimum Genetic Mutation
    47.Majority Element I & II
    86. 二叉查找树迭代器
    1183. 排序数组中的单个元素
    163. 不同的二叉查找树
    428.x的n次幂
    156. 合并区间
  • 原文地址:https://www.cnblogs.com/lucyliu/p/6749840.html
Copyright © 2011-2022 走看看