吊打面试官·Java

290 阅读5分钟

自十万个为什么之后。。。

一、Java 基础

1.JDK 和 JRE 和 JVM 有什么区别?(来源百度)

JDK
JDK:Java Development Kit
含义:Java开发工具包


JRE
全名:Java runtime environment
含义:Java运行环境


JVM
全名:Java Virtual Machine
含义:Java虚拟机

2.== 和 equals 的区别是什么?

①基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
②引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

3.以下两种中初始化方法str = new String("hello"),str = "hello"的内存分配,以及区别?

String str1 = new String("hello");
String str2 = "hello";
String str3 = "hello";

此时在创建str3的时候会去检查常量池里面是否有"hello"这个字符串,如果有的话则不创建,直接地址指向。
String str="";这种方式创建的字符串都是在常量池中存在。
new String("")来创建的字符串都是在堆中开辟空间

📌注:常量池:常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. :存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)
6. 非RAM存储:硬盘等永久存储空间

4.接口、普通类、抽象类的区别以及用法?

⭐普通类 与 抽象类:
1、普通类可以去实例化调用;抽象类不能被实例化,因为它是存在于一种概念而不非具体。
2、普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类。


⭐抽象类 与 接口:
1、抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
2、抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量
3、抽象类主要用来抽象类别,接口主要用来抽象功能.
4、抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。
5、接口是设计的结果 ,抽象类是重构的结果

📌使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

二、容器

1.List、Set、Map集合

ArrayList

创建初始化:4种方式

public static void main(String[] args) {
	/**
	 * Arrays.asList方法初始化
	 */
	List<String> list1 = new ArrayList<String>(Arrays.asList("str1","str2","str3"));
	
	/**
	 * 双大括号初始化(double brace initialization)或者匿名内部类初始化法
	 * 这种方法一定程度上使代码更简洁,但同时可能降低可读性;
	 * 使用双大括号初始化会导致内部类文件的产生,而这个过程就会影响代码的执行效率;
	 * ⭐不推荐使用
	 */
	@SuppressWarnings("serial")
	List<String> list2 = new ArrayList<String>(){{
		add("str1");
		add("str2");
		add("str3");
	}};
	
	/**
	 * 普通初始化
	 */
	List<String> list3 = new ArrayList<>();
	list3.add("str1");
	list3.add("str2");
	list3.add("str3");
	
	/**
	 * Collections.ncopies初始化
	 * 把element复制count次填入list4中
	 */
	int count = 5;
	String element = "hello";
	ArrayList<String> list4 = new ArrayList<String>(Collections.nCopies(count, element));
}

增:

add(String e) :boolean
add(int index, String element) :void
addAll(Collection<? extends E> c) :boolean
addAll(int index, Collection<? extends E> c) :boolean

删&过滤:

remove(Object obj) :boolean
remove(int index) :String
removeAll(Collection<?> c) :boolean

removeIf(Predicate<? super E> filter) :boolean //过滤
list3.removeIf(o -> o.indexOf('3') > -1);
list3.removeIf(new Predicate<String>() {
	@Override
	public boolean test(String t) {
		return t.indexOf('4') > -1;
	}
});

改:

E set(int index, E element)

查:

int indexOf(Object o)
int lastIndexOf(Object o)
boolean contains(Object o)
Vector

可以往其中随意插入不同类的对象,即不需顾及类型也不需预先选定向量的容量,并可以方便地进行查找。
api: www.runoob.com/java/java-v…

创建初始化:

不带参数的构造函数初始化
Vector v;//初始化一个size为0的vector

带参数的构造函数初始化
Vector v(10);//初始化size,但每个元素值为默认值
Vector v(10,"hello");//初始化了10个值为hello的元素

通过同类型的vector初始化
Vector v(10,"hello");
//通过v初始化
Vector v2(v);

增:

boolean add(Object o);
void add(int index, Object element);
boolean addAll(Collection c);
boolean addAll(int index, Collection c);
void addElement(Object obj);
void insertElementAt(Object obj, int index);

删:

void clear();

查:

boolean contains(Object elem);
LinkedList

创建初始化:

Queue
HashSet
TreeSet
LinkedHashSet
HashMap
TreeMap
HashTable

2.ArrayArrayList区别?

Array([]):最高效;但是其容量固定且无法动态改变;
ArrayList: 容量可动态增长;但牺牲效率;

对象数组与基本类型数组在运用上几乎一模一样,唯一差别在于,前者持有得是reference,后者直接持有基本型别之值; 例如:

String[] objArr = new String[100];
int[] basArr = new int[10];

3.Arrays工具类

用于对数组操作的工具类

1,二分查找,数组需要有序
binarySearch(int[])
binarySearch(double[])

2,数组排序
sort(int[])
sort(char[])……
3,将数组变成字符串。
toString(int[])
4,复制数组。
copyOf();
5,复制部分数组。
copyOfRange():
6,比较两个数组是否相同。
equals(int[],int[]);
7,将数组变成集合。
List asList(T[]);

3.Collections工具类

1, 对list进行二分查找:
前提该集合一定要有序。
int binarySearch(list,key);
//必须根据元素自然顺序对列表进行升级排序
//要求list 集合中的元素都是Comparable 的子类。
int binarySearch(list,key,Comparator);

2,对list集合进行排序。
sort(list);
//对list进行排序,其实使用的事list容器中的对象的compareTo方法
sort(list,comaprator);
//按照指定比较器进行排序

3,对集合取最大值或者最小值。
max(Collection)
max(Collection,comparator)
min(Collection)
min(Collection,comparator)

4,对list集合进行反转。
reverse(list);
5,可以将不同步的集合变成同步的集合。
Set synchronizedSet(Set<T> s)
Map synchronizedMap(Map<K,V> m)
List synchronizedList(List<T> list)

4.迭代器 Iterator是什么?