首页 > 编程语言 >Java基础2

Java基础2

时间:2023-07-31 19:45:14浏览次数:40  
标签:Java String 对象 基础 equals 引用 字符串 方法

面向对象基础

  • 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
  • 面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。

对象实体与对象引用

new 运算符,new 创建对象实例(对象实例在 内存中),对象引用指向对象实例(对象引用存放在栈内存中)。

关于相等

  • 对象的相等一般比较的是内存中存放的内容(值)是否相等。
  • 引用相等一般比较的是他们指向的内存地址是否相等。

构造方法

如果一个类没有声明构造方法,也可以执行!因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。如果我们自己添加了类的构造方法(无论是否有参),Java 就不会添加默认的无参数的构造方法了。

如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。

重载和重写

构造方法不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况

面向对象三大特征

封装

把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性

继承

使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。

多态

一个对象具有多种的状态,具体表现为父类的引用指向子类的实例

多态的特点:

  • 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
  • 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
  • 多态不能调用“只在子类存在但在父类不存在”的方法;
  • 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法

接口和抽象类

  • 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
  • 一个类只能继承一个类,但是可以实现多个接口。
  • 接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。

深拷贝和浅拷贝

浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象

深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象

引用拷贝就是两个不同的引用指向同一个对象

Object

Object 类的常见方法

== 和 equals()

  • 对于基本数据类型来说,== 比较的是值。
  • 对于引用数据类型来说,== 比较的是对象的内存地址。

因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。

equals() 方法存在两种使用情况:

  • 类没有重写 equals()方法:通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Objectequals()方法。
  • 类重写了 equals()方法:一般我们都重写 equals()方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即,认为这两个对象相等)。

String 中的 equals 方法是被重写过的,因为 Objectequals 方法是比较的对象的内存地址,而 Stringequals 方法比较的是对象的值。

hashCode

hashCode() 的作用是获取哈希码(int 整数),也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置

Java 中的任何类都包含有 hashCode() 函数,hashCode() 定义在 JDK 的 Object 类中

hashCode()equals()都是用于比较两个对象是否相等

两个对象的hashCode 值相等并不代表两个对象就相等.因为 hashCode() 所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的 hashCode )。

重写equals()时必须重写hashCode()方法,两个相等的对象的 hashCode 值必须是相等。也就是说如果 equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。

如果重写 equals() 时没有重写 hashCode() 方法的话就可能会导致 equals 方法判断是相等的两个对象,hashCode 值却不相等

String

String、StringBuffer、StringBuilder 的区别

String 是不可变的,StringBuilderStringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串,不过没有使用 finalprivate 关键字修饰,最关键的是这个 AbstractStringBuilder 类还提供了很多修改字符串的方法比如 append 方法

线程安全性

String 中的对象是不可变的,也就可以理解为常量,线程安全。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

性能

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

总结

  1. 操作少量的数据: 适用 String
  2. 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

String 为什么是不可变

String 类中使用 final 关键字修饰字符数组来保存字符串

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
	//...
}

所以String类不能被继承的两个根本原因分别是:存储的数组被final修饰且私有,未提供相关方法;且String类被修饰为final无法继承,避免子类破坏

Java 9 之后,StringStringBuilderStringBuffer 的实现改用 byte 数组存储字符串。

字符串拼接

Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符

字符串对象通过“+”的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象

String str4 = new StringBuilder().append(str1).append(str2).toString();

在循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个 StringBuilder 以复用,会导致创建过多的 StringBuilder 对象,如果直接使用StringBuilder对象进行字符串拼接就不会存在这个问题了

JDK9 当中,字符串相加 “+” 改为了用动态方法 makeConcatWithConstants() 来实现,而不是大量的 StringBuilder

String.equals() 和 Object.equals() 有何区别

String 中的 equals 方法是被重写过的,比较的是 String 字符串的值是否相等。 Objectequals 方法是比较的对象的内存地址

String s1 = new String("abc");这句话创建了几个字符串对象?

会创建 1 或 2 个字符串对象。如果字符串常量池中不存在字符串对象“abc”的引用,那么它将首先在字符串常量池中创建,然后在堆空间中创建,因此将创建总共 2 个字符串对象。如果存在的话则创建1个字符串对象。

