首页 > 编程语言 >java基础

java基础

时间:2023-09-15 10:39:10浏览次数:35  
标签:java String int 127 基础 哈希 Integer new

java基础

常量缓存池

        Integer integer = new Integer(18);
        Integer integer1 = new Integer(18);

        Integer integer2 = Integer.valueOf(18);
        Integer integer3 = Integer.valueOf(18);
        //false
        System.out.println(integer == integer1);
        //true
        System.out.println(integer2 == integer3);

基本数据类型除了Double,Float之外,其他六个包装类(Byte,Integer,Short,Character ,Boolean,Long)都有常量缓冲池

  1. Byte -128~127
  2. Short -128~127
  3. Integer -128~127
  4. Long -128 ~127
  5. Character:\u0000 - \u007f 0 ~128
  6. Boolean: true and false

拿Integer举例子,Integer类内部内置了256个Integer类型的缓存数据,当使用的数据范围在-128127之间时,会直接返回常量池中数据的引用,而不是创建对象,超过这个范围会new一个对象,18在这个-128127之间,300不在.

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);

可以看出是因为IntegerCache这个静态内部类,让我们看一下源码

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

如果使用new Integer()创建对象,即使值在-128~127范围内也不会被缓存,.每次都会创建新的对象.因此推荐使用Integer.valueof()方法获得整数对象.

静态代码块通常用来初始化一些静态变量,它会优于main()方法执行

可以通过命令来设置缓存值大小,当然是不能无限大

String类

  1. String类是final的,意味着他不能被继承
  2. String类实现了Serializable接口,意味着它可以被序列化
  3. String类是实现了Compareble接口,意味着最好不要用'=='来比较两个字符串是否相等,应该用compareTo()方法比较,如果只是比较内容可以用String类的equals方法
  4. String,String buffer 和String builder一样都实现了CharSequence接口,他们三属于近亲 .CharSequence接口是一个可读序列的字符的接口,实现了CharSequence接口的类可以提供对字符序列的访问和操作
  5. java9 以前Sting是用char型数组实现,之后改成byte型数组实现,并增加了coder来表示编码.好处是在Latin1字符为主的程序里,可以把String占用的内存减少一班,这个改进也增加了编码的检测
  6. 每个字符串都会有一个hash值,这个哈希值大概率不会重复的,因此String很适合作为HashMap键值
public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

hashcode方法首先检测是否已经计算过哈希码,如果已经计算过,则直接返回缓存的哈希码.否则循环遍历字符串的所有字符,并使用一个公式计算哈希码,将得到的哈希值存储在hash成员变量中,以便下次调用hashcode方法直接返回该值,而不需要从新计算.这是一种缓存优化,称为"惰性计算".

hashmap添加一个新对象时:

  • 计算对象的哈希值
  • 和之前的哈希值进行比较,如果不相等直接存进去
  • 如果已经相等,在调用equals()进行比较,如果相等不存了
  • 如果不等,说明哈希冲突了,增加一个链表,存放新的对象
  • 如果链表的长度大于8,转为红黑树处理

也就是说:

  • 两个对象调用equals()为真,hashcode()肯定为真
  • 两个对象调用hashcode()为假,equals()肯定为假
  • 两个对象调用equals()为假,调用hashcode()的值不一定不一样
  • 两个对象调用hashcode()得到的结果相等,equals()值不一定为true

String为什么不可变

  1. 可以保证数据的安全性,避免被篡改,比如用户密码.
  2. 保证哈希值不会频繁变更

String常量池

        //会创建3个对象,1个字符串常量池,2个堆上
        String str = new String("豪哥");
        String str2 = new String("豪哥");
        //只会创建一个对象,字符串常量池
        String s = "妹妹";
        String s2 = "妹妹";

new 的方式始会创建1个对象,不管字符内容是否已经存在,而双引号方式会重复利用字符常量池中已经存在的对象

多线程基础

what?

解释什么是线程必须先说明什么是进程,程序在操作系统中就是一个进程(占用内存资源),线程是进程创造的,一个进程可以有多个线程

how?

在java中有3种创建多线程的方式

// 1,继承thread类
class [class name] extends Thread
// 2,实现runnable接口
class [class_name] implements Thread
main(){
new Thread(new [class_name] ).start
}
//3.获得返回值多线程
...

