Java知识点

本文介绍了Java中的LinkedHashMap的稳定性,集合的有序性与无序性,以及ArrayList、HashMap和TreeSet的特点。此外,探讨了抽象类与接口在设计层面的差异,并解释了URI与URL的区别。还涉及HashMap的内部机制,如红黑树转换和加载因子。最后,讨论了Java中的语法糖,如自动装箱和泛型,以及后端编译和优化技术,如方法内联和逃逸分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:

  1. 当链表为阈值8的时候,链表转红黑树:
    1. 容器中节点分布在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的时候;就会进入异常;意味着涉及到进程从用户态转到内核态处理的 过程;结束后在回到 用户态;速度远比一次判断为空检查慢得多;

优化:

  1. 最重要的优化技术之一:方法内联

  2. 最前沿的优化技术之一:逃逸分析

  3. 与语言无关的经典优化技术之一:(局部)公共子表达式消除

  4. 与语言无关的经典优化技术之一:数组边界检查消除;在java中;每次都要判断;虚拟机可以根据数据流分析确定是否越界;属于在编译期间分析应该在运行期间的数据流;节省了很多次的条件判断;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值