String 类的两种实例化方法
 String 类的两种实例化方式的区别
 String 类对象的比较
 Stirng 类对象的使用分析

/*    1.String 类的两种实例化方式的区别
        String 并不是一个基本数据类型,它本身属于一个类(首字母大写)
        但是这个类在设计的过程之中加入了一些java 自己的特殊支持,所以对于这个类的对象实例化方式就有两种形式
        
        直接赋值:String 对象 = “内容”:
        构造方法:public Stirng(Stirng s);

class Book{
private String title;
public Book(String t){
title = t;
}
}

Book 类的构造:public Book(String t);
String 类的构造:public String(String s);
        
        范例:直接赋值

public class stringClass{
public static void main(Stirng args[]){
Stirng str = "Hello";
str = str+ "World";
System.out.println(str);
}
}

范例:构造方法

public class stringClass{
public static void main(Stirng args[]){
Stirng str = new String ("Hello");
str = str+ "World";
System.out.println(str);
}
}

至少现在通过执行结果来讲,Stirng 类的两种实例化方式都是可用的
*/

/*    2. String 的相等比较
        如果说现在有两个 int 型的变量,那么要进行相等比较的判断,则直接使用“==”即可
        范例:两个int比较

public class stringClass{
public static void main(String args){
int x = 10;
int y = 10;
System.out.println(x==y); }
}

发现两个利用直接赋值实现的程序,那么使用“==”的时候可以正常的进行相等判断
        但是如果现在将同样的操作形式用在String 上呢?

public class stringClass{
public static void main(String args){
String x = "hi";
String y = new String("hi");
String z = y; // 引用传递
System.out.println(x==y); // false
System.out.println(y==z); // true
System.out.println(x==z); // false }
}

通过现在执行可以发现一个非常严重的问题,此时字符串的内容实际上都是相同的,而在使用 “==”比较之后发现有的比较结果是false,那么为什么呢?
        发现在程序中如果使用“==”比较的只是两个对象(任意的引用类型)堆内存地址数值,属于数值内容的比较并不是堆内存中保存内容的比较,那么要想进行String 对象内容的比较则可以利用String 类中提供的一个方法完成
            字符串比较(暂时将此方法进行修改):public boolcan equals(String str)
            范例:利用equals()实现字符串内容的比较

public class stringClass{
public static void main(String args){
String x = "hi";
String y = new String("hi");
String z = y; // 引用传递
System.out.println(x.equals(y)); // true
System.out.println(y.equals(z)); // true
System.out.println(x.equals(z)); // true
  }
}

由于内容是可控的因素,而地址是不可控的因素,所以在日后的开发之中,只要是字符串的比较都使用equals()方法完成,绝对不可能出现“==”
        面试题:请解释在String比较中“==”与“equals”的区别?
            “==”:是java本身提供的关系运算符,可以进行数值比较
            “equals”:是String类自己定义的方法,用于进行字符串内容的比较
*/

/*    3.String 匿名对象
        任何的编程语言都不会提供有字符串这一数据类型,字符串的描述在很多语言之中都使用字符数组表示,而在JAVA的设计之初为了解决这样的问题,专门提供了一个String类来进行描述。
        但是随着发展,为了能够让程序变得更加的易于开发,所以在java里面也提供了双引号声明的数据,而这些数据,在java中并不是普通的变量,而是属于String类的匿名对象
        范例:验证匿名对象

public class stringClass{
public static void main(String args[]){
String str = "hello";
System.out.println(str.equals("hello"));
}
} // 通过 public class stringClass{ // 换过来
public static void main(String args[]){
String str = "hello";
System.out.println("hello".equals(str)); // 这里的 “hello” 就是匿名对象
}
}

现在发现,此时已经可以通过字符串调用 equals()方法,那么就证明一点,字符串的确是String类的匿名对象那么之前的“String 字符串对象= “字符串”:”,本质就是为一个字符串的匿名对象起了一个名字
            
            经验:
                如果现在假设你的开发有这样一种需求;用户输入一些指令,而后根据输入指令判断要执行的操作,那么此时就存在有两种做法:
            一;

public class stringClass{
public static void main(String args[]){
String input = "run"; // 假设为输入的数据
if(input.equals("run")){
System.out.println("********开始**********");
System.exit(1); // 程序结束
}
}
} // 通过

既然input 的内容是用户输人的,那么就有可能不输入如果不输人内容就有可能为null 则null调用equals()方法就有可能出现错误,很明显如果要想解决这样的问题,最初的方案一定是追加判断
            如果觉得以上的 null的判断多余,那么就可以进一步利用 equals() 方法的功能,,因为匿名对象永远不可能为null。所以可以采用颠倒的模式
                
            二:

public class stringClass{
public static void main(String args[]){
String input = "null"; // 假设为输入的数据
if("run".equals(input)){
System.out.println("********开始**********");
}
}
}

首先字符串的匿名对象永远不可能是null,并且在equals()方法里面支持有null的验证,所以如果发现有比较的内容为null返回的就是false
                字符串常量= String类的匿名对象
                比较字符串内容是否相同时,将常量写在前面
*/

