个人博客
www.tothefor.com
蓝桥杯复习知识点汇总
本文着重说一下可能会用到的数据类型。
Java的两大数据类型:内置数据类型、引用数据类型。
八种基本类型。
六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
例子:byte a = 100,byte b = -50。
例子:short s = 1000,short r = -20000。
例子:int a = 100000, int b = -200000。
例子: long a = 100000L,long b = -200000L。
例子:float f1 = 234.5f。
例子:double d1 = 123.4。
例子:boolean one = true。
例子:char letter = ‘A’。
实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
也可以用String输入后再转换为char数组。
String s = cin.readLine();
char[] ch = new char[100];
ch = s.toCharArray();
//示例1
Scanner Scin = new Scanner(System.in);
char ch = Scin.next().charAt(0); //qwer
System.out.println(ch); //q
//示例2
char ch = Scin.next().charAt(3); //qwerasdf
System.out.println(ch); //r
char[] ch = new char[50];
String s = Scin.next(); //qwer
ch = s.toCharArray();
System.out.println(ch); //qwer
就记录一下坑吧。
先看代码:
char[] ch = new char[50];
String s = Scin.next(); //qwerasdf
ch = s.toCharArray();
System.out.println("s = :" + s); //s = :qwerasdf
System.out.println("ch = :" + ch); //ch = :[C@2b193f2d
System.out.println(ch); //qwerasdf
解释
可以看见,最后两行输出同一个数组,但输出却不一样。这是因为调用的输出方法不一样。
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(char x[]) {
synchronized (this) {
print(x);
newLine();
}
}
可以看见,两次调用的方法是不一样的。这是println方法的重载问题导致的。第一次调用的方法的参数是String类型,第二次调用的方法的参数是char[]数组类型的。这是因为第一次中的 “ch = :” 把数组转换成了字符串String类型了。
| 符号 | 字符含义 |
|---|---|
| \n | 换行 (0x0a) |
| \r | 回车 (0x0d) |
| \f | 换页符(0x0c) |
| \b | 退格 (0x08) |
| \0 | 空字符(0x0) |
| \s | 字符串 |
| \t | 制表符 |
| \" | 双引号 |
| \’ | 单引号 |
| \\ | 反斜杠 |
| \ddd | 八进制字符 (ddd) |
| \uxxxx | 16进制Unicode字符 (xxxx) |
针对八种基本数据类型定义相应的引用类型 — 包装类(封装类)。
| 基本数据类型 | 包装类 | |
|---|---|---|
| byte | Byte | 父类 :Number |
| short | Short | |
| int | Integer | |
| long | Long | |
| float | Float | |
| double | Double | |
| boolean | Boolean | |
| char | Character |
实例:
public class NewJavaTest {
public static void main(String[] args) {
int i=120;
Integer ie = new Integer(i);
System.out.println(ie.toString());
Integer it = new Integer("12345"); //必须为数字的字符串
// s = "456789";
//Integer it = new Integer(s);
//输出 456789
System.out.println(it.toString());
// Integer it2 =new Integer("123abc"); //不能加字母,否则运行时会出错
// System.out.println(it2.toString());
}
}
//输出
120
12345
其他的类型用法同样的原理。
实例:
public class NewJavaTest {
public static void main(String[] args) {
Integer it = new Integer(13);
int i = it.intValue();
System.out.println(i+1);
}
}
//输出
14
由于基本数据类型与包装类之间可以自动转换,所以这里就把包装类和基本数据类型当成一种来和 String 之间进行转换。
int num = 10;
String str = num + "";
//输出
10
float fl = 12.3f;
double db = 23.5;
String str = String.valueOf(fl);
String str1 = String.valueOf(db);
System.out.println(str);
System.out.println(str1);
//输出
12.3
23.5
public class NewJavaTest {
public static void main(String[] args) {
String str = "234"; //不能写非数字字符
int num = Integer.parseInt(str);
System.out.println(num+1);
String str2 = "true"; //只有写true输出才为true,其他的都为false,写1也为false
boolean fl = Boolean.parseBoolean(str2);
System.out.println(fl);
}
}
//输出
235
true

