char是一种基本的数据类型,Character是char类型的包装类,即通过Character创建出来的是一种对象。
Character是char的包装类,就像Integer和int,以及Long和long一样。
包装类和基本类型可以自动转换,这是jdk1.5(5.0)的新特性,叫做自动封箱和自动解封
- char ch='a';
-
- Character ch1=ch;//自动封箱
-
- Character c=new Character(a);
-
- char c1=c;//自动解封
定义:基本数据类型和包装类之间可以自动地相互转换
理解:装箱就是自动将基本数据类型转换为封装类型,拆箱就是自动将封装类型转换为基本数据类型。
- // 自动装箱
- 1. Integer a = 100;
- // 自动拆箱
- 2. int b = a;
自动装箱,相当于Java编译器替我们执行了 Integer.valueOf(XXX);
自动拆箱,相当于Java编译器替我们执行了 Integer.intValue(XXX);
CharSequence是一个描述字符串结构的接口,在这个接口里面一般发现有三种常用的子类:

截取部分字符串代码样例
- public static void main(String[] args) {
- CharSequence str = "hello world";
- CharSequence sub = str.subSequence(6,11);
- System.out.println(sub);
- }
CharSequence接口源码
- package java.lang;
-
- import java.util.NoSuchElementException;
- import java.util.PrimitiveIterator;
- import java.util.Spliterator;
- import java.util.Spliterators;
- import java.util.function.IntConsumer;
- import java.util.stream.IntStream;
- import java.util.stream.StreamSupport;
-
- /**
- * A CharSequence is a readable sequence of
char values. This - * interface provides uniform, read-only access to many different kinds of
- *
char sequences. - * A
char value represents a character in the Basic - * href="Character.html#unicode">Unicode Character Representation for details.
- *
- *
This interface does not refine the general contracts of the {@link
- * java.lang.Object#equals(java.lang.Object) equals} and {@link
- * java.lang.Object#hashCode() hashCode} methods. The result of comparing two
- * objects that implement CharSequence is therefore, in general,
- * undefined. Each object may be implemented by a different class, and there
- * is no guarantee that each class will be capable of testing its instances
- * for equality with those of the other. It is therefore inappropriate to use
- * arbitrary CharSequence instances as elements in a set or as keys in
- * a map.
- *
- * @author Mike McCloskey
- * @since 1.4
- * @spec JSR-51
- */
-
- public interface CharSequence {
-
- /**
- * Returns the length of this character sequence. The length is the number
- * of 16-bit
chars in the sequence. - *
- * @return the number of
chars in this sequence - */
- int length();
-
- /**
- * Returns the
char value at the specified index. An index ranges from zero - * to length() - 1. The first
char value of the sequence is at - * index zero, the next at index one, and so on, as for array
- * indexing.
- *
- *
If the char value specified by the index is a
- * @docRoot}/java/lang/Character.html#unicode">surrogate, the surrogate
- * value is returned.
- *
- * @param index the index of the
char value to be returned - *
- * @return the specified
char value - *
- * @throws IndexOutOfBoundsException
- * if the index argument is negative or not less than
- * length()
- */
- char charAt(int index);
-
- /**
- * Returns a
CharSequence that is a subsequence of this sequence. - * The subsequence starts with the
char value at the specified index and - * ends with the
char value at index end - 1. The length - * (in
chars) of the - * returned sequence is end - start, so if start == end
- * then an empty sequence is returned.
- *
- * @param start the start index, inclusive
- * @param end the end index, exclusive
- *
- * @return the specified subsequence
- *
- * @throws IndexOutOfBoundsException
- * if start or end are negative,
- * if end is greater than length(),
- * or if start is greater than end
- */
- CharSequence subSequence(int start, int end);
-
- /**
- * Returns a string containing the characters in this sequence in the same
- * order as this sequence. The length of the string will be the length of
- * this sequence.
- *
- * @return a string consisting of exactly this sequence of characters
- */
- public String toString();
-
- /**
- * Returns a stream of {@code int} zero-extending the {@code char} values
- * href="{@docRoot}/java/lang/Character.html#unicode">surrogate code
- * point is passed through uninterpreted.
- *
- *
If the sequence is mutated while the stream is being read, the
- * result is undefined.
- *
- * @return an IntStream of char values from this sequence
- * @since 1.8
- */
- public default IntStream chars() {
- class CharIterator implements PrimitiveIterator.OfInt {
- int cur = 0;
-
- public boolean hasNext() {
- return cur < length();
- }
-
- public int nextInt() {
- if (hasNext()) {
- return charAt(cur++);
- } else {
- throw new NoSuchElementException();
- }
- }
-
- @Override
- public void forEachRemaining(IntConsumer block) {
- for (; cur < length(); cur++) {
- block.accept(charAt(cur));
- }
- }
- }
-
- return StreamSupport.intStream(() ->
- Spliterators.spliterator(
- new CharIterator(),
- length(),
- Spliterator.ORDERED),
- Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED,
- false);
- }
-
- /**
- * Returns a stream of code point values from this sequence. Any surrogate
- * pairs encountered in the sequence are combined as if by {@linkplain
- * Character#toCodePoint Character.toCodePoint} and the result is passed
- * to the stream. Any other code units, including ordinary BMP characters,
- * unpaired surrogates, and undefined code units, are zero-extended to
- * {@code int} values which are then passed to the stream.
- *
- *
If the sequence is mutated while the stream is being read, the result
- * is undefined.
- *
- * @return an IntStream of Unicode code points from this sequence
- * @since 1.8
- */
- public default IntStream codePoints() {
- class CodePointIterator implements PrimitiveIterator.OfInt {
- int cur = 0;
-
- @Override
- public void forEachRemaining(IntConsumer block) {
- final int length = length();
- int i = cur;
- try {
- while (i < length) {
- char c1 = charAt(i++);
- if (!Character.isHighSurrogate(c1) || i >= length) {
- block.accept(c1);
- } else {
- char c2 = charAt(i);
- if (Character.isLowSurrogate(c2)) {
- i++;
- block.accept(Character.toCodePoint(c1, c2));
- } else {
- block.accept(c1);
- }
- }
- }
- } finally {
- cur = i;
- }
- }
-
- public boolean hasNext() {
- return cur < length();
- }
-
- public int nextInt() {
- final int length = length();
-
- if (cur >= length) {
- throw new NoSuchElementException();
- }
- char c1 = charAt(cur++);
- if (Character.isHighSurrogate(c1) && cur < length) {
- char c2 = charAt(cur);
- if (Character.isLowSurrogate(c2)) {
- cur++;
- return Character.toCodePoint(c1, c2);
- }
- }
- return c1;
- }
- }
-
- return StreamSupport.intStream(() ->
- Spliterators.spliteratorUnknownSize(
- new CodePointIterator(),
- Spliterator.ORDERED),
- Spliterator.ORDERED,
- false);
- }
- }