JAVA高级编程基本问题

1.多线程

程序、进程、线程的区别与联系

程序 (program) 是为完成特定任务、用某种语言编写 的一组指令的集合。即指一段静态的代码,静态对象。
进程 (process (process(process(process)是程序的一次执行过程,或正在运行的一个程序 。是 一个动态的过程 :有它自身的产生、存在和消亡过程。
进程 (thread) ,进程可一步细化为线程,是一个程序内部的一条执行路径。
若一个进程同时间并行执行多个线程,就是支持多线程的
 线程作为调度和执行的单位,每个拥有独立运栈序计数器 (pc) ,线程切换的开销小
 一个进程中的多线共享相同内存单元 /内存地址空间 它们从同一堆中分配 对象,可以 访问相同的变量和对象。这就使得线程间通信更简便、高效但多个操作共享系统资源可能就会带来 安全的隐患 。

创建线程的四种方式(extends,Runnable,callable,线程池)

线程的生命周期

线程生命周期

线程的同步方式(继承,接口,lock(5.0)对比与实现)

释放锁的操作:
当前线程的同步方法、代码块执行结束。
当前线程在同步代码块、同步方法中遇到 break、return终止该代码块
当前线程在同步代码块、同步方法中出现了未处理的ERROR或EXCEPTION
当前线程在同步代码块、同步方法中执行线程对象的wait()方法,当前线程暂停,并释放锁
不会释放锁的操作:
当前线程在同步代码块、同步方法中调用sleep(),yield()方法暂停当前线程的执行,
线程执行同步代码块时,其它线程调用该线程的suspend()方法将该线程挂起,不会释放锁。

线程的优先级是指CPU分配概率高低,而不是执行先后

sleep与wait方法的异同

1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
2.不同点:1)两个方法声明的位置不同:Thread类中声明sleep() , Object类中声明wait()
2)调用的要求不同:sleep()可以在任何需要的场景下调用。 wait()必须使用在同步代码块或同步方法中
3)关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁。

生产者消费者问题

生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,
店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员
会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品
了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。

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

  1. call()可以有返回值的。
  2. call()可以抛出异常,被外面的操作捕获,获取异常的信息
  3. Callable是支持泛型的

2.JAVA常用类

字符串两种构建方式的区别

字符串常量池中是不会存储相同内容
方式一:通过字面量定义的方式
方式二:通过new + 构造器的方式
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中一个是变量,结果就在堆中。
3.如果拼接的结果调用intern()方法,返回值就在常量池中

//通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
String s1 = "javaEE";
String s2 = "javaEE";
//通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
String s3 = new String("javaEE");
String s4 = new String("javaEE");

System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false

String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?

两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”

String、StringBuffer、StringBuilder三者的对比

String:不可变的字符序列;底层使用char[]存储
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
执行效率:从高到低排列:StringBuilder > StringBuffer > String
开发建议:开发中建议使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)

JAVA比较器

Comparable与Comparator的区别:
Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
Comparator接口属于临时性的比较。

3.枚举类和注解

枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类
当需要定义一组常量时,强烈建议使用枚举类
如果枚举类中只一个对象,则可以作为单例模式的实现方式。

注解:
Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation,程序员可以在不改变原逻辑的情况下, 在源文件中嵌入一些补充信息。
框架 = 注解 + 反射机制 + 设计模式

4.JAVA集合

Collection接口基本结构

collection

Collection的两种遍历方式

  1. 迭代器
    Iterator iterator = coll.iterator();
    //hasNext():判断是否还下一个元素
    while(iterator.hasNext()){
    //next():①指针下移 ②将下移以后集合位置上的元素返回
    System.out.println(iterator.next());
    }
  2. foreach循环(内部使用的仍然是迭代器)
public void test(){
   Collection coll = new ArrayList();
   coll.add(123);
   coll.add(456);
 
   for(Object obj : coll){
	System.out.println(obj);
	}
}

List和Set的联系与区别

联系:都实现Collection接口
区别:List存储有序,可重复的集合;Set存储无序不可重复的集合。

