JAVA笔记三:JAVA-SE上

来源:互联网 发布:文森特 梵高知乎 编辑:程序博客网 时间:2024/06/06 10:39

JAVA-SE就是学习SUN给我们提供的api:庞大类库。

文档注释

  • 文档注释只能修饰三个地方 类,方法,常量
  • 文档注释可以被javadoc翻译并生成为手册。
  • 文档注释是功能级注释,用来说明整体功能。

String

String是不变对象 即:字符串对象一旦创建内容是不可改变的,改变一定要创建新对象。 JVM对字符串有一个优化:字符串常量池
字符串常量池中会缓存所有使用字面量形式创建的字符串对象,一旦发现再次使用已有的字面量创建字符串时会直接重用已创建对象。
int常量池也会缓存-128-127之间的直接量

  • int length():求字符串长度,无论中英,每个字符1个长度
  • Int indexOf(String str):查找str在当前字符串中位置,没有则返回-1
    • index = str.indexOf(“in”, 3):从指定位置开始检索
    • index = str.lastIndexOf(“in”):检索最后一次出现的位置
  • String substring(int start,int end):截取子串,范围是[start,end),含头不含尾
  • String trim():去除字符串两边的空白字符
  • char charAt(int index):获取指定下标的字符
  • boolean startsWith(String str),
  • boolean endsWith(String str):判断是否以指定字符串开头或者结尾
  • String toUpperCase(),
  • String toLowerCase():将字符串英文转换为全大写,或者全小写
  • String String.valueOf():String静态方法,将其他类型转换为字符串

StringBuilder——拯救频繁修改字符串带来的性能损耗

java.lang.StringBuilder
由于String在java中的优化倾向于重用性,这就导致频繁修改字符串对于性能的损耗是非常可观的。为此,java提供了一个专门用来修改字符串内容的类:StringBuilder
StringBuilder内部维护一个可变的字符数组,所有操作均在该数组中完成。速度快,内存消耗小。
StringBuilder提供了一套用于修改字符串内容的方法。
所以在实际开发中,所有修改字符串操作都应当使用StringBuilder来完成。

  String str = “好好学习java”;

  • StringBuilder builder= new StringBuilder(str):实例化StringBuilder对象
  • 增:builder.append(“,为了找个好工作!”):字符串末尾追加内容
  • 删:builder.delete(0, 8):删除指定范围字符串,[0,8);
  • 改:builder.replace(9, 16, “就是为了改变世界”):替换对应位置字符串,依旧[9,16)
  • 插:builder.insert(0, “活着”):在指定位置插入一个字符串
  • 反转:builder.reverse():颠倒字符串

StringBuffer 和StringBuilder的区别:

StringBuffer是线程安全的,同步处理的,性能稍慢;
StringBuilder是后推出的, 非线程安全的,并发处理的,性能稍快。

正则表达式、String与包装类

正则表达式基础

正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求。
java中的正则表达式本身也是一个字符串String reg=”\w”;

  • “.”:点儿,在正则表达式中表示任意一个字符。
  • “\”:在正则表达式中是转意字符
    • \d:表示任意一个数字
    • \w:表示任意一个单词字符(只能是 数字,字母,下划线)
    • \s:表示任意一个空白字符(\t \r \n \f \x0B)
    • \D:表示任意一个非数字字符
    • \W:表示任意一个非单词字符
    • \S:表示任意一个非空白字符
  • “字符集合 []”:”[]”用来描述单一字符,方括号内部可以定义这个字符的内容,也可以描述一个范围。
  • “+”:表示内容可以连续出现至少1次以上
  • “*”:表示内容出现0-若干次
  • “?”:表示内容出现0-1次
  • {n}:表示内容必须出现n次
  • {n,m}:表示内容出现n-m次
  • {n,}:表示内容出现至少n次
    分组”()”。() 可以将内容看做一个整体,()中可以使用”|”来表示或关系。例如,(+86|0086) 表示这里可以是+86或者0086。
  • “^”和”$”:首位加^…….$表示一个整体。若不使用它们,那么正则表达式只匹配某个字符串的部分内容是否符合格式规则,但使用它们,则要求字符串必须从头到尾都满足该格式规则。

