Java基础篇

Java基础篇

1 面向对象和面向过程的区别

面向过程:分析问题步骤,用函数一步步实现

面向对象: 有封装,继承,多态的特性,易维护,复用,扩展,可以设计出低耦合系统、

2 八种基本数据类型的大小,以及他们对应的封装类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9ELJOqu-1677573844719)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221121235042598.png)]

封装类是引用类型,默认值为null 基本数据类型申明时系统自动分配空间,引用类型只是分配引用空间。注意这里面的一些细节,将一个数组赋值给另一个数组时只是复制了一个引用,所以通过某一个数组所做的修改在另一个数组中也看的见。 (对包装类对应的数据范围考察的题,。实质上考察的是对源码的考察)

3 命名规则 :驼峰命名法

4 instanceof关键字的作用:

用来测试一个对象是否为一个类的实例,编译器检查左边的对象是否可以转换成右边的class类型,不能报错,不能确定通过编译来定,如果obj==null,返回false

5 自动装箱与拆箱

装箱:将基本数据类型转换为包装器类型(int–>Interger) Integet.valueOf(int)方法

拆箱: 自动将包装器类型转换为基本数据类型,(Integer——>int ) Integer.intValue()

Javase 5出现自动装箱:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXKkcrrO-1677573844720)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221122001749441.png)]

考察的是integer.valueof()方法的具体实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7WiZUOY-1677573844721)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221122001731709.png)]

6 重载与重写的区别:

重写:在子类中把父类的方法重新写一遍(注意点:1.返回类型(除子类中方法的返回类型是父类返回类型的子类)必须相同 2. 访问修饰符的限制一定要大于被访问修饰符(public,protected,default,private)3 重写方法不能抛出新的检查异常或者更宽泛的检查异常)

重载: 在一个类中,同名的方法如果有不同的参数列表则视为重载。对返回类型没有要求

7 equal与==的区别

==比较的是变量(栈)内存中存放的对象(堆)内存地址,用来判断两个对象的地址是否相同,即是否指向相同的一个对象,比较的是真正意义上的指针操作。

equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所

以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object

中的equals方法返回的却是==的判断 一般涉及到重写equals方法

8 修饰符的可访问性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3uQRIJuB-1677573844722)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230111204333832.png)]

1. private

用 private 修饰的类成员,只能被该类自身的方法访问和修改,而不能被任何其他类(包括该类的子类)访问和引用。因此,private 修饰符具有最高的保护级别。例如,设 PhoneCard 是电话卡类,电话卡都有密码,因此该类有一个密码域,可以把该类的密码域声明为私有成员。

2. friendly(默认)

如果一个类没有访问控制符,说明它具有默认的访问控制特性。这种默认的访问控制权规定,该类只能被同一个包中的类访问和引用,而不能被其他包中的类使用,即使其他包中有该类的子类。这种访问特性又称为包访问性(package private)。

同样,类内的成员如果没有访问控制符,也说明它们具有包访问性,或称为友元(friend)。定义在同一个文件夹中的所有类属于一个包,所以前面的程序要把用户自定义的类放在同一个文件夹中(Java 项目默认的包),以便不加修饰符也能运行。

3. protected

用保护访问控制符 protected 修饰的类成员可以被三种类所访问:该类自身、与它在同一个包中的其他类以及在其他包中的该类的子类。使用 protected 修饰符的主要作用,是允许其他包中它的子类来访问父类的特定属性和方法,否则可以使用默认访问控制符。

4. public

当一个类被声明为 public 时,它就具有了被其他包中的类访问的可能性,只要包中的其他类在程序中使用 import 语句引入 public 类,就可以访问和引用这个类。

类中被设定为 public 的方法是这个类对外的接口部分,避免了程序的其他部分直接去操作类内的数据,实际就是数据封装思想的体现。每个 Java 程序的主类都必须是 public 类,也是基于相同的原因。

9 Hashcode的作用

利用哈希算法来提高集合中查找元素的效率:它返回的就是根据对象的内存地址换算的一个值。当需要添加新的元素的时候,先调用这个元素的hashCode方法,一下定位好他应该放置的物理位置上。没有元素直接存储,有的话equals比较,相同的话不存命不同就散列其他的地址

10 String、String ,StringBuffer 和StringBuilder的区别是什么

String是一个只读字符串,不是基本数据类型,是一个对象,底层源码是一个final类型的字符数组,一经定义无法修改,每次对String的操作都会生成新的String对象。

每次+操作

隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼

接+后面的字符。

StringBuffer和StringBuilder的底层都是可变的字符数组,在进行频繁的字符串操作时,建议使用StringBuffer和StringBuilder来进行操作。