List中的ArrayList、Vector、LinkedLIst的联系和区别

ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储
LinkedLIst:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

HashSet、LinkedHashSet、TreeSet的区别与联系

HashSet:作为Set接口的主要实现类;线程不安全的;可以存储null值
LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据。对于频繁的遍历操作,LinkedHashSet效率高于HashSet
TreeSet:可以照添加对象的指定属性,进行排序。

HashMap的底层实现原理

JDK7:
HashMap map = new HashMap():
在实例化以后,底层创建了长度是16的一维数组Entry[] table。
…可能已经执行过多次put…
map.put(key1,value1):
首先,调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。
如果此位置上的数据为空,此时的key1-value1添加成功。 ----情况1
如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key1和已经存在的一个或多个数据的哈希值:
如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功。----情况2
如果key1的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,继续比较:调用key1所在类的equals(key2)方法,比较:
如果equals()返回false:此时key1-value1添加成功。----情况3
如果equals()返回true:使用value1替换value2。
补充:关于情况2和情况3:此时key1-value1和原来的数据以链表的方式存储。

JDK8与7的区别:

  1. new HashMap():底层没创建一个长度为16的数组
  2. jdk 8底层的数组是:Node[],而非Entry[]
  3. 首次调用put()方法时,底层创建长度为16的数组
  4. jdk7底层结构只:数组+链表。jdk8中底层结构:数组+链表+红黑树。
    4.1 形成链表时,七上八下(jdk7:新的元素指向旧的元素。jdk8:旧的元素指向新的元素)
    4.2 当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 且当前数组的长度 > 64时,此时此索引位置上的所数据改为使用红黑树存储。

5.泛型

什么是泛型?

所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返
回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、
创建对象时确定(即传入实际的类型参数,也称为类型实参)。

6.IO流

流的三种分类方式

流向:输入流、输出流

数据单位:字节流、字符流

流的角色:节点流、处理流

字节流与字符流的区别与使用情境

字节流:read(byte[] buffer) / read() 非文本文件

字符流:read(char[] cbuf) / read() 文本文件

转换流是哪两个类,分别的作用是什么?

InputStreamReader:将输入的字节流转换为输入的字符流。 解码

OutputStreamWriter:将输出的字符流转换为输出的字节流。编码

7.网络编程

IP

IP:唯一的标识 Internet 上的计算机(通信实体)
在Java中使用InetAddress类代表IP
IP分类:IPv4 和 IPv6 ; 万维网 和 局域网
域名: www.baidu.com www.mi.com www.sina.com www.jd.com
域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。

端口号

正在计算机上运行的进程。

分型模型

分型模型

TCP与UDP

TCP/IP

TCP三次握手与四次挥手

三次握手

四次挥手

8.反射

什么是反射

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何
类的内部信息,并能直接操作任意对象的内部属性及方法。

框架 = 反射 + 注解 + 设计模式。

Class类

1.类的加载过程:
程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。
接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件
加载到内存中。此过程就称为类的加载。加载到内存中的类,我们就称为运行时类,此
运行时类,就作为Class的一个实例。
2.换句话说,Class的实例就对应着一个运行时类。
3.加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式
来获取此运行时类。

9. JDK1.8新特性

Lambda表达式

如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。
Lambda表达式的本质:作为函数式接口的实例
举例: (o1,o2) -> Integer.compare(o1,o2);
格式:
-> :lambda操作符 或 箭头操作符
->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表
->右边:lambda体 (其实就是重写的抽象方法的方法体

->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只一个参数,其一对()也可以省略

->右边:lambda体应该使用一对{}包裹;如果lambda体只一条执行语句(可能是return语句,省略这一对{}和return关键字

StreamApi

Stream关注的是对数据的运算,与CPU打交道
集合关注的是数据的存储,与内存打交道
java8提供了一套api,使用这套api可以对内存中的数据进行过滤、排序、映射、归约等操作。类似于sql对数据库中表的相关操作。
① Stream的实例化
② 一系列的中间操作(过滤、映射、…)
③ 终止操作

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值