String正则相关API:

  • boolean matches(String regex): 使用给定的正则表达式验证当前字符串是否满足格式要求
    注意:给定的正则表达式无论是否加了边界符(^…$)都是进行全匹配验证。
    @Test//字符串是否为任意三个字符,若为\\.则点仅为一个.    public void test4(){        String reg=".{3}";        System.out.println("css".matches(reg));    //true    }
  • String[] split(String regex):按满足正则表达式内容进行拆分,拆分出来的内容装入String[]。
    @Test    public void test5(){        String str="吃饭,睡觉,打豆豆";        String[] strs=str.split(",");        for(String s:strs){            System.out.println(s);  //吃饭    睡觉    打豆豆        }    }
  • String replaceAll(String regex,String str):按满足正则表达式内容替换成str
    @Test     //str本身不会改变,会返回一个新的字符串    public void test5(){        String str="吃饭,睡觉,打豆豆";        String s=str.replaceAll(",", "and");        System.out.println(s);    //吃饭and睡觉and打豆豆    }

包装类

java为8个基本类型分别定义了8个包装类
包装类是为了解决基本类型不能直接参与面向对象开发的问题

  • Integer i1 = new Integer(1):基本类型转换为包装类
  • Integer i3 = Integer.valueOf(127):推荐使用valueOf进行转换
  • 包装类有两个常量:
    • MAX_VALUE
    • MIN_VALUE :分别用来表示其表示的基本类型的取值范围

JAVA 1.5推出了一个新的特性:自动拆装箱
特性:编译器认可,而非虚拟机认可。
作用:编译源代码时将基本类型与包装类之间补充代码进行转换。

  • 简单来说,包装类可以和基本类型直接相互转换:
    • 1、自动拆箱:int i = new Integer(123)
        原型:int i = new Integer(123).intValue()
    • 2、自动装箱:Integer in = i
        原型:Integer in = Integer.valueOf(i)
    • 包装类有一个静态方法:parseXXX(String str)
      可以将给定的字符串转换为对应的基本类型值。
      但是前提是该字符串表示的内容是该基本类型可以保存的值。
//以下输出结果为true,有点不一样的地方。double也是如此        Integer i=100;        int i1=100;        System.out.println(i==i1);//会自动拆装箱,但不会自动转型    @Test    public void test1(){        double i=100;        Double i1=100;    //编译报错,不能从int to Double    }

java.util.Date

Date

Date的每一个实例用于表示一个时间点 Date内部维护一个long值,该值是UTC时间,即:从1970年1月1日 00:00:00
到该Date表示的时间之间所经过的毫秒数。
由于Date存在时区及千年虫问题,所以大部分操作时间的方法都被声明为过时的(操作时间交给Calendar类完成)

  • Date now = new Date():默认实例化出来的Date表示当前系统时间
  • long time = now.getTime():1970年至date日期之间经历的毫秒数
  • now.setTime(time):设置时间,long time

java.text.SimpleDateFormat

按指定格式转换String与date

  • SimpleDateFormat sdf= new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

格式化为字符串

  • String str = sdf.format(new Date()):将日期转为指定格式字符串
  • String str = sdf.format(time):重载方法,将long time转为字符串

解析成date

  • Date date = sdf.parse(str):将字符串按指定格式转为Date对象

java.util.Calendar

  • Calendar calendar = Calendar.getInstance():默认创建出来也表示当前系统时间,以阳历GregorianCalendar表示。
  • Date date = calendar.getTime():将Calendar表示的日期用Date形式表示
  • calendar.setTime(date):将Calendar表示Date date日期
  • void set(int field,int value):对指定时间分量设置给定的值

    • calendar.set(Calendar.YEAR, 2008);
      calendar.set(Calendar.MONTH, Calendar.AUGUST);
      calendar.set(Calendar.DAY_OF_MONTH, 8);
      calendar.set(Calendar.HOUR_OF_DAY, 20);
      calendar.set(Calendar.MINUTE, 8);
      calendar.set(Calendar.SECOND,8);
      calendar.set(Calendar.DAY_OF_WEEK, 3);
    • int get(int field):获取Calendar时间分量对应的值
      • 天有不同的时间分量:
      • DAY_OF_MONTH:月中的天,即:几号
      • DAY_OF_WEEK:周中的天,即:星期几
      • DAY_OF_YEAR:年中的天。
      • DATE:与DAY_OF_MONTH意思一致。
  • 获取时间分量

    • int year = calendar.get(Calendar.YEAR):获取年
      int month = calendar.get(Calendar.MONTH)+1:月从0开始
      int days = calendar.get(Calendar.DAY_OF_YEAR):今天是今年的第多少天
      days = calendar.get(Calendar.DAY_OF_WEEK)-1:周从周日开始
  • 添加时间分量

    • void add(int field,int value):时间分量加上指定的值,负数是减去
      calendar.add(Calendar.YEAR, 3):加3年
      calendar.add(Calendar.MONTH, 2):加两个月
      calendar.add(Calendar.DAY_OF_YEAR, 25):加25天
      calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY):设为当周周五
  • int getActualMaximum(int field)
    返回给定时间分量所允许的最大值。参照日期为当前Calendar所表示的日期

泛型

泛型就是在类名后加<>并在尖括号中指明元素类型:list<String>
  泛型是参数化类型,即将一个类中属性的类型、方法参数的类型、返回值的类型的定义权交给了使用该类的对象(通过传入类型参数)
  泛型是假的,其本质就是Object。泛型只是告知应当将泛型当成什么类型看待而已,这样设置值时编译器会自动检查实参类型是否与泛型一致,并且获取泛型值时自动造型

T自定义泛型 和 ?通配符泛型

泛型三种:
[1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T类型
[2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法
[3]ArrayList<? extends E> al=new ArrayList<? extends E>();
泛型的限定:

  • ? extends E:接收E类型或者E的子类型。
  • ?super E:接收E类型或者E的父类型。
      

java.util.Collection

集合(Collection)是具有特定数据结构,用于存储使用对象的容器其是一个接口,定义了集合相关的操作方法

集合用来存放一组元素,与数组功能相似。
集合提供了操作元素的相关方法。
集合常见的两个子接口:

  • Set:不可重复集,重复元素不能放入集合两次以上:HashSet() 顺序不定
  • List:可重复集:ArrayList(),LinkedList(),顺序固定

元素是否重复是依靠元素自身equals比较的结果而定
集合中存储的都是引用类型对象。且只保存每个元素对象的引用(即地址),并非将元素对象本身存入集合,基本类型装箱放入。
基本类型也可以放入集合,会自动拆装箱转为引用类型。

Collection集合接口所共有的方法:

  • boolean add(E e):向集合中加元素,成功返回true
  • int size():集合元素个数
  • boolean isEmpty():是否不含有任何元素
  • void clear():清空集合
  • boolean remove(E e):删除元素,根据元素equals比较的结果进行删除
  • boolean contains(E e):集合是否包含指定元素,同样根据equals比较结果
  • boolean addAll(Collection c):将一个集合所有元素添加到当前集合,有添加返回true
  • boolean containsAll(Collection c):判断集合是否包含给定集合中所有元素
  • void removeAll(Collection c):删除c中有的元素

子接口:List

List接口是Collection接口的子接口,用于定义线性表数据结构。可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少

  • 实现类
    • ArrayList:通过动态数组实现List接口,更适合于读取数据
    • LinkedList:通过链表实现List接口,更适合于插入和删除,链表结构
      在性能要求不是特别苛刻的情况下,可以忽略这个差异
  • 特有方法,以可以操作下标为主
    • String str = list.get(1):获取给定下标处对应的元素
    • String old = list.set(2, “三”):将给定元素设置到指定位置,返回值为原位置对应的元素
    • list.add(1,”2”):将给定元素插入到指定位置
    • String old = list.remove(2):将给定位置的元素从集合中删除并将该元素
    • 通过下标用for循环删元素时,应倒着删除,从后往前删
    • List sublist(int startindex, int endindex)
      截取List中下标从startindex 到endindex的元素,返回子集subList
      截取的时候含头不含尾
      subList与原List占有相同的存储空间,对subList的操作会影响原List
      对子集的操作就是对原集合对应元素的操作
    • list.subList(2, 9).clear():将集合中2-8元素删除

数组和List集合之间的相互转换

  • 集合转数组
    • Collection提供了相关方法:toArray()
      Object[] toArray() :返回包含此 collection 中所有元素的数组。
      T[] toArray(T[] a) :返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
      例如:String[] array = c.toArray(new String[c.size()]);
  • 数组转集合
    • 数组转换为集合使用数组的工具类Arrays,其提供了一个静态方法asList
      List list = Arrays.asList(array);
    • 注意:不可以直接添加元素,这会导致原数组扩容,而如果扩容就不能表示原数组,所以这样的操作不受支持(unsupported),向添加元素,需要另行创建一个新集合
原创粉丝点击