StringBuffer:对方法加了同步锁或者对调用的方法加了同步锁,线程安全的

StringBuilder:没有对方法进行加同步锁,非线程安全的

11 . ArrayList和LinkedList的区别

List:

有序集合,可以包含重复元素,安索引访问,继承Collection

ArrayList:

可以看做是能够自动增长容量的数组。底层实现时Array

它的toArray方法返回一个数组,asList方法返回一个列表。

初始容量为10,每回增加之前容量的一半。

LinkedList:(对应的实现方式)

是一个双链表,在添加与删除元素有更好的性能,不过get与set方面弱于ArrayList。

12 HashMap和HashTable的区别

HashMap是线程不安全的,在多线程并发的环境下,可能会发生死锁问题。

HashTable是线程安全的,每个方法都有synchronized 关键字

13 Java创建对象的四种方式

1 new创建新对象
User user=new User();
2 通过反射机制:

使用 newInstance(),但是得处理两个异常 InstantiationException、IllegalAccessException:

User user=User.class.newInstance();
Object object=(Object)Class.forName("java.lang.Object").newInstance()
3 通过克隆机制

使用 clone 方法,前面题目中 clone 是 Object 的方法,所以所有对象都有这个方法。

4 通过序列化机制

调用 ObjectInputStream 类的 readObject() 方法。

我们反序列化一个对象,JVM 会给我们创建一个单独的对象。JVM 创建对象并不会调用任何构造函数。一个对象实现了 Serializable 接口,就可以把对象写入到文件中,并通过读取文件来创建对象。

创建对象的方式关键字:new,反射,clone拷贝,反序列化

14 Java的四种引用 强弱软虚

强引用:

平常使用最多的引用,在程序内存不足(OOM)的时候也不会被回收。

String str = new String(“str”);

System.out.println(str);

软引用:

在程序内存不足时会被回收

// 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,

// 这里的软引用指的是指向new String(“str”)的引用,也就是SoftReference类中T

SoftReference wrf = new SoftReference(new String(“str”));

弱引用:只要JVM垃圾回收器发现了它,就会回收

WeakReference wrf = new WeakReference(str);

虚引用:

虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入 ReferenceQueue 中。

15 泛型常用特点

定义:编写的代码可以被不同类型的对象所重用

使用泛型的好处:不必因为添加元素类型的不同而定义不同类型的集合。可以根据自己的想法控制存储的数据类型。

16 两个不相等的对象有相同的hashcode

有可能,当发生哈希冲突的时候,两个不同的对象会有相同的hashcode值。有以下三种方式处理哈希冲突。

拉链法 开放地址法 再哈希、

17 深拷贝与浅拷贝的区别是什么

浅拷贝:被复制对象的所有变量都含有原来对象相同的值,**浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.**只是增加了一个指针指向已存在的内存地址,

深拷贝::被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向被复制过的新对象.而不再是原有的那些被引用的对象.换言之**.深拷贝把要复制的对象所引用的对象都复制了一遍**,是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存

18 final的用法

被修饰的类不可以被继承

被修饰的方法不可以被重写

被修饰的变量可以被改变,如果修饰引用,引用不可变,指向的内容可以

被final修饰的变量,编译阶段会存入1常量池

被修饰的方法,JVM会尝试将其内联,以提高运行效率。

19 static的用法

两个基本的用法:静态变量和静态方法

static也用于静态快:多用于初始化操作。

static也多用于修饰内部类,称为静态内部类

20 3*0.1 == 0.3 返回值 a=a+b与a+=b的区别?

false,浮点数无法精确表示

+= 操作符会进行隐式自动类型转换(将相加结果类型强制转换成结果类型),前者不会自动进行类型转换

21 异常相关

1 try catch finally,try里面有return ,finally还执行不?

执行,finally的执行早于try里面的return

结论:

1 不管有无异常,finally块中代码都会执行

2 当try和catch中有return时,finally仍然执行

3 finally是在return后面的表达式运算后执行的(此时没有立刻返回return的值,是先保存起来),函数的返回值是在finally执行前确定的。

4 finally最好不要包含return,否则程序提前退出。

2 Excption与Error包结构

Java可抛出的异常:被检查的异常,运行时异常,错误

1 运行时异常

定义:RuntimeException及其子类都被称为运行时异常。

常见的五种运行时异常:

ClassCastException(类转换异常)

IndexOutOfBoundsException(数组越界)

NullPointerException(空指针异常)

ArrayStoreException(数据存储异常,操作数组是类型不一致)

BufffferOverflflowException

2 被检查异常

定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。

