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. Spring源码之创建AOP代理之增强器的获取

    前言 在上一篇博文中我们说到了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类究竟做了什么工作从而完成AOP的操作呢?首先我 ...

  2. equals之List

    School类 package com.collection.equals; /* * 定义一个学校类 相当于一个学校模板 * 状态: 1.学校id 2.学校名称 * */ public class ...

  3. 题解 [HNOI2016]大数

    题目传送门 题目大意 给出一个\(n\)个数的字符串,有\(m\)次查询,对于该串的子串\([l,r]\)有多少个子串满足是固定素数\(p\)的倍数. 思路 其实很简单,但是一开始想偏了...果然还是 ...

  4. 微信小程序_快速入门01

    这段时间,嗯,大四课程已经结束了,工作也已经找到了,但是呢,到公司报道的时间还没到,哈哈,马上就开始人生的第一份工作了,怎么说确实有点期待~ 在这段时间一方面为第一份工作做各种准备,另一方面也没有停止 ...

  5. 2020.10.10--pta阶梯赛练习2补题

    7-3.N个数求和 本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(≤100).随后 ...

  6. vue基础-组件&插槽

    组件 组件化的意义:封装(复用,把逻辑隐藏起来,提高可维护性),快速开发(搭积木) 约定:我们通常把那些除了HTML标签以外的自定义组件,才称为'组件',结论是,我们说"父组件"& ...

  7. 脚本注入2(post)

    终于写到非get类型的注入了. 不过,我懒得在这里搞代码审计了:留到存储型XSS原型的时候再来分析源码吧. 这次以Less-15为例. 框里随便输点东西,submit,抓包,发现包出现了一些改变: 同 ...

  8. 【Spring】IoC容器 - 依赖查找

    前言 上一篇文章已经学习了[IoC的主要实现策略]有2种: 1.依赖查找 2.依赖注入 这里稍加详细的介绍一下依赖查找 1.依赖查找的方式 依赖查找的方式可以以多种维度来划分: 1.按名称/类型/注解 ...

  9. 【UE4 C++】学习笔记汇总

    UE4 概念知识 基础概念--文件结构.类型.反射.编译.接口.垃圾回收.序列化[导图] GamePlay架构[导图] 类的继承层级关系[导图] 反射机制 垃圾回收机制/算法 序列化 Actor 的生 ...

  10. 验证域用户(C#)

    代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Intero ...