Java-Core

1.关于String:

可变性:String是不可变的,底层用final static修饰了。所以可以理解他是线程安全的产物。

              区分和StringBuilder/StringBuffer继承自AbstractStringBuilder,用char[] 数组来存字符串。

   在JAVA9之后,String改用Byte来存数组,之前用的是char。

线程安全问题:StringBuffer对方法加了同步锁,StringBuilder没有加同步锁。

性能问题:

String:对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向这个新的String对象

StringBuffer:对StringBuffer对象本身进行操作而不是对新的对象进行操作。

StringBuilder:性能提升不多但是有线程不安全的风险。

综合来看:

如果是少量的数据,String可以满足要求。

如果是单线程操作字符串缓冲区下的大量数据:StringBuilder。

如果是多线程操作字符串缓冲区下的大量数据:StringBuffer。

 

•当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

• 所以
• String aa = "ab";
• String bb = "ab"; // 字符串aa在常量池中存在,直接引用即可。
• String a = new String("ab");
String b= new String("ab"); //a 和 b 是两个不同的对象。

 

这时候,进行==和equals的判断结果:

if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");

 

2.equals、==、hashCode

==和equals:
==:判断两个对象的地址是不是相等。由于java是传值,基本数据类型是判断值,引用数据类型是判断内存地址。

equals:判断两个对象是否相等。不能用于基本数据类型的比较。

    1.类没有覆盖equals,return  (this.objcet=object)

    2.类覆盖了euqals,一般我们都覆盖来比较两个对象的内容是否相等。  

 

 

hashcode的作用是获得对象的散列码,用来确定对象在散列表中的位置。

1.如果hashcode相等,equals一定也是相同的。

2.如果两个对象相等,两个对象是equals的。

3.如果两个对象有相同的hashcode,两个对象不一定相等。

4.因此,equals方法被覆盖过,hashcode方法也必须被覆盖。

5.hashcode()的默认行为是对堆上的对象产生独特值。如果没有重写hashcode(),则该class的两个对象无论如何也不会相等。

为什么重写equals必须重写hashcode?

如果只重写equals,两个对象进行euqals比较返回true,没有重写hashcode,这时集合就会继续插入相同的元素,集合是不允许出现重复的元素的,这时会出现问题。

此时如果没有重写hashcode,那么hashcode的作用是根据对象返回一个散列码(哈希码),那么每个对象的hashcode都不一样,那么如果输入的是同一个元素,就无法通过hashcode来判断是同一个对象。

这时,集合看到A的hashcode和B的hashcode是不同的,那么就认为A和B是不同的两个对象,会继续插入,实际上他们是同一个对象,只是因为hashcode没有重写的问题。那么即使你重写了equals,也无济于事。

 

 

  • 如果重写了hashcode方法,确保两个对象都能够定位到相同的位置,那么就可以遍历这条单向链表,使用equals方法判断两个对象是否相同,如果相同,那么就不插入了(HashMap的实现仍然插入,但是覆盖掉旧的value)。如果不相同,就插入到链表的头节点处。

 

4.transient关键字:

不会被序列化。当反序列化时候,不会持久化和恢复。

5.获取键盘输入的两种方式:

1.

Scanner input = new Scanner(System.in);

String s = input.nextLine();

input.close();

2.

BufferedReader  input = new BufferedReader(new InputStreamReader(System.in));

String s = input.readLine();

 

6.反射:

反射的主要用途:开发各种通用的框架。

Java 反射主要提供以下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
  • 在运行时调用任意一个对象的方法

用法:

1.获得Class对象。

1)class类的forName静态方法

JDBC用java.Class.forname(driver)

2)直接获取一个对象的class

Class<?> klass = int.class;
Class<?> classInt = Integer.TYPE;

3)getClass方法

 

7.异常:
Throwable

Error:错误,尽可能避免

Exception:可以处理的异常,try-catch

常用方法:

Throwable:

  • public string getMessage():返回异常发生时的简要描述
  • public string toString():返回异常发生时的详细信息
  • public string getLocalizedMessage():返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同
  • public void printStackTrace():在控制台上打印 Throwable 对象封装的异常信息

try-catch-finally:

  • try块: 用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
  • catch块: 用于处理 try 捕获到的异常。
  • finally 块: 无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行

线程死亡、CPU关闭、try或finally使用System.exit(int),finally不会被执行

try-with-resources资源关闭:

实现Closeable和AutoCloseable的对象可以使用

面对一些必须要关闭的资源时使用。

 

posted @   NobodyHero  阅读(139)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示