线程同步

多线程在访问同一个资源时候容易出每个对象都有自己互斥锁标识,通过synchronized 标识绑定形成锁

网络编程

端口号:标识计算机某个特定的网络程序

标签:java,String,int,127,基础,哈希,Integer,new
From: https://www.cnblogs.com/lz2z/p/17704261.html

相关文章

  • Java_IO流
    基础知识文件在java程序中是以流的形式来操作的。文件获取文件信息file.getName()//文件名.getAbsolutePath()//绝对目录.getParent()//父目录.length()//大小(字节).exists()//存在.isFile()//是不是一个文件.isDirectory();//是不是一个目录......
  • JavaWeb综合案例(黑马程序员2023年JavaWeb课程总结,所有功能均实现,包含数据库sql文件)
    JavaWeb综合案例(黑马程序员2023年JavaWeb课程总结,所有功能均实现,包含数据库sql文件)1.案例介绍:1.前端:Vue.js+element-ui+ajax(axios)+html2.后端:maven+mybatis+servlet 2.项目结构: 3.BrandMapper接口类 packagecom.itheima.mapper;   impor......
  • JavaWeb专栏之(三):Eclipse创建JavaWeb项目
    JavaWeb专栏之(三):Eclipse创建JavaWeb项目前言:关注:《遇见小Du说》微信公众号,分享更多Java知识,不负每一次相遇。更多内容请访问:www.dushunchang.top在上一篇文章中,小Du猿带大家使用Idea创建JavaWeb项目,相比之下Idea作为当前非常主流的开发IDE,深受Java后端程序员使用。市面上约......
  • 手把手搭建一个完整的javaweb项目(适合新手)
    手把手搭建一个完整的javaweb项目本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点。 下载地址:http://download.csdn.net/detail/qq_23994787/9904842  点击下载主要功能有:1.用户注册2.用户登录3.用户列表展示4.用户信息修改......
  • JAVA中的高并发,解决高并发的方案
    java高并发,如何解决,什么方式解决一、什么是高并发二、高并发的解决方法有两种三、追加一、什么是高并发1.1高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。1.2高并发相关常用的一些指标有响应时间......
  • Java高并发策略 java架构设计高并发策略和设计
    Java高并发策略java架构设计高并发策略和设计最近在面试被问到这个问题,整理下按照不同的层级说明展示层cdn静态文件加速例如HTML、CSS、JS、图片这些静态资源非常适合放到CDN上进行缓存。CDN服务商的节点是全国各地的,你的一份静态文件会被缓存到各个节点,用户访问时,会......
  • 【云原生持续交付和自动化测试】5.3 持续交付和DevOps实践基础知识
     【云原生持续交付和自动化测试】5.3持续交付和DevOps实践基础知识5.3.1什么是持续交付云原生下对持续交付(ContinuousDelivery)是一种软件开发方法,旨在实现高质量、可靠且可持续的软件交付。它强调通过自动化的流程和工具链,使得软件的构建、测试和部署过程可以频繁地进行,......
  • 「Java开发指南」在MyEclipse中的Spring开发(二)
    在上文中(点击这里回顾>>),我们主要介绍了一些Spring的基本概念、Spring项目配置及向导,本章节将继续介绍如何管理多个项目,Spring配置编辑器等,欢迎持续关注~MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论4.管理多个Beans和项目除了使用bean配置文......
  • 25届实习秋招-Java面试-JVM虚拟机面试题整理-牛客网
    JVMJVM概述:是什么-规范,有什么作用(多态,越界)Java为什么可以跨平台移植Java怎么做编译?与C语言的编译有什么区别?比较:jvmjrejdk整体的架构:内存结构内存结构/内存模型--即为运行时数据区:JVM了解过哪些版本,1.8和1.7内存结构不同的地方堆中方法区(永久代实现)改为了......
  • 25届实习秋招-Java面试-JUC多线程面试题整理-牛客网
    JUC介绍一下JUC下的锁(如何使用及应用场景)线程什么是进程:特征什么是线程:资源为什么多线程,什么使用用单线程,什么时候多线程,什么条件下多线程快。进程和线程的对比:进程如何通信,每种通信存放的介质。||线程的通信,几种方式。join进程和线程的区别,在JVM层面的体现一......