常见的:

IOException

FileNotFoundException

SQLException

3 错误

定义:Error类及其子类

特点:与运行时异常一样,编译器不会对错误进行检查

当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误

Java虚拟机规范规定JVM的内存分成:堆栈,程序计数器,方法区等

22 OOM与SOF相应情况

OOM:(程序内存不足):

1 OutOfMemoryError异常

2 虚拟机栈和本地方法栈溢出

3 运行时常量池异常

4 方法区溢出

SOF(堆栈溢出):

应用程序递归太深而发生堆栈溢出,抛出该错误

栈溢出的原因:递归调用,大量循环或死循环,全局变量过多,数组,list,map数据过大

23 线程,进程,程序的基本概念,他们之间的关系?

线程:线程是一个比进程更小的执行单位,一个进程在其执行的过程中可以产生线程。

程序:是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,程序是静态的代码

进程:是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。

线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。

24 Java的IO流

Java中的IO流分类:

根据流的流向分:输入流和输出流

操作单元划分:字节流和字符流

流的角色划分:节点流与处理流

Java IO流的40多个类都时从如下4个抽象类中派生出来的

InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

JavaNIO的区别:NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率比IO高很多。

25 Java反射的作用于原理:

1 定义:

反射机制是在运行时,对于任意一个类,都能知道这个类的所有属性和方法,对于任意对象,都能够调用它的任意一个方法。给定类的名字,就可以通过反射机制来获得类的所有信息

动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

2 运用到反射机制的地方

jdbc就是典型的反射:

Class.forName('com.mysql.jdbc.Driver.class');//加载MySQL的驱动类

。如hibernate,struts等框架使用反射实现的

3 反射的实现方式

第一步:获取Class对象

1 Class.forName(“类的路径”)

2 类名.class

3 对象名.getClass()

4 基本类型的包装类,可以调用包装类的Type属性来获取该包装类

4 实现Java反射的类

1 Class:表示正在使用的Java应用程序中的类和接口

2 Field:提供有关类和接口的属性信息,以及对它的动态访问权限。

3 Constructor:提供关于类的单个构造方法的信息以及它的访问权限

4 Method:提供类或接口中某个方法的信息

5 反射机制的优缺点:

优点:运行时动态获取类的实例,提高灵活性 与动态编译结合

缺点:使用反射机制性能较低,需要解析字节码,将内存中的对象进行解析 2 相对不安全,破坏了封装性

26 List,Set,Map三者的区别

List:顺序存储,存储对象不唯一(可重复)

Set:不允许重复的集合。

Map:使用键值对存储,Map会维护与Key有关联的值,两个key可以有相同的对象,但key不能重复。

27 Object的常用方法及其含义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10Og0KwU-1677573844722)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230116182608306.png)]

equals 方法

该方法使用频率非常高。一般 equals 和 == 是不一样的,但是在 Object 中两者是一样的。子类一

般都要重写这个方法。

hashCode 方法

该方法用于哈希查找,重写了 equals 方法一般都要重写 hashCode 方法,这个方法在一些具有哈

希功能的 Collection 中用到。

一般必须满足 obj1.equals(obj2)==true 。可以推出 obj1.hashCode()==obj2.hashCode() ,但是

hashCode 相等不一定就满足 equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

JDK 1.6、1.7 默认是返回随机数;

JDK 1.8 默认是通过和当前线程有关的一个随机数 + 三个确定值,运用 Marsaglia’s xorshift

scheme 随机数算法得到的一个随机数。

wait 方法

百战程序员配合 synchronized 使用,wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥

有者,也就是具有该对象的锁。wait() 方法一直等待,直到获得锁或者被中断。wait(long timeout)

设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

  1. 其他线程调用了该对象的 notify 方法;

  2. 其他线程调用了该对象的 notifyAll 方法;

  3. 其他线程调用了 interrupt 中断该线程;

  4. 时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个 InterruptedException 异常。

notify 方法

配合 synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程(同步队列中的线程是给

抢占 CPU 的线程,等待队列中的线程指的是等待唤醒的线程)。

notifyAll 方法

配合 synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程。

28 ArrayList 和LinkedList的区别有哪些?

ArrayList:

优点:基于动态数组的数据结构,因为地址连续,存储好后,查询效率比较高,底层是数组实现,元素添加一般是在尾部。在高并发的情况下,线程不安全。

缺点:因为地址连续,ArrayList 要移动数据,所以插入和删除操作效率比较低

LinkedList:

优点:LinkedList 基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址。对于新增和删除操作,LinkedList 比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景。

缺点::因为 LinkedList 要移动指针,所以查询操作性能比较低

