1.String的特性

代表字符串,java中所有字符串字面值都作为此类的实现例实现。String是一个final类,不能被继承。String实现了Serialiable,表示字符串支持序列化,实现了Comarable,表示String可以比较大小。

1.1 String不可变性:减少大量的同步锁

String不可变性是指内部维护一个不可变的char数组,来向外输出的。上为jdk中的代码,类由final修饰表示是不可继承的;核心域value[]是private final的,final表示此引用指向的内存地址不会发生改变,但是内存地址中存储的值仍可能会发生改变。

为了解决这一问题jdk采用了“保护性拷贝”,使得内存地址中存储的值不会发生改变:  

面试题:

public class StringTest {
private String str = "good";
private char[] ch = {'t', 'e', 's', 't'}; public void change(String str, char[] ch) {
str = "testGood";
ch[0] = 'b';
} public static void main(String[] args) {
StringTest stringTest = new StringTest();
stringTest.change(stringTest.str, stringTest.ch);
System.out.println(stringTest.str);
System.out.println(stringTest.ch);
//good
//best
}
}

Java引用型变量作为形参时,传递给方法的是变量的内存地址,str此时传递的是内存方法区的常量池中的“good”字符串的内存地址,属性str作为String类型指向的字符数组“good”内存地址不可变,而不是str这个string引用指向不可变

1.2 String的定义方式

1.字面量的定义方式

String s = “abc”;字符串"abc"声明在内存方法区的字符串常量池中,并将字符串地址赋值给s。字符串常量池是不会存储两个相同的字符串

2.new方式

两种方式的区别:字符串常量存储在方法区的常量池,非常量对象存储在堆中

        String s1 = "javaEE";
String s2 = "javaEE"; String s3 = new String("javaEE");
String s4 = new String("javaEE"); System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s3 == s4);//false

String s = new String("abc");方式创建对象,在内存中创建了几个对象?

两个:一个是堆空间的new结构,另一个是方法区常量池中的char[]数据"abc"

public static void main(String[] args) {
String s1 = "javaEE";
String s2 = "hadoop"; String s3 = "javaEE" + "hadoop";
String s4 = s1 + "hadoop";
String s5 = "javaEE" + s2;
String s6 = s1 + s2;
String s7 = "javaEEhadoop";
String s8 = (s1 + s2).intern();
String s9 = s1 + s2; System.out.println(s3 == s4);//false
System.out.println(s5 == s4);//false
System.out.println(s5 == s6);//false
System.out.println(s7 == s3);//true
System.out.println("javaEEhadoop" == s8);//true
System.out.println(s9 == s6);//false
};//true
}

凡是涉及到对象名、数组名(new出来的结构)均声明在堆结构中,与字面量结构做连接运算也会在堆结构new新对象。(s1 + s2).intern()因为使用intern结果也存储于方法区常量池中。

1.3 String的常用方法

chatAt(int index)
length()
isEmpty()
toLowerCase()
toUperCase()
trim() 忽略前后空白
equalsIgnoreCase()
concat() +
compareTo() 比较字符串大小
substring(int startIndex)
substring(int startIndex. int endIndex)
boolean endsWith(String suffix)
boolean startsWith(String suffix)
boolean startsWith(String suffix, int index)
boolean contains(charSquence)
int indexOf(String str) 返回子串第一次出现的索引
int indexOf(String str, int fromIndex) 从指定索引开始
int lastIndexOf(String str) 返回子串最后一次出现的索引
int lastIndexOf(String str, int fromIndex) 从指定索引开始反向搜索
String replace(char oldChar, char newChar) 替换全部的字符
String replaceAll(String regex, String new) 正则替换
boolean matches(String regex)
String[] split(String regex) 按照正则表达式拆分字符串
String[] split(String regex, int limit)

1.4 String与其它结构之间的转换

String -> 基本数据类型、包装类:Integer.parseInt(str);

基本数据类型、包装类 -> String: ①String.valueOf(****);

② +""

String -> char[]:str.tocharArray()

String -> byte[]:str.getBytes()    编码

byte[] -> String:Arrays.toString()

new String(bytes, "编码") 解码

1.5 StringBuffer和StringBuilder

StringBuffer:可变的字符序列,方法均为synchronized同步方法,线程安全但是效率偏低。底层数组创建初始长度为16方便修改,长度不足时进行扩容底层的数组,默认情况下扩容为原来容量的二倍 + 2,同时将原来数组的元素赋值到新数组中。

另外也可以在new的时候设置构造器参数为字符串长度。

StringBuffer sb = new StringBuffer(int strLength);

StringBuilder:可变的字符序列,线程不安全但是效率高一些。

