java基础
Java程序运行原理
1.发生两个步骤,Java通过编译(compiler)-》变成字节码(包含各种类),可以把这些字节码打包成jar包,交给JVM运行。java运行只和字节码有关,所以就可以在任何机器上运行了,
java跨平台无关性是怎么实现的
每个系统都会有一个JVM,字节码进入JVM翻译成底层底层调用。
JDK?JRE区别
JDK= JRE(java runtime environment) + javac(把源代码翻译成字节码)放在jre中运行
java 基础类型(小写的)
char/string/double/....(除此之外都不是基础类型) String不是基本类型,是类
java参数传递是传值还是传引用
java世界里一切对象都是指针,函数调用永远是传值
StringBuffer/StringBuilder区别/线程安全否?
没有声明,默认是不安全的 StringBuilder更快,但线程不安全(常用 StringBuffer稍慢,但线程安全
Object 常用方法
equals 判断是不是同一个一样
Class 一个说明书
toString 返回对象的string表示,Arrays.aslist的toString实现
有个native方法,就是留白,每个环境会有对应方法实现,每个平台不一样
indexof(),里面的在第几位
java面向对象
==与equalsq区别
1、equals():用来检测两个对象是否相等,即两个对象的内容是否相等。
2、==:用于比较引用和比较基本数据类型时具有不同的功能,具体如下:
(1)、基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。 (2)、引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。
浅拷贝和深拷贝
复制整个home,只里面的号码牌,只要地址,浅拷贝
深拷贝是整个数据拷贝一份,
接口和抽象类区别/联系
interface 一种功能,约定,
- java8以后可以有方法体了,能包含方法(实现),不能包含成员变量,可以实现若干次
- abstract class:定义抽象的骨架实现,包含抽象方法和或具体实现,也可以包含成员变量 单继承体系,只能沿着一个路径继承
什么时候用接口/或抽象类
接口更灵活,抽象类只能在一个继承体系里面,某一天想继承别的就不行了
final
final修饰方法,类,常量, 就禁止继承,修改,
override和Overload
overload《重载)同一个名字不同的参数表,根据参数表选择 override重写方法,参数表要一样
集合框架
list/Set/Map
List的元素以线性方式存储,可以存放重复对象,主要实现
LinkedList: 采用链表数据结构,插入和删除速度快,但访问速度慢。
Set中的对象不按特定(HashCode)的方式排序,并且没有重复对象,Set主要有以下两个实现类:
Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一个键对象和值对象。 Map主要有以下两个实现类:
HashMap:HashMap基于散列表实现,其插入和查询<K,V>的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能。 LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得<K,V>的顺序是其插入次序,或者是最近最少使用(LRU)的次序。 TreeMap:TreeMap基于红黑树实现。查看<K,V>时,它们会被排序。TreeMap是唯一的带有subMap()方法的Map,subMap()可以返回一个子树。
HashMap和HashTable
currentHashMap线程安全,基于哈希表,是并发的线程安全,是分区的哈希桶,分段锁的原理,把一部分锁起来,
HashSet
hashmap 的key就是一个HashSet,基于hashmap,实现就是把东西丢给hashmap HashSet: HashSet按照哈希算法来存取集合中的对象,存取速度比较快。当HashSet中的元素个数超过数组大小loadFactor(默认值为0.75)时,就会进行近似两倍扩容(newCapacity = (oldCapacity << 1) + 1)。
TreeSet :TreeSet实现了SortedSet接口,能够对集合中的对象进行排序,高效。LinkedhashSet不能排序
equals/hashCode区别,何时使用
一个对象只有一个hashcode 两个对象hashcode可能相等,但equals可能不等,出现哈希桶碰撞 但 equals相等,hashcode可能等,可能不等
ArrayList和LinkList
ArrayList : 长度可变的数组,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。 JDK8 中ArrayList扩容的实现是通过grow()方法里使用语句newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍扩容)计算容量,然后调用Arrays.copyof()方法进行对原数组进行复制。
那些集合类 是线程安全的
ConcurrentHashSet
如何保证一个集合类不被修改
Collections.unmodifiableXXX 会丢异常
ArrayList/Vector区别
基于数组的自动扩容实现 Vertor线程安全,但是慢,已经废弃了,ArrayList不安全,但效率高
Collection和Collections
X是类名,X+s是与之相关的工具方法集合