1集合的稳定性和有序性
LInkedHashmap 是稳定性的,应该不是有序性的;
2合理利用集合的稳定性(order)和有序性(sort),避免集合的无序性和不稳定性带来的负面影响。**稳定性指集合每次遍历的元素次序是一定的,稳定性是外部特征的表现。有序性是指遍历的结果按某种比较规则依次排序的。**有序性是内部的特征,
如ArrayList是order/unsort,HashMap是unorder/unsort,TreeSet是order/sort
引申:可以通过TreeSet结合ArrayList对结果进行排序
————————————————
版权声明:本文为优快云博主「atongyeyeYE」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/atongyeyeYE/article/details/84857137
2抽象类和接口的区别
1. 语法层面上
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
说明抽象类只是类的另一种形式。而接口是一个公共的方法集合,不能有别的,一旦用了一个方法还得全部都得用,很纯粹,很牛XX
2. 设计层面上
要真正理解和区分,就要在设计层面上下功夫了,这样才能知道在什么场景下用它。
- 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。
4URI
U****RI 是统一资源标识符,而 URL 是统一资源定位符。 因此,笼统地说,每个 URL 都是 URI,但不一定每个 U****RI 都是 URL。 这是因为 U****RI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。 上面的 mailto、news 和 isbn U****RI 都是 URN 的示例。
3方法引用::优化Lambda表达式
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("11");
list.add("12");
list.add("13");
list.add("14");
//String[] arr = new String[2];
//集合转成为一个数组;
String[] array = list.toArray(String[]::new);
//数组转成为一个集合,但是不能用删除修改能方式,是一个适配器模式
List list1 = Arrays.asList(array);
System.out.println(Arrays.toString(array));
list.sort(String::compareTo);
//一个数组转换成字符串;
//String nes = new String(array,0 ,size);
}
集合
1hashMap:
-
当链表为阈值8的时候,链表转红黑树:
- 容器中节点分布在hash桶中的频率遵循泊松分布;
- 看作者的注解:当为8的时候,依据泊松分布(离散形式).概率统计得出,当为8的时候,链表中的元素个数的概率已经非常小了;所以作者选择了元素个数为8;是根据概率统计而选择的;
2加载因子是0.75?
默认是0.75;是对空间和时间效率的一个平衡选择;
根据散列表的查找效率取决于三个因素:散列函数,处理冲突的方法,和填装因子;其中,填装因子定义为一个表的装满程度;为表中记录数n/散列表长度m;记录越满,发生冲突的可能性越大,反之,可能性越小;
根据hash值判断hash因子:put方法中
3为啥hashmap数组的长度是2的幂次方? / 为啥扩容的时候,是2的幂次方?
(1)hashmap用的哈希函数本质是除留余数法;也就是求模留余数;改进成了hascode高位异或右移16位的值;为了右移,用右移取代了求模;因为右移的速度快;
(2)从存储方面来说,在操作系统的内存管理中,对于虚拟内存的技术实现;建立在请求分页存储管理;
为方便地址转换:页面大小应该是2的整数幂;同时页面大小应该始终,负责页表会过长,占用大量内存;页面的大小也应该在空间效率和时间效率之间权衡;
jdk1.7和jdk1.8的区别:
1.7为链表+数组,1.8为链表+数组+红黑树
头插法和尾插法
5语法糖
1自动装箱;
public class aaa {
public static void main(String[] args) {
Integer a = 1;
Integer b=2;
Integer c=3;
Integer d=3;
Integer e =321;
Integer f =321;
int r =322;
int t =322;
// Integer
Long g=3L;
System.out.println(c== d );//ture 在对立面保存
System.out.println(c.equals(d) );//ture 在面保存;
// 因为Java里面对处在在-128~127之间的Integer值,
// 用的是原生数据类型int,此时调用的是Integer.valueOf()方法,会在内存里供重用
System.out.println(e==f);//false
System.out.println(c==(a+b));//拆箱;true
System.out.println(c.equals(a+b));//true
System.out.println("--->>>");
System.out.println(g==(a+b));//true;==运算在遇到算数运算的时候解自动拆箱;
System.out.println(g.equals(a+b));//false;equals()方法不处理数据转型的关系;\
System.out.println("--->");
System.out.println(t==r);
System.out.println(t==r);
}
}
2泛型:
java 中是类型擦除泛型
c#是具现代化式泛型
java是引用传递;未来会提供值传递的技术支持;在VarHandle项目顺利发布技术预览版;被称作内敛类型;
擦除法:仅仅是对方法的Code属性中的字节码进行擦除;实际上元数据中还是保留了泛型的信息;这也是我们在编码时能通过反射手段取得参数化类型的根本依据;
6后端编译和优化
1针对于 判断为空或者true选择if或者try-catch
if是执行一次就判断一次;如果true和false的比例大致相同;就用if
如果大多数为true.就用try-catch;这种避开的处理思路:隐式异常处理
因为try-catch减少了判断的程序时间复杂度;但是他也有弊端;他每一次判断的结果为false或者null的时候;就会进入异常;意味着涉及到进程从用户态转到内核态处理的 过程;结束后在回到 用户态;速度远比一次判断为空检查慢得多;
优化:
-
最重要的优化技术之一:方法内联
-
最前沿的优化技术之一:逃逸分析
-
与语言无关的经典优化技术之一:(局部)公共子表达式消除
-
与语言无关的经典优化技术之一:数组边界检查消除;在java中;每次都要判断;虚拟机可以根据数据流分析确定是否越界;属于在编译期间分析应该在运行期间的数据流;节省了很多次的条件判断;