您当前的位置:网站首页>斗,java程序员用的最频频的string类总述,小宇

斗,java程序员用的最频频的string类总述,小宇

2019-04-20 01:25:28 投稿作者:admin 围观人数:244 评论人数:0次

String 界说与根底

String 的声明

  1. 不同字符串或许同享同一个底层char数组,例如字符串斗,java程序员用的最一再的string类总述,小宇 String s=”abc” 与 s.substring(1) 就同享同一个char数组:char[] c = {‘a’,’b’,’c’}。其间,前者的 offset 和 count 的值分别为0和3,后者的 offset 和斗,java程序员用的最一再的string类总述,小宇 count 的值分别为1和2。
  2. offset 和 count 两个成员变量不是剩余的,比方,在履行substring操作时。

JDK中关于 String 的描绘

string类表明字符串。Java程序中的一切字符串文字(StaseEndoStIdStEfTIVE),如“ABC”,都被完结为该类的实例。字符串是常量(常量);创立后不能更改其值。字符串缓冲区【StringBuilder或StringBuffer】支撑可变字符串。由于字符串目标是不行变的,所以能够同享(同享元方法)。

String 类所内置的操作

类字符串包含用于查看序列的单个字符、查看序列的单个字符、比较字符串、查找字符串、提取子字符串以及创立字符串副本的办法,一切字符都转化为大写或小写。大为卿狂小写映射依据java.lang.character类指定的Unicode规范版别。

字符串串联符号(”+”)以及将其他目标转化为字符串的特别支撑

Java言语为字符串级联操作符(+)供给了特别的支撑,并将其他目标转化为字符串。字符串衔接是经过StringBuilder(JDK1.5今后)或Stri美空ngBuffer(JDK1.5曾经)类及其a头发少合适什么发型ppend办法完结的。经过ToString完结的字符串转化(SurvivEdE-TION),由类目标界说并由Java中的一切类承继。

留意:

String不属于八种底子数据类型,String 的实例是一个目标。由于目标的默认值是null,所以String的默认值也是null;但它又是一种特别的目标,有其它目标没有的一些特性(String 的不行变性导致其像八种底子类型相同,比方,作为办法参数时,像底子类型的传值效果相同)。 例如,以下代码片段:斗,java程序员用的最一再的string类总述,小宇

public class StringTest {
public static void changeStr( String str )
{
String春笋的做法 s = str;
str += "welcome";
System.out.println( s );
}
public static void main( String[] args )
{
String str = "1234";
changeStr( str );
System整肠生的成效与效果.out.println( str );
}
}

new String() 和 new String(“”)都是声明一个新的空字符串,是空串不是nulofll;

String 的不行变性

什么是不行变目标?

众所周知,在Java中,String类是不行变类 (底子类型的包装类都是不行改动的) 的典型代表,也是Immutable规划方法的典型使用。String变量一旦初始化后就不能更改,制止改动目标的状况,然后添加同享目标的巩固性、削减目标拜访的过错,一起还避免了在多线程同享时进行同步的需求。那么,究竟什么是不行变的目标呢? 能够这样以为:假如一个目标,在它创立完结之后,不能再改动它的状况,那么这个手机单机游戏目标便是不行变的。不能改动状况指的是不能改动目标内的成员变量,包含:

  • 底子数据类型的值不能改动;
  • 引证类型的变量不能指向其他的目标;
  • 引证类型指向的目标的状日本汇率态也不能改动;

除此之外,还应具有以下特色:

  • 除了结构函数之外,不该该有其它任何函数(至少是任何public函数)修正任何成员变量;
  • 任何使成员变量取得新值的函数都应该将新的值保存在新的目标中,而坚持本来的目标不被修斗,java程序员用的最一再的string类总述,小宇改。

区别引证和目标

关于Java初学者, 关于String是不行变目标总是存有疑问。看下面代码:

String s = "ABCabc路特斯";
System.out.println("s = " + s); // s = ABCabc
s = "123456";
System.out.println("s = " + s); // s = 123456

首要创立一个String目标s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。 从打印成果能够看出,s的值的确改动了。那么怎样还说String目标是不行变的呢? 其实这儿存在一个误区: s 仅仅一个String目标的引证,并不是目标自身。目标在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。引证仅仅一个 4 字节的数据,里边寄存了它所指向的目标的地址,经过这个地址能够拜访目标。 也便是说,s仅仅一个引证,它指向了一个详细的目标,当s=“123456”; 这句代码履行过之后,又创立了一个新的目标“123456”, 而引证s从头指向了这个心的目标,本来的目标“ABCabc”还在内存中存在,并没有改动。