JDK 5.0 新特性。
基本数据类型转换成包装类。
可以理解成,小的转换成大的叫装箱。(这里的小、大表示的是谁包含谁)
实例:
public class NewJavaTest {
public static void main(String[] args) {
int num = 10;
Integer it = num;
System.out.println(it);
}
}
//输出
10
包装类转换成基本数据类型。
可以理解成,大的转换成小的叫拆箱。(这里的小、大表示的是谁包含谁)
实例:
public class NewJavaTest {
public static void main(String[] args) {
Integer it = 12;
int itt = it;
System.out.println(itt);
}
}
//输出
12
Java字符串String是不可变对象。字符串操作不改变原字符串内容,而是返回新字符串。
- 两个字符串比较,总是使用equals()方法。== 比较的是两个的地址。
- 忽略大小写比较(
equalsIgnoreCase())
String s1="abcdefghijklmnopkrstuvwxyz"
String s2="ABCDEFGHIJKLMNOPKRSTUVWXYZ"
boolean flag=s1.equalsIgnoreCase(s2)
contains())String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.contains("bc"));
System.out.println(s.contains("bd"));
//输出
true
false
startsWith())String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.startsWith("abc"));
System.out.println(s.startsWith("bcd"));
//输出
true
false
endsWith())String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.endsWith("wxy"));
System.out.println(s.endsWith("xyz"));
//输出
false
true
indexOf()),没有找到返回-1String s = "abcdabcedaaq";
System.out.println(s.indexOf("bc"));
System.out.println(s.indexOf("fgh"));
//输出
1
-1
lastIndexOf())String s = "abcdbcq";
System.out.println(s.lastIndexOf("bc"));
System.out.println(s.lastIndexOf("fgh"));
//输出
4
-1
substring())String s = "abbcccdddd";
System.out.println(s.substring(2)); //从下标2开始
System.out.println(s.substring(1,5)); //从下标1到下标5(不包括5),即[1,5)
//输出
bcccdddd
bbcc
trim())。空白字符包括空格,\t,\r,\n:String s = " fw few ewf we q qwf ";
System.out.println(s.length());
System.out.println(s);
s = s.trim();
System.out.println(s.length());
System.out.println(s);
//输出
23
fw few ewf we q qwf . //!!!并没有点号,只是为了方便看尾部的空格才手动加上的
20
fw few ewf we q qwf.
" \tHello\r\n ".trim(); // "Hello"
strip())。它和trim()不同的是,类似中文的空格字符\u3000也会被移除。"\u3000Hello\u3000".strip(); // "Hello"。
" Hello ".stripLeading(); // "Hello "。移除字符串首部的空白符
" Hello ".stripTrailing(); // " Hello"。移除字符串尾部的空白符
判断字符串是否为 空(isEmpty())和空白字符串(isBlank())
"".isEmpty(); // true,因为字符串长度为0
" ".isEmpty(); // false,因为字符串长度不为0
" \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符
替换子串(replace()),返回一个新字符串。
String s = "abcbabca";
String s1 = s.replace('a','t');//tbcbtbct,所有的字符a都被替换为t
String s1 = s.replace("ab","tttt"); //ttttcbttttca,所有的子串ab都被替换为tttt
正则表达式替换:
String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D",把匹配的子串统一替换为","
split(),其中表达式就是一个正则表达式。返回的是一个字符串数组。
- 特殊情况(斜线
\)
String s = "ab\\cd\\ef\\g\\h";
String[] s1 = s.split("\\\\"); //以 \ 为分割线
System.out.println(s);
int len=s1.length;
for(int i=0;i<len;++i){
System.out.println(s1[i]);
}
- 需要加双斜线的:
+、*、$、^、
String s = "ab+cdef+gh";
String[] s1 = s.split("\\+");
String s = "ab*cdef*gh";
String[] s1 = s.split("\\*");
String s = "ab$cdef$gh";
String[] s1 = s.split("\\$");
String s = "ab^cdef^gh";
String[] s1 = s.split("\\^");
//输出
ab
cdef
gh
- 其他
String s = "ab,cde,fgh";
String[] s1 = s.split(",");
//输出
ab
cde
fgh
- 多个符号作为分隔符,使用多个分隔符则需要借助
|符号
String s = "ab,c+de@fgh";
String[] s1 = s.split(",|\\+|@"); //以逗号、加号、@为分隔符,之间用或(|)
拼接字符串使用静态方法join(),它用指定的字符串连接字符串数组。返回一个字符串。
String s = "ab,c+de@fgh";
String[] s1 = s.split(",|\\+|@");
System.out.println(s);
int len=s1.length;
for(int i=0;i<len;++i){
System.out.println(s1[i]);
}
System.out.println("===============================");
String s3 = String.join("****",s1);
System.out.println(s3);
//输出
ab,c+de@fgh
ab
c
de
fgh
===============================
ab****c****de****fgh
若链接失效,请直接搜索🔍
- 其他类型转字符(String.valueOf()),返回一个字符串。
int n = 15;
String nns = Integer.toString(n);
System.out.println(Integer.toString(n));
boolean fl = false;
System.out.println(Boolean.toString(fl)); //false
int a = 2123;
String resu = String.valueOf(a);
System.out.println(resu);
boolean flag = true;
resu = String.valueOf(flag);
System.out.println(resu);
double f = 23.4324;
resu = String.valueOf(f);
System.out.println(resu);
- 字符串转其他类型
//整数字符串转整数
String s = "123456";
int nn = Integer.valueOf(s);
System.out.println(nn+100); //123556
System.out.println(Integer.valueOf(s));//123456
String sint = "123456";
int resu = Integer.parseInt(sint);
int re = Integer.parseInt(sint,11); //194871 把字符串里的数字当成11进制数,再转换为10进制。
System.out.println(resu); //123456
resu+=10;
System.out.println(resu); //123466
//boolean字符串转布尔值
String sbool = "true";
boolean fresu = Boolean.parseBoolean(sbool);
if(fresu) {
System.out.println("YES");
}
else {
System.out.println("NO");
}
//YES
//浮点数字符串转浮点数
String sdouble = "13.324";
double resu2 = Double.parseDouble(sdouble);
System.out.println(resu2); //13.324
要特别注意,Integer有个getInteger(String)方法,它不是将字符串转换为int,而是把该字符串对应的系统变量转换为Integer。例如:
Integer.getInteger("java.version"); // 版本号,11
- 将整数格式化为指定进制的字符串
System.out.println(Integer.toString(100)); // "100",表示为10进制
System.out.println(Integer.toString(100, 36)); // "2s",表示为36进制
System.out.println(Integer.toHexString(100)); // "64",表示为16进制
System.out.println(Integer.toOctalString(100)); // "144",表示为8进制
System.out.println(Integer.toBinaryString(100)); // "1100100",表示为2进制
//或者
System.out.println(Integer.toString(100, radix)); // 将100转换为radix进制的字符串
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String
如果修改了char[]数组,String并不会改变。因为通过new String(char[])创建新的String实例时,它并不会直接引用传入的char[]数组,而是会复制一份,所以,修改外部的char[]数组不会影响String实例内部的char[]数组,因为这是两个不同的数组。
但两者的使用是没有区别的。所以,会用其一即可。但由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
StringBuilder 是一个可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。
StringBuilder strB = new StringBuilder();
//1、append(String str)/append(Char c):字符串连接
System.out.println("StringBuilder:"+strB.append("ch").append("111").append('c'));
//return "StringBuilder:ch111c"
//2、toString():返回一个与构建起或缓冲器内容相同的字符串
System.out.println("String:"+strB.toString());
//return "String:ch111c"
//3、appendcodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this
System.out.println("StringBuilder.appendCodePoint:"+strB.appendCodePoint(2));
//return "StringBuilder.appendCodePoint:ch111c"
//4、setCharAt(int i, char c):将第 i 个代码单元设置为 c(可以理解为替换)
strB.setCharAt(2, 'd');
System.out.println("StringBuilder.setCharAt:" + strB);
//return "StringBuilder.setCharAt:chd11c"
//5、insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)
System.out.println("StringBuilder.insertString:"+ strB.insert(2, "LS"));
//return "StringBuilder.insertString:chLSd11c"
System.out.println("StringBuilder.insertChar:"+ strB.insert(2, 'L'));
//return "StringBuilder.insertChar:chLLSd11c"
//6、delete(int startIndex,int endIndex):删除起始位置(含)到结尾位置(不含)之间的字符串
System.out.println("StringBuilder.delete:"+ strB.delete(2, 4));
//return "StringBuilder.delete:chSd11c"
示例:
StringBuilder sb = new StringBuilder("tothefor");
System.out.println(sb);
sb.append(".com"); // append(String str)/append(Char c)
System.out.println(sb);
String mid = sb.toString(); // toString()
System.out.println(mid);
sb.insert(1,"www.");//insert(int offset, String str)/insert(int offset, Char c)
System.out.println(sb);
sb.delete(1,5);//delete(int startIndex,int endIndex) [startIndex,endIndex)
System.out.println(sb);
sb.setCharAt(1,'w');//setCharAt(int i, char c)
System.out.println(sb);
sb.appendCodePoint(65); //ASCII码65是大写的A
System.out.println(sb);
//输出
tothefor
tothefor.com
tothefor.com
twww.othefor.com
tothefor.com
twthefor.com
twthefor.comA
String ss = "abcder";
StringBuilder sbs = new StringBuilder(ss); //String转换为StringBuffer
StringBuilder resbs = sbs.reverse();
String news = resbs.toString(); //StringBuffer转换为String
System.out.println(news);
基本原则:
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
字符串来说的,要求一个字符串的长度就要用到它的length()方法;数组来说的,要求数组的长度可以用其 length 属性;集合说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我