`
jianchen
  • 浏览: 344871 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java基础复习(17)--字符串,集合,I/O

阅读更多

读取properties 文件时出现乱码


如果properties文件里含有中文时不可以用ResourceBundle度取,需先对properties文件进行编码转换
在JDK中提供了native2ascii命令 他能够实现字符编码的转换。
假设message.properties 文件在目录WEB-INF/resource目录下
在命令行模式下进入WEB-INF/resource目录,然后执行如下命令
native2ascii –encoding utf-8 message.properties message_zh_CN.properties
参数-encoding表示要转换成的编码格式
执行以上命令以后将生成message_zh_CN.properties文件 现在就可以用ResourceBundle类进行读取了


mutual exclusion---互斥


Hashtable和HashMap都实现了Map接口。
Hashtable继承Dictionary类。

Properties prop = System.getProperties();
    Enumeration en = prop.propertyNames();
    while(en.hasMoreElements()){
        String key = (String)en.nextElement();
        System.out.println(key+"="+prop.getProperty(key));
    }

 

字符串
字符串是常量,他们的值在创建之后就不可以改变了。

String s = "abc";
String b = s;
s = s+"d";
System.out.println(b);//abc
System.out.println(s);//abcd

 

String h = new String("test");
String h1 = new String("test");
 

以上两句代码产生了三个 "test"字符串对象。两个位于堆里,一个位于字符串常量池中。

 

问题:

public static void main(String[] args) {
        String s = "abc";
        change(s);
        System.out.println(s);

        s = test(s);
        System.out.println(s);
    }

    static void change(String str) {
        str = "abcdefg";
    }

    static String test(String str) {
        str = "abcdefg";
        return str;
    }
 

打印输出:
abc
abcdefg


分析:
change方法:
切记,java中是值传递。在change方法中,str是在栈中的一个变量,它一开始和s指向的是同一
个string,即“abc”,在change方法中,str又指向了新的对象,这根本不关s的事。所以s指向的
仍然是“abc”

test方法:
s重新指向了字符串常量池中的另一个字符串,所以打印出“abcdefg”

String s = "abc";
s = s+'d';
System.out.println(s);//输出abcd
 

分析:string可以直接和char做+运算 。今天才知道。


正则表达式不能嵌套表达


摘自jdk doc
public final class Patternextends Objectimplements Serializable正则表达式的编译表示形式。 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

因此,典型的调用顺序是

 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();
 

在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句

 boolean b = Pattern.matches("a*b", "aaaaab");//等效于上面的三个语句,尽管对于重复的匹配而言

 

它效率不高,因为它不允许重用已编译的模式
此类的实例是不可变的,可供多个并发线程安全使用 。Matcher 类的实例用于此目的则不安全。

习题:
从键盘输入字符串,回车后按单词反转

 

 Scanner sc = new Scanner(System.in);
        LinkedList<String> list = new LinkedList<String>();
        String str = sc.nextLine();
        String[] arr = str.split(" ");
        for(int i=arr.length-1;i>=0;i--)
            list.add(arr[i]);
        for(String s : list){
            System.out.print(s);
            System.out.print(" ");
 

给你一组字符串:iu2ier343dfjsd,让你编程输出里面的数字。

 Scanner sc = new Scanner(System.in);
        String str = sc.next();
        //System.out.println(str);
        Pattern p = Pattern.compile("(\\d)");
        Matcher m = p.matcher(str);
        while(m.find()){
             System.out.println(m.group(0));
        }

 

列出目录和文件:

public class PrintFiles {

    public static void main(String[] args) {
        int level = 0;
        print(new File("D:\\ipMsg"), 0);
    }

    public static void print(File f, int level) {
        if (f.isDirectory() == false) {
            printSpace(level);
            System.out.println("[文件]:" + f.getAbsolutePath());
        } else {
            File[] farr = f.listFiles();
            printSpace(level);
            System.out.println("[文件夹]:" + f.getAbsolutePath());
            for (File file : farr) {
                print(file, level + 1);
            }
        }
    }

    public static void printSpace(int count) {
        for (int i = 0; i < count; i++) {
            System.out.print("--");
        }
    }
}

 

HashSet探究

HashSet内部使用到了HashMap。
当你调用HashSet的add方法将对象添加到集合中去时,根据add的返回值判断添加是否成功。

实则是以下操作:

public boolean add(E e) {
             return map.put(e, PRESENT)==null;
//Present是一个私有静态不可变的成员变量,private static final Object PRESENT = new Object();
    }
 

继续查看,map的put方法是如何实现的:

public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }
 

分析:

hashMap的put方法,与集合中的Entry一一比较。先判读对象的hashcode是否相等,相等后再调用equals。

static int hash(int h) {    
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }
 

上面这段代码不知用意何在,对于移位一直都感到头疼啊。有人研究出来的通知声哈。
然后后面的indexFor方法也很抽象呢。如何能保证取得索引的唯一性?


补充:
HashMap 是以数组的结构,用哈希函数值跟数组的长度做位与运算,获取对应数组的索引。浏览key值时,不保证顺序。


LinkedHashMap 是以双向列表的结构做实现的,浏览key值时候,可以保证顺序。

LinkedHashMap继承HashMap ,不同的是数据存储结构。


TreeMap 是以二叉树实现的Map接口。Map中的key值按照从小到大的顺序排列。key要实现comparable


同学问我一个问题,做个笔记哈:

Set<Object> set = new TreeSet<Object>();
set.add("dsaf");
set.add(“22”);
set.add(3);
System.out.println(set.toString());

 

分析:

编译没有问题,但是在执行到set.add(3);就出现了类型转换异常,因为TreeSet在加入对象时,会将该对象和已有对象进行比较,从而找 到该对象应该存放的位置。加入到该TreeSet中的对象应该实现Comparable接口的compareTo方法,会将新添加的对象和已有元素一一进 行比较,但是Integer的compareTo方法传进来的参数类型是Integer,但已有的却是String类型的实例,所以将string转换为 Integer当然出现了问题。


I/O流概述

 

概念:
1,为进行数据的输入/输出操作,java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表
述为“流”(stream)
2,Stream是从起源(source)到接收(sink)的有序数据
3,java.io包中定义了多个流类型(类和抽象类)来实现输入/输出功能
4,两种基本的流:输入流和输出流
--输入流:只能从中读取字节数据,而不能向其写出数据
--输出流:只能向其写入字节数据,而不能从中读取数据
5,按照流所处理的数据类型划分,可以分为:
字节流:用于处理字节数据
字符流:用于处理Unicode字符数据

节点流和处理流
处理流:实现对一个已存在的流的连接和封装 ,通过所封装的流的功能调用实现数据读写功能的流。处理流也被称为高级流。


flush(),立即刷新输出缓冲区

FileOutputStream的write(int b)的写入效果:
该方法是native的,无法看到源代码,应该是将int的低字节或高字节写到了文件中。经测试发现写入的是int的低8位。如128写入后十六进制表示为80,255写入后为FF,256写入后为00传进去的是int,但是写入的确是个字节,不过和read()方法倒是对称,读出的是个字节,但返回的却是int

特殊的文件输出流
RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或者插入数据
同时实现了DataInput和DataOutput接口,所以可以用它来读写文件

压缩文件可以直接调用winrar来压缩,也可以利用已有的api来实现压缩。

分享到:
评论

相关推荐

    Java复习---思考题

    Java 复习资料中的思考题涵盖了Java的基础知识,包括JDK的含义、Java跨平台技术、垃圾收集机制、J2SE、J2ME、J2EE的区别、包的作用、J2SE类库的主要包以及Java编程规范和程序结构。下面将详细解答这些知识点。 1. ...

    Java基础考试复习资料

    6. **字符串处理**:String类是Java中的核心类,用于处理字符串。了解其不可变性、常用方法(如length()、charAt()、substring()、indexOf()等)以及StringBuilder或StringBuffer类的使用。 7. **异常处理**:Java...

    Java基础复习

    10. **输入输出流**:Java的I/O流系统广泛应用于文件读写、网络通信。InputStream和OutputStream是所有字节流的基类,而Reader和Writer则是所有字符流的基类。 11. **集合框架**:ArrayList、LinkedList、HashSet、...

    在一个以知的字符串中截取满足一定条件的字符串

    - **字符串**:是由零个或多个字符组成的有序集合。 - **子字符串**:是原字符串中的连续字符序列。 #### 2.2 .substring() 方法 `.substring()` 是 Java 和其他许多编程语言中提供的内置方法之一,用于从字符串中...

    Java基础尚硅谷宋红康学习笔记

    6. **字符串处理**:String类在Java中扮演重要角色,提供了丰富的字符串操作方法,如concat、substring、indexOf、replace等。 7. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口可以创建...

    JAVA基础复习资料

    7. **第七章:字符串与输入输出** String类的常用方法,以及I/O流的概念,包括文件读写、网络流和数据流。 8. **第八章:多线程** 理解并发编程的基本原理,线程的创建与同步,包括synchronized关键字、Thread类...

    硅谷java基础每日复习eDiary

    在“硅谷java基础每日复习eDiary”这个资源中,我们涵盖了Java编程语言的基础和高级概念,这将有助于深入理解并提升Java编程技能。以下是基于描述中提到的两个文件——"Java基础每日复习笔记-JavaSE基础阶段.edf"和...

    java 考试资料--第七组

    1. `JAVA复习题201004.xls`:这可能是一个2010年4月的Java复习题目集合,可能包含了选择题、填空题、简答题等多种题型,用于帮助考生复习Java的基础知识和进阶概念,如类与对象、继承、多态、异常处理、集合框架、IO...

    Java复习提纲-2009-5.doc

    Java中的字符串由String类表示,String对象不可变,可以使用多种方法进行操作,如获取长度、比较字符串等。 基本数据类型还可以通过其对应的包装类(如Integer、Double等)进行封装,实现与String之间的转换。控制...

    java面试复习资料

    - **Java NIO**(New I/O):提供了一种基于缓冲区和通道的新I/O操作方式,支持非阻塞I/O操作,提高了I/O操作的效率。 #### 八、字符流与字节流的区别 - **字符流**:适用于处理文本数据,一次处理一个字符。 - **...

    各个公司的java笔试题---book

    4. **IO与NIO**:Java的输入输出流体系是处理数据传输的基础,而NIO(非阻塞I/O)在高性能网络编程中尤为重要。考生需熟悉流的概念、缓冲区操作、文件读写、套接字编程等。 5. **多线程与并发编程**:Java提供了...

    Java复习有所有j2se的基础知识总结

    本篇文章将深入探讨Java复习中关于J2SE的基础知识,特别是字符串处理相关的概念。 字符串在Java中扮演着至关重要的角色。Java提供了三种主要的字符串类:String、StringBuffer和StringBuilder。理解它们之间的区别...

    JAVA复习题目.pdf

    本文档为《JAVA复习题目.pdf》,主要内容是关于Java编程语言的复习题目,旨在帮助学习者巩固和加深对Java基础知识的理解。文档中涉及了Java的关键概念,包括Java的基本语法、面向对象的特性、Java的Applet小程序以及...

    Java-study 复习java.zip

    Java API提供了大量预先定义好的类和方法,涵盖了数学运算、字符串处理、日期时间、网络通信等多个方面。 12. **Java开发工具** - **JDK(Java Development Kit)**:包含了Java编译器、JVM和开发所需的工具。 -...

    java考试复习资料

    - `toString()`: 返回对象的字符串表示形式。 - `wait()`, `notify()`, `notifyAll()`: 支持多线程同步控制。 - `clone()`: 实现对象的浅拷贝。 - `getClass()`: 获取对象所属的类。 #### 二十二、Java中的...

    Java编程基础(2011-2012学年第一学期)复习提纲.doc

    ### Java编程基础知识点详解 #### 第一章 Java 语言概述 **1. Java 平台的工作机制** Java 是一种能够跨平台运行的语言。其工作机制基于“编写一次,到处运行”的理念。具体而言,Java 源代码文件(.java 文件)...

    《java语言程序设计第十版》复习题全答案下载英文

    《Java语言程序设计第十版》是一本广泛使用的Java编程教材,涵盖了从基础语法到高级特性的全面内容。这本书的复习题全答案提供了学习者检验自我理解、深化编程技能的宝贵资源。以下是对每个章节主要知识点的详细概述...

    java程序语言设计第十版复习题答案

    5. **字符串与字符串处理**:String类在Java中扮演着重要角色,复习题可能包含字符串的创建、比较、拼接、查找、替换等操作。同时,StringBuffer或StringBuilder的使用也是常见的考点。 6. **输入/输出流**:Java的...

    java期末复习题

    根据给定的文件信息,我们可以总结出一系列与Java编程语言相关的知识点,这些知识点涵盖了Java的基础概念、语法特性、数据类型、运算符、流操作、事件处理、容器组件、类的声明以及字符串操作等方面。 1. **Java...

    Java期末复习资料

    2. **填空题**:填空题可能会涉及到语法细节,例如异常处理(try-catch-finally),字符串操作,数组和集合框架的使用,以及方法重载和覆盖的概念。此外,还可能包括线程同步(synchronized关键字)和并发编程的基础...

Global site tag (gtag.js) - Google Analytics