Java面试基础1

目录

一、Java基本数据类型

二、集合体系

 集合框架

1、ArrayList源码分析:

2、HashMap底层原理:

三、String StringBuffer StringBuilder的区别:

* 关于String  、StringBuffer  、StringBuilder三者的异同?

 * 对比String  、StringBuffer  、StringBuilder三者的效率?

四、int和Interger的区别

五、多线程

 ** 进程和线程的区别(多线程)--》重要 **

 * 面试题:创建线程有几种方式?

 * 创建线程的方式四:使用线程池

 * 线程通信的例子:使用两个线程打印 1-100,线程1,线程2, 交替打印

 * 涉及到的三个方法:

 * 注意点:

 * 面试题:sleep()和 wait()方法的异同?  (重要)

 解决线程安全问题(synchronized关键字 和 lock锁)

 * 1.面试题: synchronized(同步代码块) 与 Lock(Lock锁)的异同?

 *2.优先使用顺序:

一、Java基本数据类型

 

二、集合体系

/**

 * 一、集合框架的概述

 *

 * 1.集合、数组都是对多个数据进行存储操作的结构,简称Java容器。

 *   说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt .jpg .avi  数据库中等)

 *

 * 2.1数组在存储多个数据方面的特点:

 *   》一旦初始化以后,其长度就确定了。

 *   》数组一旦定义好,其元素的类型也就确定了/ 更严格(是好处)。我们也就只能操作指定类型的数据了。

 *         比如: String[] arr;int[] arr1;Object[] arr2;

 *   》

 * 2.2数组在存储多个数据的缺点:

 *     》一旦初始化以后,其长度就不可修改。

 *     》数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便。同时效率不高。

 *     》获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用。

 *     》数组中存储数据的特点:有序,可重复,对于无序、不可重复的需求,不能满足。

 *

 集合框架

 *

 *        /----------Collection接口:单列集合,用来存储一个一个的对象

 *                /----List接口:存储有序的、可重复的数据。-----》“动态“数组

 *                         /------ArrayList、linkedList、Vector

 *                /----Set接口:存储无序的、不可重复的数据

 *                         /-------HashSet、LinkedHashSet、TreeSet

 *       /-----------Map接口 :双列集合,用来存储一对(key--->value)一对的数据  /键值对

 *                /----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

 *

1、ArrayList源码分析:

 

 

2、HashMap底层原理:

 

 

 

 

三、String StringBuffer StringBuilder的区别:

* 引用数据类型

* final 修饰类,表示不可继承;

修饰常量,表示不可修改的常量

 

* 关于String  、StringBuffer  、StringBuilder三者的异同?

 *

 * String:不可变的字符序列(底层使用char[]存储)现在是使用byte[]存储

 * StringBuffer:可变的字符序列;线程安全的,效率低;(底层使用char[]存储)现在是使用byte[]存储

 * StringBuilder:可变的字符序列;jdk5.0新增的;线程不安全的(没有synchronized),效率高;(底层使用char[]存储)现在是使用byte[]存储

 *

 *

 * 源码分析:

 * String str=new String();  //char[] value=new char[0];

 * String str=new String("abc");  //char[] value=new char[]{'a','b','c'};

 *

 * StringBuffer sb1=new StringBuffer();  //char[] value=new char[16];

 *

 *  System.out.println(sb1.length);            //长度依然为0

 *

 * sb1.append('a');//value[0]='a';

 * sb1.append('b');//value[1]='b';

 *

 * StringBuffer sb2=new StringBuffer("abc");//char[] value=new char["abc".length+16];

 *

 *

 *

 *  public synchronized int length() {

 *         return count;

 *     }

 *

 * 问题一:System.out.println(sb2.length());       //长度为3  return count;  有效字符的数量,并不是字符数组真实的长度

 * 问题二:扩容问题:如果要添加的数据底层数组盛不了了,那就需要扩容底层的数组。

 *      默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。

 *

 *

 *  指导意义:开发中建议使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)  (避免自动扩容)

 *                        //关于容量参数的构造方法

 * 增:append(xxx);添加任意类型;返回值仍为StringBuffer,即可以在后面继续调用append(yyy).append(zzz)....构成方法链

 * 删:delete(int start,int end)

 * 改:setCharAt(int n,char ch) / replace(int start,int end,String str)

 * 查:charAt(int n)

 * 插:insert(int offset,xxx)     可插入任意类型

 * 长度:length()

 * *遍历:for+charAt()  / toString()

 

 * 对比String  、StringBuffer  、StringBuilder三者的效率?

 * 从高到低排列:StringBuilder -->  StringBuffer  -->  String

四、int和Interger的区别

  • int是基本数据类型,Integer是引用数据类型;
  • int默认值是0,Integer默认值是null;
  • int类型直接存储数值,Integer需要实例化对象new,指向对象的地址。

五、多线程

 ** 进程和线程的区别(多线程)--》重要 **

 * 面试题:创建线程有几种方式?

 * 四种:继承Thread  实现Runnable  实现Callable  使用线程池

/**

 * 创建线程的的方式三:实现Callable接口。 ----->JDK5.0新增

 *

 * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?

 * 1.call()可以有返回值的;

 * 2.call()可以抛出异常,被外面的操作捕获,获取异常的信息;

 * 3.Callable是支持泛型的。

 * 创建线程的方式四:使用线程池

 *

 *背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响非常大。

 *

 * 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。

 * 好处:

 * 1.提高响应速度(减少了创建新线程的时间)

 * 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)

 * 3.便于线程管理

 *

 *        corePoolSize:核心池的大小

 *        maximumPoolSize:最大线程数

 *        keepAliveTime:线程没有任务时做多保持多长时间后终止

/**快捷键:Ctrl+alt+T  是显示出用什么方法包围所选中的代码(本例中是选中同步代码,用synchronized包围,解决线程安全问题)

 * 线程通信的例子:使用两个线程打印 1-100,线程1,线程2, 交替打印

 *

 * 涉及到的三个方法:

 * wait():一旦执行此方法,当前线程就会进入阻塞状态,并释放同步监视器(释放锁)。

 * notify():一旦执行此方法,就会唤醒被wait()的一个线程,如果有多个线程被wait(),我们就唤醒优先级高的。

 * notifyAll():一旦执行此方法,就会唤醒所有的被wait()的线程。

 *

 * 注意点:

 * 1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中。

 * 2.wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或者同步方法中的同步监听器。

 *     否则会出现IllegalMonitorStateException异常.

 *3.wait(),notify(),notifyAll()三个方法是定义在java.lang.Object类中。

 * 任何一个类的对象都可以充当同步监听器,而相同的这三个方法也是被同步监听器所调用,所以任何一个类的对象都可以调用这三个方法

 *

 * 面试题:sleep()和 wait()方法的异同?  (重要)

 *1.相同点:一旦执行方法,都可以使当前线程进入阻塞状态。

 * 2.不同点:

 *     1)两个方法声明的位置不一样,Thread类中声明sleep(),Object类声明wait()。

 *     2)调用的要求不同:sleep()方法可以在任何需要的场景下调用,wait()方法必须使用在同步代码块或同步方法中(由同步监听器调用)。

 *     3)关于是否释放同步监听器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放同步监听器,而wait()会释放锁。

/**

 解决线程安全问题(synchronized关键字 和 lock锁

 *   同步代码块,同步方法(synchronized)、lock手动上锁,手动释放锁

*

 * 解决线程安全问题的方式三:Lock锁 ----->  JDK5.0新增

 

 * 1.面试题: synchronized(同步代码块) 与 Lock(Lock锁)的异同?

 *    相同:两者都可以解决线程安全问题

 *    不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监听器

 *         Lock需要手动地启动同步(lock()),同时结束同步也需要手动的实现(unlock())

 *

 *2.优先使用顺序:

 * Lock---> 同步代码块(已经进入了方法体,分配了相应的资源) ---> 同步方法(在方法体之外)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值