热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vivo一面凉经

链接:https:www.nowcoder.comdiscuss112192目录1.手撕代码,二分查找,递归非递归2.java反射机制

链接:https://www.nowcoder.com/discuss/112192

 

目录

1.手撕代码,二分查找,递归非递归

2.java反射机制,优点缺点

3.java线程同步,synchronized锁升级机制,synchronized lock区别

4.项目,感觉最难的一点,怎么解决之类的

5.看成绩单,问我成绩为什么比较差

6.java public private protected default

7.手撕代码,中序遍历,递归非递归

8.学校的一堆事,什么社团经历,最有成就感的事,最失败的事,优点缺点啥的



1.手撕代码,二分查找,递归非递归

采用非递归方式完成二分算法

public static int binarySearch(Integer[] srcArray,int des){int low&#61;0;int high&#61;srcArray.length-1;while(low<&#61;high){int middle&#61;(low&#43;high);if(des&#61;&#61;srcArray[middle])return middle;else if(des}

采用递归方式完成二分查找算法

int BinSearch(int Array[],int low,int high,int key){if(low<&#61;high){int middle&#61;(low&#43;high)/2;if(key&#61;&#61;Array[middle])return middle;else if(keyArray[mid])return BinSearch(Array,middle&#43;1,high,key);}elsereturn -1;
}


2.java反射机制&#xff0c;优点缺点

反射的用途 Uses of Reflection
反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中。这是一个相对高级的特性&#xff0c;只有那些语言基础非常扎实的开发者才应该使用它。如果能把这句警示时刻放在心里&#xff0c;那么反射机制就会成为一项强大的技术&#xff0c;可以让应用程序做一些几乎不可能做到的事情。

反射的缺点 Drawbacks of Reflection
尽管反射非常强大&#xff0c;但也不能滥用。如果一个功能可以不用反射完成&#xff0c;那么最好就不用。在我们使用反射技术时&#xff0c;下面几条内容应该牢记于心&#xff1a;

性能第一  
反射包括了一些动态类型&#xff0c;所以JVM无法对这些代码进行优化。因此&#xff0c;反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。

安全限制 
使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行&#xff0c;如Applet&#xff0c;那么这就是个问题了。

内部暴露   
由于反射允许代码执行一些在正常情况下不被允许的操作&#xff08;比如访问私有的属性和方法&#xff09;&#xff0c;所以使用反射可能会导致意料之外的副作用&#xff0d;&#xff0d;代码有功能上的错误&#xff0c;降低可移植性。反射代码破坏了抽象性&#xff0c;因此当平台发生改变的时候&#xff0c;代码的行为就有可能也随着变化。


3.java线程同步&#xff0c;synchronized锁升级机制&#xff0c;synchronized lock区别

我们在面试的时候&#xff0c;时常被问到如何保证线程同步已经对共享资源的多线程编程。我们当然用同步代码块&#xff0c;同步方法&#xff0c;又或者是用java提供的锁机制来达到对共享资源变量的同步控制。

那么我们什么时候用synchronized,什么时候用lock&#xff0c;以及他们的区别是什么呢&#xff1b;

首先来说synchronized 是Java的关键字&#xff0c;是Java的内置特性&#xff0c;在JVM层面实现了对临界资源的同步互斥访问&#xff0c;通过对对象的头文件来操作&#xff0c;从而达到加锁和释放锁的目的。对象的头文件如下图&#xff1a;

那么synchronized的缺点是啥呢&#xff1a;

1&#xff09;不能响应中断&#xff1b;

2&#xff09;同一时刻不管是读还是写都只能有一个线程对共享资源操作&#xff0c;其他线程只能等待

3&#xff09;锁的释放由虚拟机来完成&#xff0c;不用人工干预&#xff0c;不过此即使缺点也是优点&#xff0c;优点是不用担心会造成死锁&#xff0c;缺点是由可能获取到锁的线程阻塞之后其他线程会一直等待&#xff0c;性能不高。

而lock接口的提出就是为了完善synchronized的不完美的&#xff0c;首先lock是基于jdk层面实现的接口&#xff0c;和虚拟机层面不是一个概念&#xff1b;其次对于lock对象中的多个方法的调用&#xff0c;可以灵活控制对共享资源变量的操作&#xff0c;不管是读操作还是写操作&#xff1b;

lock接口的关系图&#xff1a;

ReentrentLock对象和ReentrentReadWriteLock为我们日常开发中见到和用到比较多的两个类&#xff1b;他们都是可重入的锁&#xff0c;即当同一线程获取到锁之后&#xff0c;他在不释放锁的情况下&#xff0c;可以再次获取到当前已经拿到的锁&#xff0c;只需标记获取到锁的次数加一即可&#xff1b;

下面已ReentrentLock的使用为例&#xff0c;来说明如何对共享变量的控制&#xff1b;要求线程甲和线程乙各自轮询添加数字到list集合中&#xff1b;假设说次数为3次&#xff1b;


package part6.jstack;

import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by xq on 17/6/26.
 */
public class TestLock {
    private ArrayList arrayList &#61; new ArrayList<>();
    Lock lock &#61; new ReentrantLock();
    public static void main(String[] args) {
        final TestLock test &#61; new TestLock();
        for (int i &#61; 0; i <3; i&#43;&#43;) {

           final Integer count&#61;i;
            new Thread("甲"){public void run() {
                test.insert(Thread.currentThread(),count);
            };}.start();
            new Thread("乙"){public void run() {
                test.insert(Thread.currentThread(),count);
            };}.start();

        }
        test.arrayList.stream().forEach(e->{
            System.out.println(e);
        });
    }

    public void insert(Thread thread,Integer count) {

        lock.lock();
        try {
            //线程获取到了锁
            for (int i &#61; 0; i<5; i&#43;&#43;) {
                arrayList.add("第"&#43;count&#43;"次"&#43;"线程"&#43;thread.getName()&#43;i);
            }
        } catch (Exception e) {

        }finally {
            //线程释放锁
            lock.unlock();
        }
    }
}
执行结果如下图&#xff1a;
从结果中可以看出&#xff0c;在一个时刻只能有一个线程获取到锁并执行打印&#xff1b;
那么lock和synchronized的区别对比如下&#xff1a;
1&#xff09;synchronized 在成功完成功能或者抛出异常时&#xff0c;虚拟机会自动释放线程占有的锁&#xff1b;而Lock对象在发生异常时&#xff0c;如果没有主动调用unLock()方法去释放锁&#xff0c;则锁对象会一直持有&#xff0c;因此使用Lock时需要在finally块中释放锁&#xff1b;
2&#xff09;lock接口锁可以通过多种方法来尝试获取锁包括立即返回是否成功的tryLock(),以及一直尝试获取的lock()方法和尝试等待指定时间长度获取的方法&#xff0c;相对灵活了许多比synchronized;
3) 通过在读多&#xff0c;写少的高并发情况下&#xff0c;我们用ReentrantReadWriteLock分别获取读锁和写锁来提高系统的性能&#xff0c;因为读锁是共享锁&#xff0c;即可以同时有多个线程读取共享资源&#xff0c;而写锁则保证了对共享资源的修改只能是单线程的。
https://www.cnblogs.com/lemon-flm/p/7880119.html

4.项目&#xff0c;感觉最难的一点&#xff0c;怎么解决之类的



5.看成绩单&#xff0c;问我成绩为什么比较差



6.java public private protected default

 

7.手撕代码&#xff0c;中序遍历&#xff0c;递归非递归

 

8.学校的一堆事&#xff0c;什么社团经历&#xff0c;最有成就感的事&#xff0c;最失败的事&#xff0c;优点缺点啥的


推荐阅读
  • pdf怎么把html变成pdf1 用AdobeAcroat8.1.2,打开网页后,页面右键菜单中会出现一个“转换为AobePDF的选项,点击就可以转换。 安装AdobeAcroba ... [详细]
  • Smali代码注入
    以下的内容是对官方MIUIV4移植教程的补充,其中一些工具的使用就不在这里赘述,请大家参考官方教程。好的,话不多说,进入正题 ... [详细]
  • 结对编程 地铁最短路径 张波朱新远
    结对编程地铁最短路径一、任务:实现一个帮助进行地铁出行路线规划的命令行程序。PSP2.1PersonalSoftwareProcessStagesTimePlanni ... [详细]
  • 本博客是本人的一些小结,如有纰漏,欢迎拍砖。首先若是想做大项目的话,不要觉的框架写着没有用,而不写,先把框架写好,以后有需要的时候才可以填充这个框架,项目才可以做大。 ... [详细]
  • 一、在androidStudio中实现tabs比较简单,新建项目就可以选择tabs模板进行创建,默认实现tabs功能:直接运行项目就可以看到效果:可以说非常简单,但是我们在实际开发 ... [详细]
  • 本文分析HashMap的实现原理。数据结构(散列表)HashMap是一个散列表(也叫哈希表),用来存储键值对( ... [详细]
  • 开发笔记:携程2019校招编程题
    本文由编程笔记#小编为大家整理,主要介绍了携程2019校招编程题相关的知识,希望对你有一定的参考价值。携程今年的机试题为20道选择+3编程由于今天最后提交时第三题 ... [详细]
  • JavaBean和Map 转换 用反射方法实现
    由于JavaBean(实体类)结构与Map类似,我们可以把JavaBean与Map进行转换 ... [详细]
  • 使用Java调用exe可执行文件
    一、出发点平日里,我们看到了很多已经成型的可执行文件,而且经过了一定的封装。因为开源的关系,大多时候可以自己使用eclipse进行编译&# ... [详细]
  • 在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能,即当用户输入用户名密码进行登录的时候计数器加1,然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存在一些 ... [详细]
  • SpringBoot 整合 ShardingJDBC(mysql8.0)(简单入门含gitee源码)
    SpringBoot整合Sharding-JDBC(mysql-8.0)感谢​我也是从网上的资源查找后进行学习的,所以该项目仅适用与个人学习,不建议使用于生产项目。​这里感谢如下: ... [详细]
  • 我是python小白一枚,对kivy开发手机app产生了兴趣,并没感觉到kivy写代码有多难,折腾打包成手机apk倒是花了好长时间,走过了大大小小的坑,这里把经验记录下来,供大家参 ... [详细]
  • MQ的使用
    安装环境:linuxredhatactivemq版本:5.8.01.从http:activemq.apache.orgdownload.html地址下载 ... [详细]
  • 一、如果使用默认的1521端口,让实例自动注册到该监听上,那么local_listener无需设置,listener.ora文件按照正常方 ... [详细]
  • Java回收对象的标记和对象的二次标记过程一、对象的标记1、什么是标记?怎么标记?第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收 ... [详细]
author-avatar
无心无嗔_170
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有