当前位置: 首页 > ds >正文

JavaSE知识总结 ~个人笔记以及不断思考~持续更新

目录

字符串常量池

如果是创建对象还会==吗?

Integer也是在字串常量池中复用?

字符串拼接

为什么String是不可变的?

String的不可变性是怎么做的?

外部代码不能创建对象?

构造方法不是私有的吗? 怎么new出来的?

那这两个方法的各自作用呢?

为什么局部变量有初始值而成员变量没有初始值呢?

静态方法为什么不能调用非静态成员?

Static 、final 、 static  final

泛型和泛型擦除


字符串常量池

字符串常量池在JDK7之前字符串常量池在运行时常量池(方法区),JDK7之后字符串常量池移动到堆中,字符串常量池的作用是在定义一个字符串的值时候会在字符串常量池中创建对象用于复用。

String a = "a";
String b = "a";
//a == b 是true

如果是创建对象还会==吗?

答案是不会的。

String a = new String("a");
String b = "a";
// a == b 为false

因为new 一个字符串相当于在堆中和常量池都创建对象,所以是不相等的。

Integer也是在字串常量池中复用?

不是的,Integer是单独的缓存机制,缓存范围是-128~127之间。

Integer a = 127;
Integer b = 127;
//a==b 是true
Integer a = 129;
Integer b = 129;
//a==b 是false

字符串拼接

字符串拼接分成 变量拼接和常量拼接

String a = "a";
String b = "b";
String c = "a"+"b";//这样是常量拼接,编译器会把这个编译成String c = "ab";
String d = a+b;//这个是变量拼接,相当于StringBuilder d = new StringBuilder().addpend("a").addend("b");但是不会放在字符串常量池中,字符串常量池中只有"a"和"b",然后堆中有 ab 和 StringBuilder对象

为什么String是不可变的?

首先是因为安全性,因为String如果是可变的在多线程的环境中不断修改会造成未知的错误。其次是不可变性可以是String拥有缓存机制,再其次就是String的不可变性和StringBuilder、StringBuffer的可变性形成互补。

String的不可变性是怎么做的?

首先是因为String的底层是一个char[] 然后他是被final和 private 修饰的,这就导致了String一旦初始化就不能被修改或者重新赋值。其次是String内部的构造方法是私有的,这会导致外部代码不能直接创建String对象。

外部代码不能创建对象?

对的,String a = "a";是通过字符串常量池创建的,String a = new String("a");是通过构造方法创建的。

构造方法不是私有的吗? 怎么new出来的?

new的这个不是通过那个private的构造方法创建的,其实在String内部是有公开的构造方法的,

public String(String original) {this.value = original.value;
}
//
private String(char value[]) {this.value = value;
}

那这两个方法的各自作用呢?

首先公开的那个方法主要是接收字符串的值,然后在内部调用哪个私有的方法去创建对象,完成对象的初始化。

为什么局部变量有初始值而成员变量没有初始值呢?

首先我们要清楚局部变量是在一个代码块里面,所以我们必须要给他赋值,因为,局部变量的生命周期是很短的,其实作用域范围也很小,编译器无法确定局部变量的初始值,所以必须要赋值。

成员变量的生命周期长、作用域很大,很可能在某一个方法某一个阶段赋值,即使我们没有给成员变量赋值系统也会自动给成员变量赋初值。

静态方法为什么不能调用非静态成员?

ps:类加载:加载 - 验证 -  准备 - 解析 - 初始化

这个要和类加载有关了,静态方法的初始化是在类加载的时候初始化的,而非静态成员是在new 出来的他们的时候创建的,你用存在的去调用一个当前不存在的,这是不合理的!

Static 、final 、 static  final

static 表示让这个方法和变量属于这个类,而不是属于实例对象

final 可以修饰类、方法、变量,表示类不能被继承、方法不能被重写、变量的值不能变

static final 表示变量属于类本身且一旦初始化后不能被改变。

泛型和泛型擦除

泛型(Generics)是一种类型安全的机制,它允许你在定义类、接口和方法时使用类型参数。泛型的主要优点是类型安全和代码的重用性。然而,Java的泛型实现有一个重要的特性叫做“泛型擦除”(Type Erasure),这是为了保持向后兼容性而设计的。

在编译时,类型参数被替换为Object,类型信息在运行时被擦除。

http://www.xdnf.cn/news/10684.html

相关文章:

  • 短视频平台差异视角下开源AI智能名片链动2+1模式S2B2C商城小程序的适配性研究——以抖音与快手为例
  • debian12操作系统apt命令出现无法安全的用该源更新解决方案
  • 池中锦鲤的自我修养,聊聊蓄水池算法
  • 4、ubuntu系统 | 文本和目录操作函数
  • 结构型设计模式之桥接模式
  • 结构型设计模式之装饰模式
  • NodeJS全栈WEB3面试题——P4Node.js后端集成 服务端设计
  • 【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令
  • Android基于LiquidFun引擎实现软体碰撞效果
  • 吴恩达MCP课程(5):research_server_prompt_resource.py
  • LabVIEW轴角编码器自动检测
  • 助力高校AI教学与科研:GpuGeek推出618算力支持活动
  • 【拓扑排序】P6560 [SBCOI2020] 时光的流逝|普及+
  • day16 leetcode-hot100-30(链表9)
  • 【模拟电子电路-学习链接】
  • 嵌入式项目之mini2440系统制作烧写
  • CppCon 2014 学习:ASYNC SEQUENCES AND ALGORITHMS
  • 各种乱码问题解决措施
  • 【染色归一化】staintools工具详讲
  • 2025年进口床垫品牌推荐榜单:精选优质床垫,开启舒适睡眠之旅
  • Git深入解析功能逻辑与核心业务场景流程
  • 剑指offer13_剪绳子
  • 头歌数据库课程实验(角色管理)
  • 球展世界,筑梦中原,2025郑州台球展会,年中招商即将开启
  • 《汇编语言》第13章 int指令
  • Linux系统隐藏鼠标指针
  • 使用西门子博图V16时遇到了搜索功能报错的问题,提示缺少SIMATIC Visualization Architect组件怎么办,全网首发
  • 算法学习--持续更新
  • C++11 智能指针:从原理到实现
  • 为什么有的编程语言允许字符串和整数相加?字符串和整数比较?字符串拼接?格式串详解?字面量?