StringBuffer 常用方法

append()
delete()
replace(int start, int end, String str),setCharAt(int index,char ch)
subString(int start, int end)、charAt(int index)
insert(int start, String str)
length() 长度
reverse() 字符串翻转,String没有
for + charAt(int index) 遍历

效率:StringBuilder > StringBuffer > String

一些注意点

append对于null的处理是转换为字符串“null”然后进行添加。

public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
String str = null;
sb.append(str);
System.out.println(sb.length());//4
System.out.println(sb);//"null" sb = new StringBuffer(str);//抛出异常 }

2.Date

System
long System.currentTimeMillis() 返回当前时间与1970年1月1日0时0分0秒之间以毫秒计数的时间差。一般称为时间戳。

java.uti.Date

两个构造器
Date date = new Date() 创建一个当前时间的Date对象,toString()展示当前时间的年月日时间。
Date date = new Date(年月日、毫秒数) 创建指定时间的Date对象。

date.getTime()也可以获取当前时间与1970年1月1日0时0分0秒之间以毫秒计数的时间差。

java.sql.Date

toString() 显示年-月-日

sqlDate对象 -> utilDate对象转换:子类转父类体现多态,父类转子类需要强转且声明的父类本来就是new的子类

java.util.Date date = new java.sql.Date(1991, 10, 1);//子类转父类体现了多态
java.sql.Date date1 = new java.sql.date(date.getTime());//父类转子类的解决方法

3.java.text.SimpleDateFormat

Date类不易于国家化,java.text.SimpleDateFormat是一个不与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化和解析

格式化:日期->文本
new SimpleDateFormat() 默认构造器,结果为22-3-14 下午4:10的形式
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 2022-03-14 04:12:40
sdf.format(date)
解析:文本->日期
sdf.parse(str)

4 java.util.calendar 日历类的使用

实例化方法
Calendar calendar = Calendar.getInstance(); 对象仍是Calendar的子类GregorianCalendar的对象
Calendar calendar = new GregorianCalendar();
常用方法
get(Calendar.DAY_OFMONTH) 获取一些常用数据
set(date) Date->Calendar
add()
getTime() 返回Date对象
setTime()

5.jdk8新时间API java.time

原来存在的问题

1.日期时间应该是不可变的。(通过构造器创建Date对象年份需要-1990月份需要-1)

2.Date中的年份是从1900年开始,而月份是从0开始。

3.格式化只对Date有用,对Calendar没用。

4.它们线程不安全,不能处理闰秒。

实例化方式一:获取当前时间

        LocalDate ld = LocalDate.now();
LocalTime lt = LocalTime.now();
LocalDateTime ldt = LocalDateTime.now();
        LocalDateTime of = LocalDateTime.of(2022, 10, 6, 19, 10, 0);

实例化方式二:获取设置时间

        System.out.println(of.getDayOfMonth());
System.out.println(of.getDayOfWeek());
System.out.println(of.getYear());
System.out.println(of.getMonth());

with的"不可变性"

        LocalDateTime of2 = of.withDayOfMonth(15);
System.out.println(of);//没有改变
System.out.println(of2);//发生改变

plus方法

        LocalDateTime of2 = of.plusDays(1);
System.out.println(of)//没有改变;
System.out.println(of2//发生改变);

6.Instant 瞬时

面向机器的以毫秒计数记录应用时间的时间戳。

Instant.now() 以本初子午线中时区为基准
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); 东八区时间

7.java.date.format.DateTimeFormat

格式化解析LocalDate、LocalTime、LocalDateTime日期和时间,类似于SimpleDataFormat

初始化方式:

//1.预定义的标准格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME;
//2.本地相关的格式
//3.自定义的格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

8.System

成员方法
System.currentTimeMillis()
void exit(int status) 退出程序,0代表正常退出,非0代表异常退出
void gc() 请求系统进行垃圾回收
String System.getProperty("")

9.Math

10.BigInteger与BigDecimal

BigInteger

Integer最大231-1,Long最大263-1,BigInteger可表示不可变的任意精度的整数。

BigInteger构造器

BigInteger(String val):根据字符串构建BigInteger对象。

常用方法
BigInteger abs()
BigInteger add(BigInteger val) +
BigInteger subtract(BigInteger val) -
BigInteger multiply(BigInteger val)
BigInteger divide(BigInteger val) /
BigInteger remainder(BigInteger val) %
BigInteger[] divideAndRemainder(BigInteger val) 返回包含(this/val)和(this%val)的BigInteger数组
BigInteger pow(int exponent)

“不变性”

        BigInteger b = new BigInteger("111111111111111111111111111111111111111111111111111111");