/*    String 类两种实例化对象的区别(核心)
        声明:在开发之中如果发现,有多种方式可以实现同一结果,那么就有可能出现面试题
        此时对于String 类的 实例化方式出现有两种,那么这两种方式到底该使用那一种,以及每种方式的区别是什么
        
        分析一:String类对象直接实例化的形式
            直接赋值是现在为止看见最多的

public class stringClass{
public static void main(String args[]){
String str = "hello";
System.out.println(str);
}
}

开辟一块堆内存空间,并且一个栈内存将直接指向该堆内存空间
            
        范例:继续观察直接赋值

public class stringClass{
public static void main(String args){
String x = ("holle");
String y = ("holle");
String z = ("nihao");
System.out.println(x==y); // true
System.out.println(y==z); // false
System.out.println(x==z); // false
}
}

解释:关于对象池的概念(Object Pool)
                在java设计的过程之中为了方便用户的代码编写开发,针对与几个特殊的类使用了共享设计的思路,其中String就是属于其中的一员
                这种设计思路是java 自己的支持,而且只针对直接赋值的方式
                在使用直接赋值实例化String类对象的操作之中,字符串的内容定义之后实际会自动将其保存在一个对象池之中,
                而后如果现在有其他的字符串对象也采用了直接赋值的形式,并且内容与之前的字符串完全相同,
                那么不会开辟新的堆内存空间,而是通过对象池找到已有的堆内存空间地址,直接引用即可,所以就会造成若干个字符串直接赋值之后,
                当内容相同时地址是完全相同的,所以“==”的结果也是相同的,这样的设计就是共享设计模式
    
        分析二:利用构造方法实例化对象
            以下面的程序为分析依据:

public class stringClass{
public static void main(String args[]){
String str = new String("hello");
System.out.println(str);
}
}

如果采用了构造方法进行String类对象的实例化操作,那么最终将产生两块堆内存空间其中有一块是垃圾空间
            如果现在使用了构造方法进行String类的对象实例化还会牵扯到入池的问题
            范例:没有入池

public class stringClass{
public static void main(String args[]){
String stra = new String("hello"); // 构造方法
String strb = "hello"; // 直接赋值
System.out.println(stra == strb); // false
}
}

现在的代码之中,发现如果使用了构造方法进行String 类对象实例化,那么所产生的对象将不会保存在对象池之中,也就是说此对象无法重用
                如果现在用户需要让这个对象入池,则只能通过手工的方式完成
                    手工入池:public String intern()

public class stringClass{
public static void main(String args[]){
String stra = new String("hello").intern(); // 构造方法 手工入池
String strb = "hello"; // 直接赋值
System.out.println(stra == strb); // true
}
}

面试题:请解释String类两种对象的实例化区别?
                直接赋值(String 对象名称 = “字符串”:);只会开辟一块堆内存空间,并且对象可以自动入池以供其他对象重复使用
                构造方法(String 对象名称 = new String(“字符串”)):会开辟两块堆内存空间,并且其中有一块堆内存将成为垃圾,同时产生的实例化对象不会自动入池,需要利用intern()方法手工入池

*/

/*    字符串一旦声明则不可改变
        之前学习过一个“+”,利用这一概念可以实现字符串改变
            范例:分析代码

public class stringClass{
public static void main(String args[]){
String str = "Hello"; // 直接赋值
str += "World";
str=str+"!!!";
System.out.println(str); // Hello World !!!
}
}

可以发现整个的操作流程之中,都是String类对象的引用发生着改变,而字符串的内容没有改变,这样的操作会形成垃圾。
            正因为如此,所以在实际开发中,以下的操作禁止出现

public class stringClass{
public static void main(String args[]){
String str = "";
for(int x = 0;x<1000;x++){
str +=x;
}
System.out.println(str);
}
}

这种代码会“重新改变引用”1000次,并且会大量产生垃圾,也就是说String不适合频繁修改
*/
/*    总结
        1.String 开发中都使用直接赋值,并且不要频繁修改
        2.字符串内容比较时使用equals()方法
*/

