[ 面试题 ] java基础

  1. tcp和udp区别.
    TCP—传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。
    UDP—用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。
  • ArrayList和LinkedList区别?
    二者都用来存数据,
    ArrayList数组存储数据,索引值以下标来搜索,查询比较方便,删除增加比较麻烦,有序,可以重复。
    但是linkedList以链表式存储数据,对于增删比较方便。

  • JSON的结构?
    json是一种轻量级的数据交换格式,
    json简单说就是对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
    1、对象:对象表示为“{}”扩起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
    2、数组:数组在json中是中括号“[]”扩起来的内容,数据结构为 [“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
    经过对象、数组2种结构就可以组合成复杂的数据结构了。

  • &和&&的区别
    一个位运算符,一个是逻辑运算符

  • Java的基本特征
    1、封装:封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
    2、继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
    3、多态:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
    3.1、实现多态,有二种方式,覆盖,重载。
    覆盖(重写),是指子类重新定义父类的虚函数的做法。
    重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

  • 异步和同步的区别?
    同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
    异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

  • Sleep和wait的区别
    1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
    2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制, 因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
    3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
    4.Sleep需要捕获异常,而wait不需要

  • 静态变量合实例变量的区别
    语法:静态变量前要加static来修饰,而实例变量前则不加;
    程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量;静态变量不属于某个实例对象,而是属于类,所以也称为类变量,静态变量就会被分配空间,静态变量就可以被使用了。

  • 什么是匿名内部类,在什么时候调用?
    内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用。
    匿名内部类:它只能使用一次,不区分static和非static。如果用到外部类的变量的话,必须是类变量或者实例变量,就是必须是类定义的变量,或者final的局部变量。匿名内部类如果是继承某个类的话是可以重写那个类的方法的,这个和普通内部类一样。
    实现事件监听器的时候,用匿名内部类编码非常简洁,也容易读懂,不重复利用时使用。

  • 线程和进程的区别
    进程是表示资源分配的基本单位,又是调度运行的基本单位。
    线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。
    线程的优点:
    (1)易于调度。
    (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
    (3)开销少。创建线程比创建进程要快,所需开销很少。。
    (4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
    进程和线程的关系:
    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
    (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
    (3)处理机分给线程,即真正在处理机上运行的是线程。
    (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

  • 接口和抽象类的区别
    abstract可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用abstract定义该类,即抽象类。
    用interface修饰的类,里面的方法都是抽象方法,因此在定义接口的时候,可以直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即public static final修饰的字段。

  • xml有几种解析方式、区别?
    基本的解析方式有三种: DOM,SAX,Pull
    dom解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后就可以使用 DOM 接口来操作这个树结构。优点是对文档增删改查比较方便,缺点占用内存比较大。
    sax解析:基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改,不能中途停止。
    pull解析:同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们(主动提取事件)

  • 访问网络如何加密
    1:对称加密(DES,AES)和非对称(RSA公钥与私钥)。(支付宝里的商户的公钥和私钥)
    2:MD5(算法)
    3:Base64

  • gc是什么
    GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

  • GC内存泄露在什么情况下回出现?怎么解决?
    (一) 查询数据库没有关闭游标
    (二) 构造Adapter时,没有使用缓存的 convertView
    (三) Bitmap对象不在使用时调用recycle()释放内存
    (四) 不用的对象没有及时释放对象的引用

  • 说说java的反射机制原理以及应用场合?
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    类对象: 封装了类的描述信息的对象,类加载的产物,由jvm创建java.lang.Class
    应用场景: Gson 序列化反序列化
    获取类对象的方式:
    1.类名.class 2. 类的对象.getClass() 3. Class.forName(“包名.类名”)

  • java有几种引用类型
    强引用,软引用、弱引用、幽灵引用

  • ArrayList的便利

ArrayList<String> al = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
    al.add(String.valueOf(i));
}
Iterator<String> it = al.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}
  • 集合的实现类
    1>Collection接口,集合结构总的父接口,有两个子接口list和set;
    List接口 元素有序可重复;
    实现类有:
    ArrayList 数组实现轻量级,运行快,线程不安全。JDK1.2 查询快
    Vector 数组实现重量级,运行慢,线程安全。JDK1.0
    LinkedList链表实现 常用语堆栈与队列的实现 增删操作快
    Set 接口 元素无序不可重复
    实现类有:
    HashSet,元素无需、不可重复;底层用hashCode()算法实现,保证元素的无序唯一,自定义对象存进HashSet为了保证元素内容不重复需要覆盖hashCode()与equals()方法。
    SortedSet(不重要) 元素有序(Unicode升序)唯一
    TreeSet要求元素有序,自定义的对象需要实现Comparable接口的 compareTo(object o)方法
    2>Map(接口);与Collection接口无关,有一个子接口SortedMap特点: 元素是key-value, key 唯一,无序; value可重复
    实现类
    HashMap 轻量级 线程不安全的,允许key或value为null JDK1.2
    HashTable 重量级 线程安全的 不允许key或value为null JDK1.0

  • char,varchar区别
    1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
    2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。

  • 如何序列化
    1). 实现序列化 Serializable
    2). 属性私有化,并提供get,set方法
    3). 提供无参构造
    4). 属性名必须与json串中属性名保持一致 (因为Gson解析json串底层用到了Java的反射原理)

  • 八种基本数据类型
    byte、short、int、long、float、double、char、boolean

  • ==equals区别
    1、 ==是判断两个变量或实例是不是指向同一个内存空间
    equals是判断两个变量或实例所指向的内存空间的值是不是相同
    2、==是指对内存地址进行比较
    equals()是对字符串的内容进行比较
    3、==指引用是否相同
    equals()指的是值是否相同

  • public,private,protect权限
    public在任何情况下都可用;
    protect可在当前类,同一个包中和子孙类中使用;
    default:可在当前类和同一个包中使用
    private只能在当前类中使用

  • json解析方式的两种区别
    1,SDK提供JSONArray,JSONObject
    2,google提供的 Gson
    通过fromJson()实现对象的反序列化(即将json串转换为对象类型)
    通过toJson()实现对象的序列化 (即将对象类型转换为json串)
    通过google提供的Gson解析json时,定义JavaBean的规则是什么?
    1). 实现序列化 Serializable
    2). 属性私有化,并提供get,set方法
    3). 提供无参构造
    4). 属性名必须与json串中属性名保持一致 (因为Gson解析json串底层用到了Java的反射原理)

  • static内部发出对非static的调用
    不能调用

  • 重载和重写的区别
    方法的重载属于,编译时多态,方法名相同参数列表不同,返回值必须相同或都没有返回值类型。
    方法的覆盖属于运行时多态,子类覆盖父类的方法,子类指向父类引用,在调用方法的时候用父类的引用调用。

  • 集合和数组的区别
    1):数组在定义时必须定义长度,而集合在定义时不必定义长度。
    2):数组在定义时必须要声明数组的数据类型,而集合不必。但是一般情况下我们都是存储统一数据类型的数据,我们可以使用泛型的写法来限制集合里面的数据类型。

  • 定义数组的几种方式
    nt a[]; //声明未初始化
    a = new int [10]; // 定义占用空间大小(10个int)
    int a[] = new int [10]; //声明并定义大小(即分配了指定大小的空间)
    int a[] = {1,2,3}; // 声明并初始化,占用空间大小是3个int。

  • 什么方法不能被重写
    被final修饰的方法,构造方法,

  • Collection 和 Collections的区别
    Collection是集合类的上级接口,继承与他的接口主要有Set 和List
    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

  • Final和Finally的区别
    final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
    finally是异常处理语句结构的一部分,表示总是执行。
    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

  • 线程的几种状态
    1)新建状态(New):新创建了一个线程对象。
    2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
    3)运行状态(Running):就绪状态的线程获取了CPU,执行run()方法。
    4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
    阻塞的情况分三种:
    等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
    同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
    其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
    5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
    当调用start方法的时候,该线程就进入就绪状态。等待CPU进行调度执行,此时还没有真正执行线程。

  • Dvm是什么
    Android 运行环境主要指的虚拟机技术——Dalvik。Android中的所有Java程序都是运行在Dalvik VM上的。Android上的每个程序都有自己的线程,DVM只执行.dex的Dalvik executable 文件。每个Android应用在底层都对应有一个独立的DVM实例并在其解释下执行。

  • Http和Https有什么区别
    http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。http的连接很简单,是无状态的,… HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全

  • 简单讲解一下递归
    递归算法一般用于解决三类问题:
    (1)数据的定义是按递归定义的。(Fibonacci函数)
    (2)问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
    (3)数据的结构形式是按递归定义的。如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
    递归的缺点:
    递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
    递归典型问题: 梵塔问题(汉诺塔问题)
    已知有三根针分别用A, B, C表示,在A中从上到下依次放n个从小到大的盘子,现要求把所有的盘子
    从A针全部移到B针,移动规则是:可以使用C临时存放盘子,每次只能移动一块盘子,而且每根针上
    不能出现大盘压小盘,找出移动次数最小的方案.

  • Xml解析有几种,分别是什么
    三种,分别为:sax,pull,dom
    dom解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后就可以使用 DOM 接口来操作这个树结构。优点是对文档增删改查比较方便,缺点占用内存比较大。
    sax解析:基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改,不能中途停止。
    pull解析:同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们

  • 字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符串倒序,比如字符串“abcde” 变成“edcba”
    答:
    String src = “ABCDEF “;
    String dst = new StringBuffer(src).reverse().toString();

  • 线程的实现方式
    答:线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口

================================================

常见AndRoid面试题第一篇:四大组件
面试题-java代码编写部分
更多内容请关注 我的专题
转载请注明 出处:
http://www.jianshu.com/users/c1b4a5542220/latest_articles

点赞