自十万个为什么之后。。。
一、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.Array
与 ArrayList
区别?
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)