菜鸡的Java笔记 第十三 String 类的两种实例化方法的更多相关文章

  1. String类对象两种实例化方式比较

    第一种:直接赋值 String str =  "hello!" ; 在java中,有一个字符串常量池,对于这种直接赋值的,会直接写进常量池(常量池里面不存在其value,) 自JD ...

  2. 菜鸡的Java笔记 第二十三 - java 抽象类的概念

    abstractClass 抽象类的概念        1.抽象类的基本定义        2.抽象类的使用原则                不会抽象类与接口,java = 没学           ...

  3. 菜鸡的Java笔记 第三十三 - java 泛型

    泛型 GenericParadigm        1.泛型的产生动机        2.泛型的使用以及通配符        3.泛型方法的使用                JDK1.5 后的三大主 ...

  4. 菜鸡的Java笔记 第十四 String 类常用方法

    /*String 类常用方法    将所有String类的常用方法全部记下来,包括方法名称,参数作用以及类型    一个成熟的编程语言,除了它的语法非常完善之外,那么也需要提供有大量的开发类库     ...

  5. 菜鸡的Java笔记 - java 正则表达式

    正则表达式 RegularExpression        了解正则表达式的好处        正则表达式的基础语法        正则表达式的具体操作            content (内容 ...

  6. 菜鸡的Java笔记 数字操作类

    数字操作类        Math 类的使用        Random 类的使用        BigInteger 和 BigDecimal 类的使用                Math 是一 ...

  7. 菜鸡的Java笔记 日期操作类

    日期操作类        Date 类与 long 数据类型的转换        SimpleDateFormat 类的使用        Calendar 类的使用                如 ...

  8. 菜鸡的Java笔记 - java 访问控制权限

    java中四种访问控制权限的使用                内容            在java里面一共定义有四个权限,按照由小到大的顺序:private<defaule<prote ...

  9. 菜鸡的Java笔记 国际化程序实现原理

    国际化程序实现原理 Lnternationalization        1. Locale 类的使用        2.国家化程序的实现,资源读取                所谓的国际化的程序 ...

随机推荐

  1. 踩坑系列《一》数据库建表权限 CREATE command denied to user for table

    今天在表中用Navicat连接服务器上的mysql账号进行建表,报了个这样类似的错, CREATE command denied to user for table 是数据库权限设置的问题,所以无法进 ...

  2. 解决安装mysql 到start service出现未响应问题

    mysql下载地址 链接: https://pan.baidu.com/s/1vYpsNkVjUHqOKPQl9Y9A9A 提取码: wngn 安装可以参考 今天下载了MySql5.5,没想到的是前面 ...

  3. 图数据库Neo4j的基本使用及与SpringBoot集成

    Neo4j 官网地址:https://neo4j.com/ 下载地址:https://neo4j.com/download-center/#community 官方入门文档:https://neo4j ...

  4. PostgreSQL 大小写问题 一键修改表名、字段名为小写

    标准的SQL是不区分大小写的.但是PostgreSQL对于数据库中对象的名字允许使用支持大小写区分的定义和引用方法.方式就是在DDL中用双引号把希望支持大小的对象名括起来.比如希望创建一个叫AAA的表 ...

  5. javascriptRemke之深入迭代

    javascriptRemke之深入迭代 前言:"迭代"意为按照顺序反复多次执行一段程序,ECMAscript6中新增了两个高级特性:迭代器与生成器,使用这两个特性能更高效地实现迭 ...

  6. k8s学习笔记(1)- 简单部署springboot应用

    前言:k8s全称kubernetes,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,关于更多的k8s知识,可自行学习 1.k8 ...

  7. ReentrantLock可重入锁、公平锁非公平锁区别与实现原理

    ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取 ...

  8. 【UE4 C++】读写Text文件 FFileHelper

    CoreMisc.h 读取 FFileHelper::LoadFileToString 读取全部内容,存到 FString FString TextPath = FPaths::ProjectDir( ...

  9. 极速上手 VUE 3 —— teleport传送门组件

    一.teleport 介绍 teleport 传送门组件,提供一种简洁的方式,可以指定它里面的内容的父元素.通俗易懂地讲,就是 teleport 中的内容允许我们控制在任意的DOM中,使用简单. 使用 ...

  10. 需求存在,功能存在——Alpha阶段性总结

    0.Alpha开发成果 题士Alpha发布报告 题士开发记录 1.任务划分 Alpha阶段大致将任务划分为Design,Develop和Test三类 Design型任务包含页面UI设计和接口API设计 ...