1.数组
·几种定义方式
-
-
-
- public class ArrayTest {
- public static void main(String [] args){
- int [] arr1;
- String [] arr3,arr4 = new String[]{"aaa","bbb"};
- int arr5[] = new int[]{};
- int [] arr2 = new int[4];
- for (int i = 0,length=arr2.length;i<length;i++){
- arr2[i] = 4;
- }
- System.out.println(arr2.length);
- }
- }
2.String
·String一旦被初始化就不会被改变(String属于对象,对象的不可改变是指对象的状态不可改变,更具体就是对象内部成员变量不可改变)
解析源码(Java 1.7 一部分):
- public final class String
- implements java.io.Serializable, Comparable<String>, CharSequence {
-
- private final char value[];
-
-
- private int hash;
-
-
- private static final long serialVersionUID = -6849794470754667710L;
- }
★从源码中可以看出String是利用了数组来存储,而用于存储的value是final类型(被final修饰的变量属于常量,被final修饰的方法不能被覆盖,被final修饰的类不能被继承),源码中也并没有提供value的get/set方法,所以一旦值固定,就不能被改变。
★但是为什么replace/replaceAll等其他String提供的方法仍然能返回同一个呢,我们知道对象有对象和对象的引用(保存的是对象的地址)之分,对象储存在堆中,对象的引用存储在栈中,这里其实是对象的引用指向了另一个新的对象。查看源码可知:其利用了StringBuffer来操作String中的数据。
Java.lang.String 的replace源码:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public String replace(CharSequence target, CharSequence replacement) {
- return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
- this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
- }
java.util.regex.Matcher 的replaceAll()方法
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public String replaceAll(String replacement) {
- reset();
- boolean result = find();
- if (result) {
- StringBuffer sb = new StringBuffer();
- do {
- appendReplacement(sb, replacement);
- result = find();
- } while (result);
- appendTail(sb);
- return sb.toString();
- }
- return text.toString();
- }
★这里说不能被改变,是自身不能改变,但是我们可以利用反射来改变,这里被final修饰的也是一个数组对象,属于引用变量,这里final只能限制不能指向其他的数组对象,但是我们可以对数组中的内容进行修改。通过反射的方法获取到value这个数组字段,然后对数组中的数据进行修改。
参考代码:
- import java.lang.reflect.Field;
-
-
-
-
- public class Demo2 {
- public static void main(String[]args)throws Exception{
- String s = "ABCDEFG";
-
-
- Class stringClass = String.class;
- Field valueField = stringClass.getDeclaredField("value");
- valueField.setAccessible(true);
- char [] value = (char[])valueField.get(s);
- value[0] = 'B';
- System.out.println(s);
- }
- }
· string内部提供的方法:
——length();
——isEmpty();
——charAt():0<=x<length();
——getBytes(String charsetName):
。。。
·关于字符串的一些操作
★将字符串反转(String并未提供该方法,StringBuffer提供了该方法reverse())
①仿照StringBuffer中的reverse()方法
- import java.lang.reflect.Field;
-
-
-
-
- public class Demo3 {
- public static void main(String [] args) throws Exception{
- String s = "ABCDE";
- Class sClass = Class.forName("java.lang.String");
- Field valueField = sClass.getDeclaredField("value");
- valueField.setAccessible(true);
- char [] value = (char[])valueField.get(s);
- int l = s.length()-1;
- for (int j=(l-1)>>1;j>=0;--j){
- char temp = value[j];
- char temp2 = value[l-j];
- value[l-j] = temp;
- value[j] = temp2;
- }
- System.out.println(s);
- }
- }
②使用递归
-
-
-
- public class Demo4 {
- public static void main(String [] args){
- String s = "ABCDE";
- String str = reverse(s);
- System.out.println(str);
- }
- private static String reverse(String s){
- if (s.isEmpty())return s;
- return reverse(s.substring(1))+s.charAt(0);
- }
- }
③遍历
-
-
-
- public class Demo5 {
- public static void main(String [] args){
- String str = "ABCDE";
- String s = "";
- for (int i =str.length()-1;i>=0;i--){
- s+=str.charAt(i);
- }
- System.out.println(s);
- }
- }
★字符串去重
①放入Set集合中
- import java.util.HashSet;
- import java.util.Set;
-
-
-
-
- public class Demo6 {
- public static void main(String [] args){
- String str = "AABCDAEFE";
- Set set = new HashSet();
- for (int i=0,l=str.length();i<l;i++){
- set.add(str.charAt(i));
- }
- System.out.println(set.toString());
- }
- }
②循环判断
- import java.util.ArrayList;
- import java.util.List;
-
-
-
-
- public class Demo7 {
- public static void main(String[]args){
- String str = "AABCDAEFE";
- List<String> list = new ArrayList<String>();
- for (int i = 0,len=str.length();i<len;i++){
- if (!list.contains(String.valueOf(str.charAt(i)))){
- list.add(String.valueOf(str.charAt(i)));
- }
- }
- System.out.println(list.toString());
- }
- }
3.StringBuffer、StringBuilder (append)(初始化容量为16字符)
·与String相比特点:★长度可变
★可以存储不同基本数据类型
★可以对字符串进行修改(append,delete,insert,replace)
·StringBuffer:线程安全
·StringBuilder:单线程
4.Collection 集合类(add)(Vector和ArrayList 初始化容量为10)
·特点:★存储对象,不可以存储基本数据类型
★长度可变
·Collection
··List(有序、元素有角标、元素可重复)指的是存入和取出的顺序一致:特有方法可操作角标的方法 Iterator it = list.iterator()
···Vector : list接口大小可变数组的实现,包括null,是同步的,所以查询速度相对较慢(被sychronized修饰)
···ArrayList : list接口大小可变数组的实现,包括null,不同步的,数组有角标,所以查询速度快
···LinkedList: list的链接列表的实现, 包括null, 不同步的,链表实现所以增删速度快
··Set(无序、元素不可重复)
···HashSet : 包括null, 不同步的,基于哈希表(实际上是HashMap 实例)(开辟一个原有4/3大小的集合,默认16)
····LinkedHashSet
5.Map
·Map<Key,Value> :an object that maps keys to values,key 不能重复。一个key最多映射一个value
·HashMap :哈希表的实现,允许空键和空值,是不同步的
·Hashtable :哈希表的实现 ,非空对象可以作为键或者值,同步的
·Properties
·treeMap :二叉树的底层实现,可用于给Map集合中键进行排序
★map的几种遍历方法
- package com.raipeng.work.container;
-
- import java.util.*;
-
-
-
-
- public class ListTest {
- public static void main(String [] args){
- Map<Integer,String> map = new HashMap();
- map.put(1,"abc");
- map.put(2,"def");
-
- Set<Integer> keySet = map.keySet();
- for (Integer key :keySet){
- System.out.println("key:"+key+"value:"+map.get(key));
- }
- Iterator<Integer> it = keySet.iterator();
- while (it.hasNext()){
- Integer key =it.next();
- System.out.println(key+map.get(key).toString()+"");
- }
-
- Set<Map.Entry<Integer,String>> entry = map.entrySet();
- for (Map.Entry<Integer,String> en:map.entrySet()){
- System.out.println("key:"+en.getKey()+"value:"+en.getValue());
- }
- Iterator<Map.Entry<Integer,String>> iterator = entry.iterator();
- while (iterator.hasNext()){
- Map.Entry<Integer,String> entry1 = iterator.next();
- Integer key = entry1.getKey();
- String value = entry1.getValue();
- System.out.println("key"+key+"value"+value);
- }
- }
- }