BigInteger c = b;
b.add(c);
System.out.println(b);//不发生改变
System.out.println(c);//不发生改变
        BigInteger b = new BigInteger("111111111111111111111111111111111111111111111111111111");
BigInteger c = b;
b = b.add(c);
System.out.println(b);//发生改变
System.out.println(c);//不变

BigDecimal

BigDecimal构造器

BigDecimal bigDecimal = new BigDecimal(double val);

BigDecimal bigDecimal = new BigDecimal(String val);

通过BigDecimal实现保留小数点

public BigDecimal setScale(int newScale,int roundingMode)

newScale表示保留的位数

roundingMode表示要保留的类型

roundingMode类型
BigDecimal.ROUND_HALF_UP 四舍五入
BigDecimal.ROUND_HALF_DOWN 四舍五入
ROUND_UP 只要弃位非0就进一位
ROUND_DOWN 不管如何都不会进位

【JavaSE】Java常用类的更多相关文章

  1. Java基础 —— Java常用类

    Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...

  2. Java常用类之要点总结

    Java常用类之要点总结

  3. Java常用类:包装类,String,日期类,Math,File,枚举类

    Java常用类:包装类,String,日期类,Math,File,枚举类

  4. Java常用类学习笔记总结

    Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...

  5. Java 常用类总结(SE基础)

    本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习. 1. 字符串相关的类 1.1 String String是一个final类,代表不可变的字符序列.不可被继承. Strin ...

  6. Java常用类的使用

    Java常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...

  7. Java常用类之String类、Stringbuffer和Random类练习

    定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...

  8. java常用类-上

    一,常用类之一包装类 java开发中习惯把八大基本数据类型封装到一个类中,并提供属性和方法,更方便的操作基本数据类型. 包装类的出现并不是用于取代基本数据类型,也取代不了. 包装类位于java.lan ...

  9. 第十四章 Java常用类

    14.常用类 14.1 字符串相关的类 1课时 14.2 JDK 8之前时间日期API 1课时 14.3 JDK8中新时间日期API 1课时 14.4 JDK8中的Optional类 1课时 14.5 ...

  10. Java 常用类String类、StringBuffer类

    常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...

随机推荐

  1. mybatis框架的连表查询one2one

    mybatis 的连表查询one2one 1.可以通过主从表之间的关联查询通过主键两次 在resultMap映射中的association标签<association property=&quo ...

  2. JMeter参数化(二)--数据库参数化

    1.下载mysql驱动,解压得到mysql-connector-java-8.0.17.jar(驱动一般放在java的 \java\jre\lib\ext 路径下): 2.在 测试计划-->浏览 ...

  3. 【confluence】jira issue宏中如何把优先级图标转义成文字

    在confluece中,关于表格处理有2个非常好的插件. Table Filter and Charts for Confluence     (插件文档:https://docs.stiltsoft ...

  4. Java学习笔记-封装Java Util包Base64方法

    懒人菜鸟入门Java系列-习惯性封装常用方法,方便开发过程中调用   注释: Java版本-1.8 1 * @Author wuwenchao 2 * @Version 1.0.0 3 * @Date ...

  5. 日常笔记-VS

    VS快捷键 按键 作用 CTRL+R,CTRL+W 以点显示空格 CTRL+L 删除当前行 CTRL+D 重复当前行 CTRL+K,D 格式化代码 CTRL+M 展开代码

  6. 抽风的Maven、maven插件及配置

    Idea 配合 Maven使用中有时遇到莫名奇妙的问题,又莫名奇妙的恢复正常.整理如下: 1.删除系统环境变量Maven_Home,只需在IDEA中指定Maven及settings.xml即可. 有时 ...

  7. JDK 7 HashMap 并发情况下的死锁问题

    目录 问题描述 详细解释 问题描述 JDK7的 HashMap 解决冲突用的是链表,在插入链表的时候用的是头插法,每次在链表的头部插入新元素.resize() 的时候用的依然是头插,头插的话,如果某个 ...

  8. 快速掌握Linux三剑客命令使用

    前言 Linux三剑客指的是grep.sed以及awk命令的使用,这三个命令功能异常强大,大到没朋友.grep命令主打"查找",sed命令主打"编辑",awk命 ...

  9. buildroot交叉编译ros过程中遇到的问题

    问题:Download error on https://pypi.python.org/simple/python-dateutil/:unknown url type:https --Some p ...

  10. 最大流基础(Maximum Flow Basis)

    1. 最大流问题定义 1.1 流网络(Flow network) Def. A flow network is a tuple \(G = (V, E, s, t, c)\): Digraph \(( ...