Java基础——String
前言
从去年八月末开始工作一年了,有了大半年的java开发经验,自认为比在大学时期编码能力强了很多,但是基础方面概念模糊的地方感觉越来越多了 (;´д`)ゞ
所以,我准备把这些问题以及工作中遇到的问题总结,记录下来,造福自己和大家~ヾ(o・ω・)ノ 当然,如果大家发现我哪里写的有错误,欢迎在下方评论指出来。
那我们开始吧!
String
1.String是一个final类,不能被继承
2.String底层维护是一个数组,静态创造一个字符串时,此字符串存在于String池,当下一个String对象也是静态创建的时候,先去String池里找是否有和新对象一样的,
如果有,指向新对象,否则创建新对象。
下面内容引用 https://blog.csdn.net/weixin_38722500/article/details/81134952 以解释第二条
(1)
String str1 = "abc";
System.out.println(str1 == "abc");
步骤:
1)栈中开辟一块空间存放引用str1
2)String池中开辟一块空间,存放String常量"abc"
3)引用str1指向池中String常量"abc"
4)str1所指代地址即常量"abc"所在地址,输出为true
(2)
String str2 = new String("abc");
2 System.out.println(str2 == "abc");
步骤:
1)栈中开辟一块空间存放引用str2
2)堆中开辟一块空间存放一个新建的String对象"abc"
3)引用str2指向堆中的新建的String对象"abc"
4)str2所指代地址即常量"abc"所在地址,而常量"abc"地址在池中,输出为false
(3)
String str3 = new String("abc");
System.out.println(str3 == str2);
步骤:
1)栈中开辟一块空间存放引用str3
2)堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象
3)引用str3指向另外新建的那个String对象
4)str3和str2指向堆中不同的String对象,地址也不相同,输出为false
(4)
String str4 = "a" + "b";
System.out.println(str4 == "ab");
步骤:
1)栈中开辟一块空间存放引用str3
2)根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab"
3)引用str4指向池中常量"ab"
4)str4所指即池中常量"ab",输出为true
(5)
final String s = "a";
String str5 = s + "b";
System.out.println(str5 == "ab");
同(4)
(6)
String s1 = "a";
String s2 = "b";
String str6 = s1 + s2;
System.out.println(str6 == "ab");
步骤:
1)栈中开辟一块空间存放引用s1,s1指向池中String常量"a"
2)栈中开辟一块空间存放引用s2,s2指向池中String常量"b"
3)栈中开辟一块空间存放引用str5
4)s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象
5) 引用str6指向堆中(s1 + s2)所还原的新String对象
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false
(7)
String str7 = "abc".substring(0, 2);
步骤:
1)栈中开辟一块空间存放str7
2)substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象
3)引用str7指向堆中的新String对象
(8)
String str8 = "abc".toUpperCase();
步骤:
1)栈中开辟一块空间存放str8
2)toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC"
3)引用str8指向堆中的新String对象
呼,这部分终于结束了,我们继续(ง •̀_•́)ง
3.几个常用方法:
//1.charAt()方法:根据下标返回对应字符
char c = str.charAt(2);
System.out.println(c); //2.substring()方法:截取字符串
1<=string<4 (左边包含右边不包含)
String s = "abcde";
String s1= s.substring(1,4);
System.out.println(s1); //3.toUpperCase():变大写 toLowerCase():变小写
String s = "aBc";
System.out.println(s.toUpperCase());
System.out.println(s.toLowerCase()); //4.trim():去除字符串两边空格
String s1 = " abcde ";
String s2 = s1.trim();
System.out.println(s2.length);
System.out.println(s1.length);
System.out.println(s1.charAt(0)); //5.indexOf():搜索指定字符串,如果能找到返回起始下标,
//找不到返回-1 , 不可以隔着查 如搜索bd 会返回-1
String s = "abcde";
int a = s.indexOf("bc");
System.out.println(a); //6.startsWith():判断是否以某字符串开头
//endsWith():判断是否以某字符串结尾
String s = "abcde";
boolean a = s.startsWith("ab");
boolean b = s.endsWith("de");
System.out.println(a);
System.out.println(b); //7.字符串有两种创建方法
//字面值赋值:字符串使用频率 太高,java对String做了优化
//建议这样:
Sting s1 = "abc";
//不建议new关键字创建:
String s2 = new String("abc"); //8.判断字符串相等的方法
boolean boo = s1.equals(s2);
System.out.println(boo); //9. = , == , equald的区别:
// = :赋值
// == :比较对象是否相同
// equals :比较两个对象内容是否相同
4.String ,StringBuffer 以及 StringBuilder区别:
1)String长度不可以改变
2)StringBuffer和StringBuilder长度可以改变
3)StringBuffer线程安全,执行效率低
4)StringBuilder线程不安全,执行效率高
好了! 以上就是目前我在String方面概念模糊的地方了!希望能够帮到大家!
我们下期再见!
Java基础——String的更多相关文章
- Java基础String的方法
Java基础String的方法 字符串类型写法格式如下: 格式一: String 变量名称; 变量名称=赋值(自定义或传入的变量值); 格式二: String 变量名称=赋值(自定义或传入的变量值); ...
- Java基础 String 裸暴力算法- 五个小练习
之间的博客,承上启下: Java基础 String/StringBuff 常用操作方法复习/内存分析 Java数组直接选择排序.sort()排序 Java基础 String 算法 - 五个练 ...
- Java基础—String构造方法
Java基础--String构造方法 public String(): 创建一个空表字符串对象,不包含任何内容 public String(char[]chs): 根据字符数组的内容,来创建字符串对象 ...
- java基础-String不可变的好处
一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable< ...
- Java基础 -- String,StringBuilder,StringBuffer三者的区别
结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...
- Java基础—String总结
特点 String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. String实 ...
- java基础——String的常用方法
java中String的常用方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); i nt le ...
- java基础 String
标准格式:数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};省略格式:数据类型[] 数组名称 = {元素1,元素2,...}; Scanner类实现的功能,可以实现键盘输入 ...
- Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较
附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...
随机推荐
- 记一次MBR锁机病毒分析
有一天,在机缘巧合之下我获得了一个锁机软件(是多巧合阿喂!),然后兴高采烈的把它拖入了虚拟机里蹂躏(>_<!). 很巧,软件有虚拟机检测... Emmmm好吧,随便过一下... 我用的虚拟 ...
- 队列的理解和实现(二) ----- 链队列(java实现)
什么是链队列 链队是指采用链式存储结构实现的队列,通常链队用单链表俩表示.一个链队显然需要两个分别指示队头和队尾的指针,也称为头指针和尾指针,有了这两个指针才能唯一的确定. package 链队列; ...
- Vue-cli 2.9 多页配置及多页面之间的跳转问题
vue开发,现在大部分做的都是(SPA)应用,但是,由于,需求不同,我们针对的用户需求变更较为,频繁,如果每次都全量打包更新,给开发的自测,及测试妹子的任务就会多,每次都要重新验证一下才放心.所以,想 ...
- markdown页面内跳转
分两步 第一步 实际语法比较简单,在需要跳转的位置添加锚点,语法如下: <span id="jump">跳转到的地方</span> 第二步 在需要点击跳转的 ...
- 修改hosts文件的脚本1.0
import sys IP_input = input("Please input IP:")DNS_input = input("Please input Domain ...
- OpenERP __sql_constrants doesn't work.
可能的原因有两个,一个是你没有更新模块列表,第二个可能是你原有的列已经有重复的数据.(unique限制为例.)
- Linux下C++开发常用命令
本页面记录本人在Linux下进行C++开发时使用的常用命令,注意这里不包括比如ls,mv等linux命令,这里会持续更新.首先假设你只有一个源程序文件,叫vec.cpp,编译后的可执行程序叫vec(本 ...
- 【数组】Unique Paths
题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- setTimeOut函数和setInterval函数
setTimeout( )是设定一个指定等候时间 (单位是千分之一秒, millisecond), 时间到了, 浏览器就会执行一个指定的 method 或 function, 有以下语法: 今次例子是 ...
- Winform为窗体增加快捷键
1. 定义窗体的 xxx_KeyDown(object sender, EventArgs e) 2. 书写快捷键的代码: //这里的xxx代表你的窗体名 private void xxxx_KeyD ...