每日一考-9.15
简说:wait释放🔒,sleep不释放🔒
-
sleep控制下的线程,买票是一一完成,当程序休眠后,sleep不会释放🔒,购票者和售票完成后才能继续后面购票操作,顺序执行。
-
wait控制下的线程,购票是多人同时进行,当程序等待时,wait会释放锁,后续购票这会涌入,开始同时买票,同时执行。
-
sleep属于Thread中的方法,wait属于Object中的方法。
重载和重写
重载:同一类中,多个方法有相同的方法名,当参数列表不同。
重写:子类在继承父类的方法的基础山(方法名和参数列表完全相同)对父类方法的实现进行覆盖的操作叫重写
简单的来说,
-
重载:同一类中,同名不同参数。
-
重写:父子类中,子类对父类方法的实现覆盖。
JDK JRE JVM
简单的说
jdk就是Java开发环境,JRE就是Java运行环境,JVM就是Java跨平台的核心,运行编译好的字节码文件.class文件
细说
-
JVM(Java Virtual Machine):在倒是第二层,由他可以在各种平台上运行,JVM就是Java的虚拟机,不同平台有各自的虚拟机,这也是Java实现跨平台运行的关键。
-
JRE(Java Runtime Environment):JRE大部分是C和C++语言编写的,他是我们在编译Java时所需要的基础类库,包括Java虚拟机和Java程序所需要的核心类库等。核心类库主要是Java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型,基本数学函数,字符串处理,线程,一场处理类等,系统缺省加载这个包,如果只是想要运行一个开发号的Java程序,只需要安装JRE即可
-
JDK(Java Development Kit):JDK还包含了jre之外的东西,就是这些东西帮助我们编译Java代码,还有监控JVM,JDK的一些工具是提供给Java开发人员使用的,其中包含了Java开发工具,也包含了JDK,就无需在单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等。
String StringBuffer StringBuilder区别
String(常量:一旦被创建好了,不能被修改)不可变 StringBuffer可变 加锁 线程安全 StringBuilder可变 未加锁 线程不安全 单线程效率高
public class StringStringBufferStringBuilder {
public static void main(String[] args) {
/*
修改相当于生成一个新的字符串对象
局部变量s指向不同的两字符串
“小别”字符串常量没有变成“abc”
新生成“abc”字符串,然后把它赋值给了s
*/
String s = "小别";
s = "abc";
//线程不安全,在单线程环境下StringBuilder效率最高
StringBuilder builder = new StringBuilder(s);
builder.append("d");
//底层加锁,并发安全,线程安全
StringBuffer buffer = new StringBuffer(s);
buffer.append("a");
}
}
hashCode 和 equals 区别
如果两个对象hashCode不同,那么他们肯定是不同两对象 如果两对象hashCode相同,不代表这两对象一定是同一对象 (如 2r,3S,43K,44等哈希值都为51628) 如果两对象相等,那么他们的hashCode就一定相同
在只重写equals方法时是 无法实现两个对象名字相同就认为两对象相同 重写hasCode方法后才有可能做到
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean equals(Object obj) {
/*
两个user对象比较他们name属性
如果两个对象name属性相同
则代表两个user对象相等
*/
User user=(User) obj;
return user.getName().equals(this.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
public class HashCodeEqualsDemo {
public static void main(String[] args) {
HashMap<User, String> hashMap = new HashMap<>();
hashMap.put(new User("小别"), "...");
/*
hashMap中get方法首先会判断
哈希值是否相同的前提下才会去调用
两对象的equals方法
*/
System.out.println(hashMap.get(new User("小别")));
}
}
==和equals
==如果是基本数据类型,比较的是值, 如果是引用类型,比较的是内存地址。 一引用一基本也是比较的值 equals:是Object的方法比较的是所指向的对象的地址值,一般情况还是比较的值具体看各个类重写equals方法后的比较逻辑
注意equals不能用于比较基本数据类型,
public class Demo {
public static void main(String[] args) {
String s="123";
/*
String中equals方法先比较
传入值和它本身引用地址是否相同
(this == anObject)
如果不同,再一个一个字符逐一比较
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
*/
s.equals("xxx");
}
}
什么是Java,为什么要使用Java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承,指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好的实现了面向对象理论,允许程序员以优雅的思维进行复杂化的编程。
我个人的理解:(仅是我个人理解,如有不对或者遗漏,希望大家指正和补充)
市场:无论是在世界范围,还是在我国,Java都有者较高的市场占有率
人员:我国有大量的培训机构每年输出大量的Java技术人员,企业不必担心用人问题。
学习:有着完整的,多元的,全系列的教程,说好听些,让我们后来者可以站在巨人的肩膀上学习,难听点就是可以让我们大多数人成为API战士。
生态:Java有着其他语言难以媲美的生态,spring的兴起也为Java带来了春天,一个开源的生态,让开发者可以更专精于业务,让企业可以更低成本的使用。
企业:性能足够使用,人员供给充足,多元简单的框架降低了代码难度,且项目足够多,可以进行二开,复用来降低成本,而且大多企业不会因为少量的性能提升去重构项目,成本太大。
从业者:在大多数公司用的框架可能都大同小异,如果想要进行行业方向的转型,只需要以熟悉业务为主,而且C++就难以做到这点。
面向对象
面向对象就是吧构成问题的事务分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事务在解决问题中的行为。
而类就是面向对象中的重要概念,而我们所说的面向对象的三大特征,封装,继承,多态其实是类的三个特征
-
封装:核心思想就是隐藏细节,数据安全,将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。
-
继承:子类可以继承父类的属性和方法,并对其进行拓展。
-
多态:同一种类的对象执行同一个方法时可以表现出不同的行为特征。通过继承的上下转型,接口的回调以及方法的称谢和重载可以实现多态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理