29 HashTable 与 HashMap以及ConcurrentHashMap

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCLp13IQ-1677573844723)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230116211612574.png)]

HashMap:

1.HashMap实现了Map接口, HashMap的默认初始容量是16,最大容量为2的30次方;

2.何时链表和红黑树相互转化:
若链表中节点个数超过8时,会将链表转化为红黑树;
若红黑树中节点小于6时,红黑树退还为链表;
如果哈希桶中某条链表的个数超过8,并且桶的个数超过64时才会将链表转换为红黑树,否则直接扩容。

3.HashMap桶中放置的节点—该节点是一个单链表的结构:Entry单向链表,当准备添加一个key-value对时,首先使用key借助hash函数计算key的哈希地址,再将key-value键值对,结合计算出的hash地址插入到哈希桶中。

4.HashMap是基于哈希表实现的,存储的数据是key-value键值对,实现了Serializable接口,Cloneable接口,所以它也支持序列化,能被克隆。
HashTable:

1.HashTable同样是基于哈希表实现,存储的数据同样为key-value键值对,其内部也是通过单链表解决哈希冲突的,容量不足时,同样会自动扩容;

2.线程安全,可以用于多线程场景。它的线程安全实现方式是:所有的方法都使用synchronized加锁,像一些读操作不存在线程不安全问题,所以全部方法加锁导致了效率低下。

3.现在已经被丢了不再使用了。不涉及线程安全问题时使用HashMap,要保证线程安全时,使用ConcurrentHashMap。

ConcurrentHashMap:

1.7版本:

1.底层数据结构还是数组+链表。HashEntry为链表的节点。

2.采用了segment分段锁技术,在多线程并发更新操作时,对同一个segment进行同步加锁,保证数据安全,这样就可以基于不同的segment进行并发写操作。

3.继承ReentrantLock实现同步锁机制。

4.和HashMap一样,都存在hash冲突,链表查询效率低的问题。

1.8版本:

1.底层数据结构和HashMap 1.8版本一样,都是数组+链表+红黑树;

2.支持多线程并发操作,实现原理:CAS+synchronized保证并发更新;

3.put方法放元素的时候:通过key对象的hashcode计算出数组的索引,如果没有Node,则使用CAS尝试插入元素,失败则无条件自旋,直到插入成功为止,如果存在Node,则使用synchronized锁住该Node元素(链表/红黑树的头节点),再执行插入操作。

1.7和1.8版本共同有的特征:

1.读操作没有加锁,value是volatile修饰的,保证了可见性,所以是安全的;
2.读写分离可以提高效率:多线程对不同的Node/Segment的插入/删除是可以并发、并行执行的,对同一个Node/Segment的写操作是互斥的。读操作是无锁状态,可以并发、并行执行。

30 红黑树的特征?(对应数据结构深入了解进行补充)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oR9UJPZf-1677573844723)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230116212212470.png)]

31 如何处理Java异常:

try块负责监控可能出现异常的代码

catch块负责捕获可能出现的异常,并进行处理

finally块负责清理各种资源,不管是否出现异常都会执行

try块必须的,catch和finally至少存在一个标准异常处理流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eent0IAs-1677573844724)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230116212532356.png)]

抛出异常→捕获异常→捕获成功(当 catch 的异常类型与抛出的异常类型匹配时,捕获成功)→异常被处理,程序继续运行 抛出异常→捕获异常→捕获失败(当 catch 的异常类型与抛出异常类型不匹配时,捕获失败)→异常未被处理,程序中断运行

征:

1.读操作没有加锁,value是volatile修饰的,保证了可见性,所以是安全的;
2.读写分离可以提高效率:多线程对不同的Node/Segment的插入/删除是可以并发、并行执行的,对同一个Node/Segment的写操作是互斥的。读操作是无锁状态,可以并发、并行执行。

30 红黑树的特征?(对应数据结构深入了解进行补充)

[外链图片转存中…(img-oR9UJPZf-1677573844723)]

31 如何处理Java异常:

try块负责监控可能出现异常的代码

catch块负责捕获可能出现的异常,并进行处理

finally块负责清理各种资源,不管是否出现异常都会执行

try块必须的,catch和finally至少存在一个标准异常处理流程

[外链图片转存中…(img-eent0IAs-1677573844724)]

抛出异常→捕获异常→捕获成功(当 catch 的异常类型与抛出的异常类型匹配时,捕获成功)→异常被处理,程序继续运行 抛出异常→捕获异常→捕获失败(当 catch 的异常类型与抛出异常类型不匹配时,捕获失败)→异常未被处理,程序中断运行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值