Java和C++的一个不同点是,在 Java 中,引证是拜访、操作目标的仅有办法: 咱们不或许直接操作目标自身,一切的目标都由一个引证指向,有必要经过这个引证才干拜访目标自身,包含获取成员变量的值,改动目标的成员变量,调用目标的办法等。而在C++中存在引证,目标和指针三个东西,这三个东西都能够拜访目标。其实,Java中的引证和C++中的指针在概念上是类似的,他们都是寄存的目标在内存中的地址值,仅仅在Java中,引证丧失了部分灵活性,比方Java中的引证不能像C++中的指针那样进行加减运算。

为什么String目标斗,java程序员用的最一再的string类总述,小宇是不行变的?

要了解String的不行变性,首要看一下String类中都有哪些成员变量。 在JDK1.6中,String 的成员变量有以下几个:

public final class String
implements java.io.Serializable, Comparable, CharSequence
{

private final char value[];

private final int offset;

private final int count;

private int hash;

在JDK1.7中,String类做了一些改动壮家海哥,首要是改动了substring办法履行时的行为,这和本文的主题不相关。JDK1.7中String类的首要成员变量就剩下了两个:

public final class String
implements java.io.Ser肺心病ializable, Comparable, CharSequence {

private final char value[];

private int hash; // Default to 0

String目标真的不行变吗?

从上文可知String的成员变量是 private final 的,也便是初始化之后不行改动。那么在这几个成员中, value比较特别,由于他是一个引证变量,而不是真实的目标。value是final润饰的,也便是说final不能再指向其他数组目标,那么我能改动value指向的数组吗? 比方,将数组中篆体的某个方位上的字符变为下划线“_”。 至少在咱们自己写的一般代码中不能够做到,由于咱们底子不能够拜访到这佐仓绊个value引证,更不能经过这个引证去修正数组,那么,用什么办法能够拜访私有成员呢? 没错,用反射,能够反射出String目标中的value特点, 从而改动经过取得的value引证改动数组的结构。下面是实例代码:

public static void testReflection() throws Exception {
//创立字符串"Hello World", 并赋给引证s
String s = "Hello World"亥时;
System.out.println("s = " + s); //Hello World
//获取String类中的value字段
Field valueFieldOfString = String.class.getDeclaredField("value");
//改动value特点的拜访权限
valueFieldOfString.setAccessible(true);
//获取s目标上的value特点的值
char[] value = (char[]) valueFieldOfString.get(s);
//改动value所引证的数组中的第5个字符
value[5] = '_';
System.out.println("s = " + s);
}

在这个过程中,s一直引证一剪梅原唱的同一个String目标,可是再反射前后,这个String目标发生了改动, 也便是说,经过反射是能够修正所谓的“不行变”目标的。可是一般咱们不这么做。这个反射的实例还能够阐明一个问题:假如一个目标,他组合的其他目标的状况是能够改动的,那么这个目标很或许不是不行变目标。例如一个Car目标,它组合了一个Wheel目标,尽管这个Wheel目标声明成了private final 的,可是这个Wheel目标内部的状况能够改动, 那么就不能很好的确保Car目标不行变。

String 目标创立办法

字面值方法: J斗,java程序员用的最一再的string类总述,小宇VM会主动依据字符串常量池中字符串的实际情况来决议是否创立新目标 (要么不创立,要么创立一个目标,要害要看常量池中有没有)

JDK 中明确指出:

String s = "abc";

等价于:

char data[] = {'a', 'b', 'c'黑龙江卫视节目表};
String str = new String(data);

该种办法先在栈中创立一个对String类的目标引证变量s,然后去查找 “abc”是否被保存在字符串常量池中。若”abc”现已被保存在字符串常量池中,则在字符串常量池中找到值为”abc”的目标,然后将s 指向这个目标; 不然,在 堆 中创立char数组 data,然后在 堆 中创立一个String目标object,它由 data 数组支撑,紧接着这个String目标 object 被存布卡漫画放进字符串常量池,最终将 s 指向这个目标。

经过 new 创立字符串目标 : 一概在堆中创立新目标,无沅论字符串字面值是否持平 (要么创立一个,要么创立两个目标,要害要看常量池中有没有)

String s = new String("abc"); 

等价于:

1、String original = "abc"; 
2、String s = new String(original);

所以,经过 new 操作发生一个字符串(“abc”)时,会先去常量池中查找是否有“abc”目标,假如没有,则创立一个此字符串目标并放入常量池中。然后,在堆中再创立“abc”目标,并回来该目标的地址。所以,关于 String str=new String(“abc”):假如常量池中本来没有”abc”,则会发生两个目标(一个在常量池中,一个在堆中);不然,发生一个目标。斗,java程序员用的最一再的string类总述,小宇

最终

我整理了一些互联网公司java程序员在军面试中涉及到的绝大部分架构面试题及答案做成了文档和架构视频材料免费共享给我们(包含Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术材料)也能够重视取得更多的面试材料,节约我们搜集的时刻!

获取材料的办法:转发+私信【材料】收取!

the end
没有烟囱的汽车工厂,环保新能源