JVM为了提高性能和减少内存消耗,针对字符串开辟了字符串常量池,主要目的是为了避免字符串的重复创建

String.intern 方法有什么作用

String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中

  • 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
  • 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。
String str4 = str1 + str2; // 在堆创建了新的对象
String str3 = "str" + "ing"; // 常量池中的对象,等同于 String str5 = "string"; 编译器会优化成 str3 = "string"

常量折叠

只有编译器在程序编译期就可以确定值的常量才可以

final 关键字修改之后的 String 会被编译器当做常量来处理,编译器在程序编译期就可以确定它的值,其效果就相当于访问常量。在运行时才能知道其确切值的话,就无法对其优化。

标签:Java,String,对象,基础,equals,引用,字符串,方法
From: https://www.cnblogs.com/xccx-0824/p/17594320.html

相关文章

  • Java修饰符与继承
    一、class(类)可以继承类(仅限一个)继承普通类:不一定要重写父类的所有方法继承抽象类:必须重写父类的所有抽象方法,除非将自己定义为抽象类只可继承父类【public、protected】的字段、方法(privated不可继承)包含父类的构造方法子类将从父类继承过来的方法的地址信息保存到自己的......
  • Java基础1
    基础概念Java特点面向对象:继承,封装(把数据和操作数据的方法捆绑在一起,比如setName和getName),多态(多态是指一个引用变量到底会调用哪个类的方法,由具体的类型决定。一个变量如果声明为父类的类型,但实际引用的是子类的对象,那么该变量可以调用父类的所有方法,也可以调用子类重写父类的......
  • Java 生态需要新鲜的血液、需要狂飙的刺激。Solon v2.4.1 发布
    Solon是什么开源项目?一个,Java新的生态型应用开发框架。它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模)。与其他框架相比,它解决了两个重要的痛点:启动慢,费内存。关键记事:2021年1月,正式对外开源2022年7月,建立官网,发力推广2023年2月,v2.0发布。......
  • 学习Java的第10天
    变量变量是什么:就是可以变化的量!Java是一种强类型语言,每一个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。typevarName[=value][{,varName[=value]}];//数据类型变量名=值;;可以使用逗号隔开来声明多个同类型变量注......
  • Java中面向对象详解
    一.定义面向对象是:将事务高度抽象化的编程模式将问题分解成一个个小步骤,对每个步骤进行抽象,形成对象,通过不同的对象之间调用,组合解决问题。在进行面向对象进行编程时,要把属性、行为等封装成对象,然后基于这些对象及对象的能力进行业务逻辑的实现。创建一次,重复使用二.面向......
  • Python基础day56 Django URL分组设置
    URL函数的使用(支持正则表达式)#django1中使用的是urlurl('test',views.test),url函数的第一个参数是支持正则表达式的如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数#http://127.0.0.1:8000/test/是django默认设置的,django会先拿着test去匹配,如果匹配不......
  • Java语言演示API接口对接电商数据平台,根据关键词获取商品列表源代码示例
     关键词搜索商品API接口在电商平台中具有重要的作用。以下是该API接口的一些重要性:提供精准搜索:关键词搜索商品API接口可以根据用户输入的关键词,快速准确地匹配出符合用户需求的商品。这样可以节省用户在浏览商品时的时间和精力,并提供更好的购物体验。增加用户转化率:通过关键词搜......
  • 《面试1v1》ElasticSearch基础
    我是javapub,一名Markdown程序员从......
  • linux 3网络基础 tcp状态和多路IO
    1.tcp状态概念图![tcp状态](I:\网络基础3day\tcp状态.png)简化图![tcp状态简化图](I:\网络基础3day\tcp状态简化图.png)简化图未考虑特殊情况netstat命令(了解)2.半关闭状态半关闭主动方不可以在应用层发送数据,但是可以读数据FINWAIT2阶段![半关闭](I:\网络基础3......
  • linux 4 网络基础 POLL EPOLL epoll堆 线程池 udp 本地套接字
    Linux5day1.poll监听poll相对与sellect的优缺点优点:没有文件描述符1024的限制请求和返回是分离的如:selectread集合返回read集合缺点和select一样:每次都需要将需要监听的文件描述符从应用层拷贝到内核每次都需要将数组中的元素遍历一遍才知道那个变化了大量并发,少......