java的String学习加JDK源码的学习
发布日期:2021-06-29 11:11:12 浏览次数:3 分类:技术文章

本文共 8428 字,大约阅读时间需要 28 分钟。

1,关于字符串就是用看源码来学习的,即复习旧知识,也可以很好的掌握新知识。

1.1.——;源码;就是说的JDK源码,就是JDK开发人员写到代码,写了这个版本的JDK中该类是怎么来的,其中包括什么方法,什么接口,以及它具体实现的方法。我这是JDK7.6;
1.2——;学会看源码,看源码时就是看自己熟悉的,不然你是看不下去的,不然效率会低得吓人的。
1.3;——怎么打开源码。按住Ctrl 然后点击你要看的类,就会进入这个类的源码。
这里写图片描述
注意这里的outline表示大纲,这个类有什么方法的一个目录,可以直接点击然后就会进入这个方法介绍那个地方。
2;关于String类,不可变字符序列;

看着部分源码,String类最开头部分,关于String的介绍/** * The String class represents character strings. All * string literals in Java programs, such as "abc", are * implemented as instances of this class. * //String类代表字符类, * //literls字面量,也就是跟“abs”,双引号括起来的部分,也可以叫直接量。 * //implement 实现,instance 实列, * 

* Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * //String是永恒不变的,它的值在它被创建之后是不能被改变的, * //StringBuffers这个类是支持可变的。

public final class String    implements java.io.Serializable, Comparable
, CharSequence//String是被final修饰的,因此它是不可变的,并且不能被继承,并且它实现了许多接口。(具体什么不用管,(JDK里提供的接口)也可以按住Ctrl点击即可。接口中就定义了许多,方法。并且只有方法的什么没有方法的实例;(接口的概念)
//private final char value[];private权限修饰词,修饰则外部类是不能访问的,(私有的)final;意味常量的意思,不能被改变被继承。char value[];定义一个数组,这个数组是不可变的。final修饰的词仅仅是value这个引用的内容,只能指向一个数组对象,但是它指向这个数组对象的值是可以改变的,但是这个语句,数组里面的值也不可变,因为它是私有的,不能提供可变的接口。
public String() {        this.value = new char[0];    }//这个就是String类的构造器。当String str1 = new String();//就是声请长度为1的字符数组;—————————————————————————————————————————————————————————————public String(String original) {        this.value = original.value;        this.hash = original.hash;    } //这个构造方法就是可以传进字符串进来。 String str2 = new String("sssss");//可以传入字符串进来。 ------------------------------------------------------------- public String(char value[]) {        this.value = Arrays.copyOf(value, value.length);    }//构造方法,传递一个数组,但是这里有数组的copy。需要把这个数组Arrany.copyOf到我们这个类的数组里面。    char[] c = {
'a', 'v'}; String str3 = new String(c);//传递一个数组进来,在这个构造方法里面调用了Array.copyOF(), //Array类中public static char[] copyOf(char[] original, int newLength)进行赋值 }
public int length() {        return value.length;    }   //length()这个方法就是把这个数组的长度返回来了。
public boolean isEmpty() {        return value.length == 0;    }    //如果长度为0那么就是空嘛。
public char charAt(int index) {        if ((index < 0) || (index >= value.length)) {            throw new StringIndexOutOfBoundsException(index);        }        return value[index];    }// charAt,就是返回索引指向的字符,从0开始;//注意中间还穿插了一个如果索引不在范围之内就会抛出一个异常,String strr = "abcder";        System.out.println(strr.charAt(2));//返回的是c

关于public boolean equals(Object anObject) 方法

这里写图片描述

String strr1 = new String("sjjdsf");        String strr2 = strr1;        System.out.println(strr2.equals(strr2));        //返回tur,因为指向同一个对象。直接在第一部分就是返回ture了。        --------------------------------------------------------        String strr1 = new String("sjjdsf");        String strr2 = new String ("sjjdsf");        System.out.println(strr1.equals(strr2));//比较的是内容是否相等。        System.out.println(strr1==strr2);//比较的是他们引用是否相等        //顺便回忆一下,equal方法默认方法是与==一致的,因此一般都是需要重写的。        String str = "absd";        String str1 = "absd";        System.out.println(str.equals(str1));//肯定是ture//这个应该也是true;”abcd“双引号括起来的字符串是表示在常量池中。

来个内存图的分析;

String str = new String("abcd");String str2 = new String("abcd");String str3 = "def";String str4 = "def";

这里写图片描述

indexOf()方法 Returns the index within this string of the first occurrence of     * the specified character. 返回索引,在这个字符串中第一次出现的这个字符。 public int indexOf(int ch) {
//调用重载方法 return indexOf(ch, 0);//0;表示这个字符串,从最开头开始找。 }重载方法; public int indexOf(int ch, int fromIndex) {
//formIndex开始找,String str = new String("abcd");System.out.println(str.indexOf('b'));//返回索引位置,并且注意索引都是从0开始的;System.out.println(str.indexOf('e'));//如果没有找到那么就返回-1;lastIndextOF()//从后面开始找。 System.out.println("Abcdb".indexOf('d'));//3 System.out.println("Abcdb".lastIndexOf('b'));//4
public String substring(int beginIndex)//截取字符串的方法。返回时字符串对象;* Returns a new string that is a substring of this string. The     * substring begins with the character at the specified index and     * extends to the end of this string. 

//返回一个子字符串对象,并且子字符串的对象从传人的索引这个值所值的字符开始截取,一直到字符串结尾。//如果传人的值为负数,则会抛出异常。public String substring(int beginIndex, int endIndex) //一个重载方法;//表示的是从beginInder到endIndex的截取。String str = new String("abcd");String str1 = str.substring(2);System.out.println(str1);//返回cd

* Returns a new string resulting from replacing all occurrences of     * oldChar in this string with newChar. //返回一个新的字符串对象,从把字符串中的newchar用oldchar代替的新字符串 If the character oldChar does not occur in the     * character sequence represented by this String object,     * then a reference to this String object is returned.//如果这个老的字符没有出现在字符串里面,那么就会返回原字符串对象的引用。、return this。String str = new String("abcd");String str1 = str.replace('a', '*');System.out.println(str1);//返回*bcd

这里写图片描述

public String[] split(String regex) //对字符串进行切割,返回一个数组。String str = "abcd,abc,dmhjkl,";        String[] strArray = str.split(",");//按逗号进行切割。        for(int i=0;i
public String trim() //去除首尾空格。String str = "   assdf aw da f  ";String str1 = str.trim();//去除首尾空格;System.out.println(str1);//返回assdf aw da f
public char[] toCharArray() //就是将String对象中的数组返回,返回的是一个新的数组,这个数组就可以修改了。
public boolean equalsIgnoreCase(String anotherString)//忽略大小写进行比较Compares this {
@code String} to another {
@code String}, ignoring case* considerations.System.out.println("ASs".equalsIgnoreCase("asS"));//返回true
public boolean startsWith(String prefix)//表示字符串是否以这个开始。public boolean endsWith(String suffix)//表示字符串是否以这个结尾。        System.out.println("Abcdb".startsWith("Ab"));//ture        System.out.println("Abcdb".endsWith("db"));//true;
public String toLowerCase() //把字符串中的字母全变成小写public String toUpperCase()//把字符串的字母全变为大写;        System.out.println("ADs".toLowerCase());//ads        System.out.println("ADS".toUpperCase());//ADS

常见的拼字符串代码,但是并不好,很浪费空间。因为要声明很多对象**

String gh = "g";//这句话就是有两个对象,“g”也单独算一个对象/        for(int i = 0; i < 10; i++){
//这里会创建9个对象。一起就是11个对象(常做面试题) gh += i;//相当于,gh = gh + i; } System.out.println(gh);//g0123456789 //要注意,这里的gh是变化的,为什么;因为String不可变,是指的”g“里面的, //如果改为final String gh = "g"; 那就的确是不可变的但是String里面的因此gh是可变的。

这里写图片描述

再强调一下,private final char value[];是引用的值不可变,但是value里面的元素是可以变的,但是String类是private并且也没有暴露可以修改的接口,因此value里面的值还是不能修改。(封装)

对于源码的学习,要适当,看自己知道的就ok,了解这个类大概有什么方法。

附上上方各种方法的代码

package textString;import javax.swing.plaf.synth.SynthSeparatorUI;public class Stringtext {    public static void main(String[] args) {//      String str = "abcd";//按住Ctrl点击String,进入String类的源码;//      String str1 = new String();//就是声请长度为1的字符数组;//      String str2 = new String("sssss");//可以传入字符串进来。//      char[] c = {
'a', 'v'};// String str3 = new String(c);//传递一个数组进来,在这个构造方法里面调用了Array.copyOF();// //public static char[] copyOf(char[] original, int newLength)进行赋值/ //返回这个索引位置的字符// String strr = "abcder";// System.out.println(strr.charAt(2));//返回的是c// String strr1 = new String("sjjdsf");// String strr2 = strr1;// System.out.println(strr2.equals(strr2));//返回tur,因为指向同一个对象。直接在第一部分就是返回ture了。// String strr1 = new String("sjjdsf");// String strr2 = new String ("sjjdsf");// System.out.println(strr1.equals(strr2));//比较的是内容是否相等。// System.out.println(strr1==strr2);//比较的是他们引用是否相等 //equals()判断// String str = "absd";// String str1 = "absd";// System.out.println(str.equals(str1));//肯定是ture// System.out.println(str==str1);//这个应该也是true;”abcd“双引号括起来的字符串是表示在常量池中。// //关于不同声明的内存图// String str = new String("abcd");// String str2 = new String("abcd");// String str3 = "def";// String str4 = "def"; //从字符串前面开始找。// String str = new String("abcd");// System.out.println(str.indexOf('b'));//返回索引位置,并且注意索引都是从0开始的;// System.out.println(str.indexOf('e'));//如果没有找到那么就返回-1; //字符串截取// String str = new String("abcd");// String str1 = str.substring(2);// System.out.println(str1);//返回cd //进行替换。// String str = new String("abcd");// String str1 = str.replace('a', '*');// System.out.println(str1);//返回*bcd //按照某个东西对字符串进行切割返回字符串数组// String str = "abcd,abc,dmhjkl,";// String[] strArray = str.split(",");//按逗号进行切割。// for(int i=0;i

这篇博客终于打完了,预计一个中午敲完的,想当然的以为还可以午睡一回然后可以再看看理论。然而计划永远都是需要变化的。从12.30开始敲直到现在4点钟,一直都在敲,查资料看源码敲代码,。不过收获还是挺大的。对String类的常用方法,有了一个了解,并且对于字符串的内存分步更加清了,知道了以后要怎么去看源码去学习一种方法,一种类了。敲完了,撤了。java之学习之路终于慢慢走向正规了。还有一个礼拜学校java就开课了,应该差不多在那几天可以敲出一个简单的项目出来吧。(简单的原始飞机大战)想法是、

转载地址:https://blog.csdn.net/zw1996/article/details/52981771 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java之StringBuilder和关于数组怎么扩容
下一篇:关于Java的一些图形awt介绍

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月30日 04时38分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

「权威发布」2019年大学生电子设计竞赛,仪器设备和主要元器件清单 2019-04-29
「重磅猜题之第二篇」2019年大学生电子设计竞赛 2019-04-29
知乎:硬件和软件哪个吃香? 2019-04-29
中国深圳,600架无人机的盛典! 2019-04-29
干货分享 JVM 之第 3 篇 —— Java 内存结构相关 2019-04-29
干货分享 JVM 之第 4 篇 —— 掌握 Jmeter 压力测试工具,熟悉 Jconsole.exe 工具 2019-04-29
干货分享 JVM 之第 5 篇 —— 类加载器 2019-04-29
干货分享 JVM 之第 6 篇 —— SpringBoot2.0 框架性能调优 2019-04-29
基于 Hystrix 高并发服务限流第 1 篇 —— 必须了解的相关概念 2019-04-29
基于 Hystrix 高并发服务限流第 2 篇 —— 服务隔离(线程池隔离、信号量隔离) 2019-04-29
基于 Hystrix 高并发服务限流第 3 篇 —— 服务熔断、服务降级 2019-04-29
基于 Hystrix 高并发服务限流第 4 篇 —— 基于 Feign 实现服务熔断降级处理 2019-04-29
基于 Hystrix 高并发服务限流第 5 篇 —— Hystrix 监控 2019-04-29
Eureka 如何快速的、优雅的停止某个微服务 2019-04-29
Eureka 实现安全认证 2019-04-29
基于 Hystrix 高并发服务限流第 6 篇 —— 服务限流,基于 RateLimiter 实现 2019-04-29
Nginx 反向代理、负载均衡配置、Location正则表达式 2019-04-29
SpringBoot + WebSocket 实现前后端的收发消息 2019-04-29
SpringBoot 整合 JWT 实现统一认证 2019-04-29
SpringBoot 使用 CompletableFuture 实现非阻塞异步编程 2019-04-29